How to Create Your Own Nuclei Template: Part 1 (Indonesia Version)

Muhammad Daffa
6 min readMar 18, 2022

--

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

Gambar 1: Statistik repository nuclei-templates

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.

Gambar 2: Logo 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.

Gambar 3: Basic nuclei template

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.

Gambar 4: Tulisan basic-template akan muncul sebagai output nuclei
  • 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:

  1. info (Untuk informasi-informasi yang tidak berbahaya)
  2. low (Biasanya untuk template open redirect)
  3. medium (Biasanya untuk template reflected XSS)
  4. high (Biasanya untuk template SQL injection, stored XSS)
  5. critical (Biasanya untuk template RCE, authentication bypass, dll)
  6. unknown (Ini termasuk severity yang baru)
Gambar 5: Severity akan muncul sebagai output di nuclei
  • 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

Gambar 6: Contoh requests 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.

Gambar 7: Variable dan value

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

Gambar 8: POST method dilengkapi dengan header dan body
  • 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

Gambar 9: Contoh body jika linenya lebih dari 1

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=test
test 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.

Gambar 10: Contoh matcher
  • 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/htmldan 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:

  1. Status
  2. Word
  3. Regex
  4. DSL

Mari kita bahas satu-persatu

  1. Status Type

Untuk mengecek HTTP response status code. Contohnya seperti pada gambar 11. Yang berarti response dari website harus 200.

Gambar 11: Contoh matcher dengan status code 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

Gambar 12: Contoh matcher dengan type word

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.

Gambar 12: Contoh matcher dengan type 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

Gambar 13: Contoh matcher di body
  • 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: Testdan 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

--

--

Muhammad Daffa

ID/EN. Write anything related to cyber security (Bug Bounty, Penenetration Testing, Malware Analysis, etc.)