NSE: Mesin Lua di Dalam Nmap
NSE menanamkan interpreter Lua ke dalam nmap. Setiap skrip adalah berkas .nse yang mendeklarasikan kapan jalan (rule) dan apa yang dilakukan (action). Kemampuan bersama hidup di nselib — http, ssh, unpwdb, smbauth — sehingga skrip baru dibangun dari blok yang teruji.
Rule memakai shortport (mis. shortport.http = 80/443/8080 atau service http). Satu skrip = satu rule; action dipanggil untuk setiap pasangan host/port yang lolos. Konsekuensinya: skrip portrule tak akan jalan pada port yang nmap anggap closed/filtered — pastikan -p eksplisit.
ls /usr/share/nmap/scripts/ | wc -l # 600+ berkas .nse grep 'wordpress' /usr/share/nmap/scripts/script.db Entry { filename = "http-wordpress-enum.nse", categories = { "discovery", "intrusive" } } nmap --script-updatedb # setelah menambah skrip sendiri
Sintaks Pemilihan Skrip — Bahasa Lengkapnya
Semua cara memilih & mengendalikan skrip dari baris perintah. Kuasai tabel ini dan seluruh 600+ skrip menjadi milikmu tanpa menghafal satu per satu.
| Sintaks | Arti | Contoh |
|---|---|---|
| -sC | Jalankan kategori default | nmap -sC -p22,80 target |
| -sV | Memicu skrip kategori version otomatis | nmap -sV -p3306 target |
| --script KATEGORI | Satu/daftar kategori | --script default,safe |
| --script SKRIP,SKRIP | Daftar skrip spesifik | --script http-title,http-headers |
| --script 'http-*' | Wildcard — semua skrip berawalan http- | --script 'http-*' -p80 |
| --script "ekspresi" | Boolean: and / or / not / all | --script "not (dos or exploit)" |
| --script /path/x.nse | Berkas skrip langsung (tanpa updatedb) | --script ~/nse/lab-banner.nse |
| --script-args k=v,k2=v | Argumen inline, dipisah koma | --script-args path=/login.php |
| --script-args-file f | Argumen dari berkas (kamus panjang) | --script-args-file brute.txt |
| --script-help SKRIP | Tampilkan description + usage | --script-help http-brute |
| --script-trace | Tampilkan semua trafik yang dikirim skrip | debugging & audit jejak |
| --script-timeout 60s | Batas waktu per skrip | wajib utk fuzzer/brute |
| --script-updatedb | Perbarui index script.db | setelah menambah skrip |
| grep script.db | Cari skrip per kata kunci | grep oracle script.db |
Wildcard 'http-*' dan boolean "not (dos or exploit)" berisi karakter yang dibaca shell — selalu beri kutip, atau shell akan meng-expansi sendiri sebelum sampai ke nmap.
13 Kategori — Kertas Izin Setiap Skrip
Kategori adalah kontrak perilaku. default jalan via -sC, version via -sV; sisanya dipanggil eksplisit. Klik kartu — warna risiko menyatakan seberapa keras skrip 'berbicara' ke target.
--script all menjalankan SEMUA kategori termasuk dos dan exploit. Bahkan di lab, panggil per kategori/skrip agar dampak terkendali dan output terbaca.
Bedah Sebuah .nse — Klik Setiap Bagian
lab-banner.nse — skrip asli yang bisa dijalankan (Bab 08). Klik segmen untuk membaca perannya; setiap bagian wajib ada pada skrip yang sah.
Skrip + Argumen = Perintah Lengkap
Pilih skrip, isi argumennya — builder menyusun perintah final dengan meter risiko dan catatan konteks. Kasus unggulan: http-brute pada login DVWA (path=/login.php, uservar=username, passvar=password).
Database Skrip Terurat
Dipilih dari 600+ bawaan: relevan untuk lab KALI/SANA, dikelompokkan per layanan. Filter grup, cari kata kunci, salin perintah. Kartu beraksen kiri sesuai risiko: hijau aman · amber menengah · magenta berat.
Motor Kredensial Bawaan: unpwdb & login
Kategori brute memakai library login + kamus unpwdb. Kuatnya di lab: kredensial default & enumerasi awal. Lemahnya: lebih lambat dari hydra dan minim tuning.
# kamus bawaan nmap: /usr/share/nmap/nselib/data/usernames.lst /usr/share/nmap/nselib/data/passwords.lst # 1. kredensial default / anonymous DULU (cepat, senyap): nmap -p21 --script ftp-anon 172.16.20.201 nmap -p3306 --script mysql-empty-password 172.16.20.201 nmap -p80 --script http-default-accounts 172.16.20.201 # 2. brute terkontrol — kamus pendek + timeout: nmap -p80 --script http-brute \ --script-args path=/login.php,uservar=username,passvar=password \ --script-timeout 120s 172.16.20.201 # DISIPLIN: hanya unit milikmu · kamus 50–200 entri · selalu --script-timeout
Brute hanya terhadap unit yang ditugaskan, dengan kamus pendek, sesuai tahapan instruktur. Di dunia nyata, brute massal = pelanggaran + pasti membangunkan SOC (auth.log & fail2ban — lihat Bab 09).
Dari Nol ke lab-banner.nse — Empat Langkah
- Simpan berkas skrip
mkdir -p ~/nse && nano ~/nse/lab-banner.nse
Tidak harus di folder bawaan — nmap menerima path langsung.
- Tulis isi skrip (salin dari Bab 04)
Struktur minimal: description · categories · rule · action. Lib: http, shortport, stdnse.
- Uji tanpa jaringan
nmap --script-help ~/nse/lab-banner.nse
Error Lua & metadata muncul di sini — sebelum satu paket dikirim.
- Jalankan ke unit-mu
nmap -p80 --script ~/nse/lab-banner.nse 172.16.20.20X
Permanen: salin ke /usr/share/nmap/scripts/ lalu --script-updatedb.
http (get/post/header) · shortport · stdnse · unpwdb+login · smbauth · target. Sumber belajar terbaik: kode 600+ skrip bawaan & nmap.org/book/nse.
Penyerang Skrip = Penyerang yang Meninggalkan Tanda Tangan
Skrip HTTP NSE membawa UA eksplisit: Nmap Scripting Engine. Mudah dipalsukan — tapi pola volume keluarga skrip tidak bisa disembunyikan.
| Keluarga Skrip | Artefak di Log | Bentuk Sinyal |
|---|---|---|
| http-* enum/title | Ratusan GET path unik + UA NSE | Distribusi path per IP per menit |
| http-brute | POST berulang ke path sama | Count POST per IP — jail form login |
| ssh-brute | Failed password beruntun (auth.log) | Jail sshd maxretry 4 |
| db brute (mysql/mongo) | Lonjakan koneksi ke port DB dari 1 IP | Koneksi DB dari IP non-aplikasi = kuat |
| dns-zone-transfer | named: transfer rejected | Satu AXFR dari IP asing = investigasi |
| vuln-*/exploit-* | Error 5xx, payload mencurigakan, crash | Lonjakan 5xx + signature WAF/IDS |
| broadcast-* (prerule) | Nol di log target | Hanya sensor pasif segmen yang melihat |
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"RECON NSE user-agent"; flow:established,to_server; http.user_agent; content:"Nmap Scripting Engine"; sid:1000010; rev:1;)
title: NSE HTTP enumeration
logsource:
product: apache
service: access
detection:
sel_ua:
cs_user_agent|contains: "Nmap Scripting Engine"
condition: sel_ua1) UA NSE → catat IP sumber. 2) Korelasi: IP yang sama melakukan SYN scan? 3) Kategori skrip menentukan severitas: http-title senyap vs smb-vuln-* pra-eksploitasi — responsnya berbeda jauh.
- --script-trace — lihat apa yang benar-benar dikirim tiap skrip sebelum mengklaim senyap.
- Sebagian skrip menerima argumen UA — memalsukan label mudah; pola path beruntun tetap.
- Batasi kategori: default,safe menghasilkan <10% trafik kategori vuln/intrusive.
- --script-timeout mencegah satu skrip macet membanjiri target.
- Realitas: NSE yang jujur sensor-ramah — canary path & baseline menjadi pertahanan terakhir.
Staging NSE: Aman → Berat
- Versi dulu — kategori version otomatis
nmap -sV -T4 --open 172.16.20.20X -oA recon/nse/v0X
- Default + safe pada port terpilih
nmap -sV --script default,safe -p 22,80,443 172.16.20.20X
- Discovery spesifik — wildcard HTTP
nmap -p80 --script 'http-*' --script-timeout 60s 172.16.20.20X
Wildcard menyentuh kategori berat juga — timeout wajib; persempit bila perlu.
- Vuln check — pra-analisis
nmap -sV --script vuln -p 80,443 172.16.20.20X -oA recon/nse/vuln0X
Output: kandidat CVE — bukan izin eksploitasi.
- Auth — terakhir, terkontrol
nmap -p21,80,3306 --script ftp-anon,http-default-accounts,mysql-empty-password 172.16.20.20X