# COMPFEST Attack & Defense Technical Details
## Struktur
### Terminologi
- Service: Aplikasi dari challenge yang berjalan di suatu server.
- Tick: Satuan waktu dari permainan.
- Patch: Operasi melakukan perubahan dari service untuk meng-update runtime service.
- Flag Stolen: Seberapa banyak flag yang sudah diambil oleh tim lain pada sebuah service.
- Flag Captured: Seberapa banyak flag yang diambil dari tim lain pada sebuah challenge.
- JWT: Token yang digunakan sebagai penanda otorisasi dari tim.
- SLA: Reabilitas dari service.
### Aturan
- Kompetisi akan dimulai dari pukul 09.00 hingga 15.00 WIB.
- Selama kompetisi berlangsung, setiap tim **dilarang**:
- Bekerja sama dengan tim lain dalam bentuk apapun.
- Menggunakan automated scanner/tools seperti sqlmap, burp scanner, dirb, dan lain-lain. Setiap challenge dapat di-solve tanpa menggunakan automated scanner/tools.
- Menyebabkan suatu kerugian atau gangguan dalam bentuk apapun terhadap peserta lain maupun panitia, seperti namun tidak terbatas pada:
- Menghapus/mengganti file flag,
- Melakukan DDOS pada service atau platform,
- Melakukan bruteforce flag pada platform, dan lain-lain.
- Tim yang terindikasi melakukan pelanggaran atau kecurangan akan diberikan sanksi (diskualifikasi atau pengurangan poin).
- Flag baru akan di-generate pada semua service tiap tick.
- Flag yang disubmit hanya valid pada satu tick, yaitu pada tick ketika flag tersebut di-generate.
- Durasi dari suatu tick adalah 5 menit, sehingga kompetisi akan berjalan selama 72 tick.
- Checker akan melakukan cek ke setiap service setiap menit, dengan waktu timeout 20 detik.
## General Flow
Secara umum, berikut adalah flow tiap tim pada sesi kompetisi:
- Setiap tim akan diberikan beberapa service beserta IP address, port, dan attachment files-nya masing-masing.
- IP dan port yang diberikan adalah milik service tim sendiri dan juga service tim lain.
- Untuk melakukan attack, tim harus mendapatkan flag dengan melakukan eksploitasi pada service tim lain.
- Flag yang didapat dari service milik tim sendiri tidak akan berpengaruh pada Flag Captured, Flag Stolen, maupun skor.
- Defense dapat dilakukan menggunakan fitur `Manage Service`.
- Untuk membuka fitur `Manage Service` sebuah service, tim tersebut **harus** melakukan submit flag yang didapat dengan melakukan eksploitasi pada **service-nya sendiri sebanyak satu kali.**
## Scoring
Scoring dibagi menjadi tiga, yaitu:
- Attack
- Defend
- SLA
### Attack
Scoring dari atribut attack untuk satu flag adalah seperti berikut:
$$attackScore = \sum_{i=1}^{nflags} ATK(i)$$
Dimana:
- $nflags$ = jumlah flag yang berhasil di-capture oleh tim
- $ATK(i)$ = nilai poin untuk flag ke-$i$ berdasarkan urutan submission
- $i$ = urutan flag yang di-submit (1, 2, 3, ...)
Nilai $ATK(i)$ ditentukan berdasarkan tabel berikut:
| Range Submission | Nilai ATK(i) |
|------------------|--------------|
| 1 ≤ i ≤ 141 | 10.0 |
| 142 ≤ i ≤ 223 | 5.0 |
| 224 ≤ i ≤ 335 | 3.33 |
| 336 ≤ i ≤ 447 | 2.5 |
| 448 ≤ i ≤ 559 | 2.0 |
| 560 ≤ i ≤ 671 | 1.66 |
| 672 ≤ i ≤ 783 | 1.42 |
| 784 ≤ i ≤ 895 | 1.25 |
| 896 ≤ i ≤ 1008 | 1.11 |
| i > 1008 | 1.0 |
### Defense
Scoring dari atribut defense menggunakan formula berikut:
$$defenseScore = nTeamSolved \times \sum_{i=1}^{nTicks} (DEF \times isNotStolen_i)$$
**Penjelasan Variabel:**
- $nTeamSolved$ = jumlah tim yang sudah solve challenge tersebut
- $nTicks$ = jumlah tick yang sudah berjalan (current tick)
- $DEF$ = konstanta defense point = 10.0
- $isNotStolen_i$ = status flag pada tick ke-$i$
**Nilai $isNotStolen_i$:**
- $isNotStolen_i = 1$ jika flag **tidak dicuri** pada tick ke-$i$
- $isNotStolen_i = 0$ jika flag **dicuri** pada tick ke-$i$
### SLA
SLA mengukur reliabilitas service dari suatu tim dengan formula:
$$SLA = \frac{passedChecks}{totalChecks}$$
**Penjelasan Variabel:**
- $passedChecks$ = jumlah checker result dengan status `VALID`
- $totalChecks$ = jumlah total checker result (`VALID` + `FAULTY`)
**Status Checker:**
- `VALID` = Service berjalan dengan baik dan dapat diakses
- `FAULTY` = Service bermasalah atau tidak dapat diakses
### Total Score
Total score untuk setiap tim dihitung dengan menggabungkan attack score, defense score, dan SLA menggunakan formula:
$$totalScore = \sum_{j=1}^{nChallenges} [(attackScore_j \times SLA_j) + (defenseScore_j \times SLA_j)]$$
## Platform Manual
API specs pada platform dapat dilihat pada link berikut:
http://ristek.link/COMPFEST17-AnD-Manual