How to Create Your Own Nuclei Template: Part 1 (Indonesia Version)
Perkenalkan nama saya Muhammad Daffa, seorang mahasiswa di salah satu kampus di Surabaya. Sekarang saya sedang bekerja part time sebagai vulnerability researcher di salah satu perusahaan cybersecurity di Dubai. Dan saya juga menjadi top contributor di repositori nuclei-templates. Saya harap dengan adanya post ini teman-teman yang menggeluti di bidang cybersecurity bisa berkontribusi di open source project, khususnya nuclei
Di post kali ini, saya akan membahas tentang bagaimana cara membuat custom template untuk tools vulnerability scanner bernama nuclei. Buat yang belum tahu nuclei, yuk berkenalan dengan nuclei.
Nuclei adalah vulnerability scanner yang ditulis menggunakan bahasa Go dan banyak sekali digunakan oleh bug hunter, penetration tester, security engineer, dan lain-lain. Nuclei juga termasuk open source project yang source codenya bisa di akses disini.
Jadi teman-teman yang memiliki keahlian programming khususnya bahasa Go bisa berkontribusi di repository diatas. Untuk menggunakan nuclei ini diperlukan YAML template dan terdapat publik repositori yang dibuat oleh tim projectdiscovery yang berisikan template-template untuk nuclei.
Di repositori tersebut terdapat banyak sekali jenis template yang ada. Seperti template untuk mencari CVE, template untuk mencari miskonfigurasi pada server, dan bahkan terdapat juga template untuk mengecek kevalidan API key yang ditemukan saat melakukan pentest.
Contoh template yang paling sederhana memiliki struktur seperti pada gambar 3 ini.
Mari kita bahas satu-persatu bagiannya.
- ID
Di setiap nuclei template ini memiliki unique ID masing-masing. ID ini akan ditampilkan sebagai output di nuclei, contohnya seperti pada gambar 4.
- Info
Di block info ini berisi mengenai informasi dari template yang akan kita buat, seperti name, author, severity, description, reference, dan tags
- Name
Di bagian name berisi nama template yang akan kita buat, menurut saya pribadi lebih baik untuk penamaan template dibuat seperti ini
nama_produk versi_yang_terdampak - jenis_bug
Sebagai contoh, saya menggunakan template CVE-2020–29395
Wordpress Plugin EventON Calendar 3.0.5 - Reflected Cross-Site Scripting
Namun, kembali lagi jenis template yang akan dibuat
- Author
Di bagian author berisi nama pembuat template, saya sendiri menggunakan nama daffainfo untuk setiap template yang saya buat
- Severity
Di bagian severity berisi tingkat kerentanan sebuah template yang akan dibuat, di repositori nuclei-templates ada 6 severity yang dipakai:
- info (Untuk informasi-informasi yang tidak berbahaya)
- low (Biasanya untuk template open redirect)
- medium (Biasanya untuk template reflected XSS)
- high (Biasanya untuk template SQL injection, stored XSS)
- critical (Biasanya untuk template RCE, authentication bypass, dll)
- unknown (Ini termasuk severity yang baru)
- Description
Di bagian description berisi deskripsi singkat template yang akan dibuat. Description ini tidak wajib ditambahkan ke template.
- Tags
Di bagian tags berisi custom tag yang akan ditambahkan ke template. Jika masih bingung, tags ini berisi kata kunci mengenai template yang akan dibuat. Sebagai contoh CVE-2021-44228, CVE yang membuat geger blue team di bulan Desember 2021. Jadi tags yang pas untuk CVE tersebut adalah:
apache,log4j,rce,cves,cve2021
- Requests
Di block requests ini berisi HTTP request yang akan dikirim ke target. Contohnya pada gambar 6 merupakan HTTP request yang sangat sederhana
- Method
Di bagian method berisi HTTP requests methods seperti GET, POST, PUT, PATCH, dan method-method lainnya.
- Path
Di bagian path berisi request path, seperti contoh diatas:
method: GET
path:
- '{{BaseURL}}/test'
Contoh diatas sama saja seperti kita mengakses /test
GET /test HTTP/1.1
Host: example.com
Mungkin ada yang bingung tentang {{BaseURL}}. Di nuclei ada variable-variable untuk request. Agar tidak bingung contohnya seperti ini.
Terus bagaimana jika kita ingin membuat template yang di requestnya dibutuhkan body atau header-header tertentu? Terdapat headers dan body
Gambar 8 adalah contoh request POST method dan terdapat body dan custom header
- Headers
Berisi header-header yang akan digunakan pada requests. Sebagai contoh, Di gambar 8 saya menggunakan 2 header yaitu Content-Type
dan Cookie
- Body
Berisi body yang akan digunakan pada requests. Sebagai contoh, di gambar 8 memiliki body untuk memanggil perintah whoami di parameter cmd.
Request pada gambar 8 adalah contoh jika body hanya memiliki 1 line saja, bagaimana jika kita ingin merequest body yang memiliki banyak line? Maka bentuknya akan seperti ini
Jika divisualisasikan dalam bentuk HTTP request, requestnya akan seperti ini:
POST /shell.php HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Cookie: testing=testtest line 1
test line 2
test line 3
- Matcher
Untuk matcher, jenisnya ada banyak. Namun untuk di post ini saya akan jelaskan yang dasar-dasar terlebih dahulu.
- Matcher Condition
Matcher condition adalah conditional statement apakah, valuenya hanya ada 2 yaitu: AND atau OR. Menggunakan AND jika ingin kondisi-kondisi dibawah harus terpenuhi semua. Dan menggunakan OR jika hanya ingin salah satu kondisi saja yang terpenuhi.
Sebagai contoh pada gambar 10, saya menggunakan AND karena ingin semua kondisinya terpenuhi, seperti status nya harus mereturn code 200. Kemudian headernya harus memiliki kata-kata Set-Cookie
dan text/html
dan bodynya harus match dengan regex.
Beda cerita jika saya menggunakan OR. Jika saat menggunakan template diatas. Kemudian jika website mengeluarkan HTTP response code 200m tetapi header dan body tidak memenuhi syarat. Maka template tersebut tetap dianggap valid.
- Matchers
Ada 4 macam type untuk matchers:
- Status
- Word
- Regex
- DSL
Mari kita bahas satu-persatu
- Status Type
Untuk mengecek HTTP response status code. Contohnya seperti pada gambar 11. Yang berarti response dari website harus 200.
2. Word Type
Untuk mengecek kata-kata tertentu di bagian response. Contohnya ada seperti gambar 12. Berarti di response website (header atau body) harus mengandung kata-kata Body 1
3. Regex Type
Kurang lebih sama seperti Words Type, namun bisa menggunakan regex untuk melakukan pengecekan. Contohnya seperti gambar 12. Berarti response website harus match / sesuai dengan regex.
4. DSL
Akan dibahas di post-post yang akan datang
Bagaimana jika ingin mencocokkan word/regex di body atau header? Bagaimana jika kata-katanya yang ingin dicocokkan lebih dari satu? Terdapat Part dan Condition
- Part
Part ini ada jenis header dan body. Sebagai contoh diatas, valuenya adalah header. Yang berarti kata-kata Set-Cookie: Test
dan text/html
harus ada di response header. Jika valuenya adalah body, maka kata-kata tersebut harus ada di bagian response body
Part ini hanya bisa digunakan di Word Type & Regex Type
- Condition
Condition ini seperti namanya, kondisi dan ada 2 jenis yaitu AND dan OR. Langsung saja ke contoh diatas. terdapat 2 words, yaitu Set-Cookie: Test
dan text/html
Menggunakan AND karena 2 words ini wajib ada di header response. Jika saya menggunakan OR, semisal hanya ada Set-Cookie: Test
di header namun tidak ada text/html
maka tetap dianggap valid
Condition ini bisa digunakan di Status, Word, Regex, dan DSL
Sekian post kali ini mohon maaf jika ada salah kata, ditunggu part-part selanjutnya :D