Satu teknik, dua sudut pandang. Bab demi bab membedah reconnaissance dari kursi penyerang — dan dari kursi analis SOC yang menatap log-nya. Dipayungi MITRE ATT&CK TA0043, dilengkapi matriks deteksi (Suricata · Zeek · Sigma · fail2ban), hardening, dan lab terintegrasi di mana kamu bermain dua peran sekaligus.
Setiap intrusi serius dimulai dari hal yang sama: seseorang menonton sebelum menyentuh. Dalam Cyber Kill Chain Lockheed Martin, reconnaissance adalah mata rantai pertama. Dalam kerangka MITRE ATT&CK, ia menjadi taktik resmi bernomor TA0043 — dan karena tertata rapi sebagai teknik (T15xx), taktik ini menjadi bahasa bersama antara tim merah yang melakukannya dan tim biru yang harus mendeteksinya.
Buat penyerang: checklist sistematik agar tak ada permukaan yang terlewat. Buat SOC: indeks cakupan deteksi — teknik mana yang sudah termonitor, mana yang gelap. Bab 12 menutup buku ini dengan matriks purple-team yang mengikat keduanya.
Recon yang sama dibaca dua kalangan dengan pertanyaan berbeda. Penyerang bertanya "apa yang bisa kumanfaatkan?". SOC bertanya "aktivitas apa yang seharusnya memicu kecurigaan, dan apakah aku bisa melihatnya?". Ebook ini menaruh keduanya berdampingan — panel merah untuk penyerang, panel cyan untuk defender. Gunakan tombol LENS di bilah atas untuk membaca dari satu sudut pandang saja.
| Sudut | Yang Wajib Dikuasai | Metrik Sukses |
|---|---|---|
| Offensive | Peta → fingerprint → kandidat. Dan mendokumentasikan tiap langkah untuk laporan. | Semakin lengkap peta, semakin sedikit kejutan di fase eksploitasi. |
| Defensive | Inventaris sumber log → aturan deteksi → tuning false positive → hardening. | MTTD (mean time to detect) pendek; cakupan teknik ATT&CK tinggi. |
| Purple | Setiap teknik serangan dipetakan ke deteksi + hardening, diuji ulang berkala. | Matriks cakupan naik; temuan red ditemukan blue tanpa diumumkan. |
Tools melaporkan "open/filtered", tapi pemahaman datang dari bit di dalam paket. Lima hal ini wajib mantap sebelum melanjutkan.
# KONEKSI NORMAL: klien → SYN "mau bicara?" server → SYN-ACK "boleh, siapkan koneksi" klien → ACK "terhubung" ← handshake selesai, log aplikasi tercatat # SYN SCAN (-sS): klien → SYN server → SYN-ACK ← port TERBUKA (cukup satu balasan untuk tahu) klien → RST ← langsung putus; koneksi tak pernah established # PORT TERTUTUP: server membalas RST — juga informasi berharga!
| Flag | Makna | Pemanfaatan Recon |
|---|---|---|
| SYN | Permintaan koneksi | Probe paling umum — basis -sS & TCP ping |
| ACK | Pengakuan data | Memetakan aturan firewall (stateful vs stateless) |
| FIN / PSH / URG | Penutup / dorong / urgen | Kombinasi aneh (Xmas) untuk mengelabui firewall lawas |
| RST | Paksa putus | Jawaban port tertutup; "sinyal" yang dibaca scanner |
| — | Tanpa flag (Null) | Paket kosong — kontrasnya terlihat jelas di IDS |
Domain hanyalah nama; rekaman DNS (A/NS/MX/TXT) yang memetakan layanan nyata. Port adalah nomor kontrak: 22 SSH, 80/443 HTTP(S), 53 DNS — daftar lengkap ada di CHEATSHT-01. Keduanya menjadi target utama Bab 4–6 dan objek deteksi Bab 9.
Setiap anomali di bab-bab selanjutnya (SYN tanpa ACK, banyak 404, query AXFR) berasal dari fondasi ini. Kalau kamu paham kenapa paket itu "aneh", aturan deteksinya menulis dirinya sendiri.
Pasif berarti bertanya ke pihak ketiga — target tak menerima satu paket pun. Untuk penyerang ini fase termurah dan tersenyap; untuk defender, ini fase yang paling sering dilupakan karena tidak ada log yang bisa dibaca — yang bocor bocor di luar jaringanmu. Satu-satunya pertahanan: kelola apa yang dipublikasikan.
whois abdurrozak.my.id # pemilik, nameserver, umur dig +short dvwa1.abdurrozak.my.id # domain → IP unit dig axfr abdurrozak.my.id @ns1.abdurrozak.my.id # uji zona transfer curl -s "https://crt.sh/?q=%25.abdurrozak.my.id&output=json" \ | jq -r '.[].name_value' | sort -u # subdomain via CT log theHarvester -d abdurrozak.my.id -b duckduckgo -l 50
site:abdurrozak.my.id intitle:"index of" — directory listing, berkas backup, panel lupa disembunyikan.allow-transfer { none; }; — AXFR hanya boleh ke secondary yang sah.Defense pasif bukan memantau log — melainkan menjalankan recon yang sama terhadap dirimu sendiri (EASM — External Attack Surface Management, Bab 10 & 12). Kalau crt.sh bisa menemukan subdomain yang kamu lupa, penyerang juga bisa.
Fase aktif pertama: siapa hidup, apa yang terbuka. Setiap flag di kolom merah di bawah punya padanan di kolom biru — karena setiap paket yang keluar dari mesin penyerang berpotensi diserap sensor di jalurnya.
nmap -sn 172.16.20.20X # 1. hidup? (ICMP/ARP) nmap -Pn 172.16.20.20X # 2. ICMP difilter? paksa nmap -sS -T4 172.16.20.20X # 3. SYN scan cepat nmap -sV -T4 --open 172.16.20.20X -oA recon/unit0X # 4. versi + arsip nmap -sF -sX -sN 172.16.20.20X # 5. FIN/Xmas/Null — cek firewall
-Pn menghidupkan host yang "pura-pura mati".conn.log proto=icmp & sensor ICMP.detection_filter lebih mudah.Rate bisa dikecilkan (Bab 7), tapi rasio satu-sumber-ke-banyak-tujuan tak bisa disembunyikan oleh scan yang jujur. Seluruh bab deteksi dibangun di atas dua pilar: volume abnormal dan rasio abnormal.
Port terbuka hanyalah pintu; aplikasi di baliknya yang bercerita. Di fase ini banner SSH, header Apache, dan perilaku 404 web server menjadi sumber intel — dan, bagi SOC, sumber sinyal yang sangat kaya karena log aplikasi selalu terekam.
curl -sI http://dvwa1.abdurrozak.my.id # header: Server, X-Powered-By whatweb http://dvwa1.abdurrozak.my.id # fingerprint stack gobuster dir -u http://dvwa1… \ -w /usr/share/wordlists/dirb/common.txt -x php,txt,bak -t 30 wpscan --url http://wp1.abdurrozak.my.id --enumerate u,t,p curl -s http://wp1…/wp-json/wp/v2/users | jq # user WP tanpa login nc -nv 172.16.20.20X 22 # banner SSH — lalu Ctrl+C
Apache/2.4.57, PHP/8.2.7) → cocokkan ke CVE.setup.php DVWA, xmlrpc.php WP, /wp-json — permukaan khas lab & CMS.gobuster/3.6, wpscan, nikto — sinyal murah; mudah dipalsukan penyerang, jadi jadikan korelasi bukan satu-satunya.Did not receive identification string from … — jejak khas nc banner-grab port 22 yang putus sebelum bicara.Satu 404 adalah lalu lintas; 50 beruntun dari satu IP dalam 1 menit adalah enumerasi. Kuncinya bukan status individual melainkan distribusinya per sumber per waktu — persis yang diformalkan jadi rule di Bab 9 dan fail2ban di Bab 10.
Penyerang yang baik tahu aturan deteksi standar — dan bermain di bawah ambangnya. Bab ini diarahkan dua arah: memahami teknik senyap (untuk mengujinya di lab, atas unit sendiri) dan mengapa setiap teknik tetap meninggalkan bentuk jejak lain.
| Teknik Senyap | Perintah (konsep) | Kenapa Bisa Selamat | Padanan Jejak bagi Blue |
|---|---|---|---|
| Low & slow | -T1 · --scan-delay 10s | Volume/detik di bawah ambang rate-based | NetFlow: rasio 1→banyak tetap terlihat di jendela 24 jam |
| Decoy | -D RND:5 | Paket tampak datang dari beberapa IP palsu | Paket spoofed tak pernah melihat balasan; log menangkap inkonsistensi |
| Fragmentasi | -f · --mtu 24 | Flag terpecah antar fragmen | IDS modern menyusun ulang fragmen (stream reassembly) |
| Idle scan | -sI zombie | IP penyerang tak muncul sama sekali | Pola polling aneh di host zombie — temuan tersendiri |
| Proxy/TOR | proxychains nmap … | Sumber diganti | Reputasi IP keluar TOR/proxy = sinyalnya itu sendiri |
| UA rotasi | gobuster -a … | User-Agent dipalsukan | 404-bertuntun per IP tetap — pola > label |
Di lab, uji evasion hanya pada unit yang ditugaskan dan sering bersama asisten sebagai latihan purple. Evasion terhadap sistem pihak lain tanpa izin adalah tindakan ilegal, bukan "skill lanjutan".
Sebelum menulis satu pun aturan, SOC wajib tahu siapa yang mencatat apa. Ini inventaris sumber telemetri untuk target semacam unit lab — tiap barisnya akan dipakai ulang oleh matriks deteksi di Bab 9.
| Sumber | Isi | Menangkap Teknik | Batasannya |
|---|---|---|---|
| Apache/nginx access.log | IP, metode, path, status, UA | Dir brute, wpscan, dork-driven GET | Tidak melihat TLS (443 terenkripsi kecuali terminasi) |
| auth.log (sshd) | Login, kegagalan, banner-anomali | Brute force, banner grab | Hanya setelah TCP tersambung ke SSH |
| Firewall log | Izinkan/tolak per aturan | SYN ke port tertutup, sweep | Bising; butuh tuning agar tak jadi gondok |
| Suricata (NIDS) | Alert berbasis aturan + metadata | Scan flags, AXFR, filter by rate | Butuh jam tuning & versi rule |
| Zeek (NSM) | conn/http/dns/arp log netral | Semua pola level-7 tanpa rule | Data mentah — butuh korelasi/SIEM |
| NetFlow/IPFIX | Siapa↔siapa, port, volume | Semua pemindaian — immune terhadap slow scan | Tanpa payload; konten tak terlihat |
| fail2ban / PSAD | Aksi ban otomatis + log | Brute, scan port | Reaktif per-host, bukan visi jaringan |
| arpwatch / Zeek arp | Pemetaan MAC↔IP | ARP sweep | Hanya segmen lokal |
"Apakah IP sumber ini milik scanner keamanan kita (jadwal vuln-scan), bulus, atau tak dikenal?" — Asset & jadwal scanning internal yang terdokumentasi menghemat 80% waktu triase; sisanya benar-benar menarik.
Inti buku ini. Setiap baris: teknik serangan → bukti log mentahnya → aturan deteksi siap pakai → hardening penutup lubang. Klik baris untuk membuka detail. Semua aturan berformat Suricata (NIDS) atau Sigma (portabel lintas SIEM) — salin dan uji di lab-mu.
Setiap aturan di atas akan memicu false positive dari scanner internal dan monitoring sah. Kecualikan IP scanner resmi, dokumentasikan jendela vuln-scan, dan ukur noise seminggu sebelum menaikkan prioritas alert.
Sigma adalah "YAML untuk deteksi" — sekali menulis, dikonversi ke Elastic/Splunk/QRadar via sigmac. Contoh untuk brute direktori:
title: Web Directory Bruteforce Pattern status: experimental logsource: product: apache service: access detection: sel_status: status: |403|404| # jawaban "tidak ada/dilarang" condition: sel_status | count() by client_ip > 50 timeframe: 1m # ambang: 50 gagal/menit/src falsepositives: - scanner keamanan internal (kecualikan IP-nya) tags: - attack.reconnaissance - attack.t1595.003
Deteksi adalah jaring pengaman; hardening adalah menghilangkan sasaran. Filosofinya: setiap bit yang tak perlu diekspos adalah bit yang tak perlu dideteksi. Empat front utama:
# /etc/apache2/conf-available/security.conf ServerTokens Prod # "Server: Apache" saja — tanpa versi ServerSignature Off TraceEnable Off # matikan metode TRACE # php.ini expose_php = Off # buang header X-Powered-By # /etc/nginx/nginx.conf server_tokens off;
Server: Apache/2.4.57 (Debian) + X-Powered-By: PHP/8.2.7 → Server: Apache. Dua versi yang tadi mempercepat pemilihan CVE kini hilang — penyerang dipaksa menebak, dan tebakan memakan waktu & memicu noise.
# /etc/bind/named.conf.options options { allow-transfer { none; }; # ATAU daftar IP secondary saja version "unknown"; # jangan bocorkan versi BIND recursion no; # bila bukan resolver internal };
# /etc/fail2ban/jail.local [sshd] enabled = true maxretry = 4 findtime = 10m bantime = 1h [apache-404] # jail custom utk dir-brute enabled = true filter = apache-404 # regex: status 404 per IP logpath = /var/log/apache2/access.log maxretry = 40 · findtime = 1m · bantime = 30m # uji: fail2ban-client status sshd
backup.zip memikat di web root — yang mengunduhnya membunyikan bel.Bab ini adalah jantung purple-team ebook ini. Kamu akan menyerang unit yang ditugaskan ke kelompokmu (bukan milik orang lain!), lalu berpindah kursi membaca lognya. Loop lengkapnya: serang → terekam → deteksi → harden → uji ulang.
mkdir -p purple/&&cd purple/ nmap -sS -T4 172.16.20.20X # 1: SYN scan → amati! nc -nv 172.16.20.20X 22 # 2: banner grab putus paksa gobuster dir -u http://dvwaX.abdurrozak.my.id \ -w /usr/share/wordlists/dirb/common.txt -t 30 # 3: dir brute
# di unit target (ssh [email protected]): grep 'Did not receive identification' /var/log/auth.log Did not receive identification string from 172.16.20.Y ↑ jejak langkah 2 — IP sumbermu sendiri! awk '$9==404 {print $1}' /var/log/apache2/access.log | sort | uniq -c 54 172.16.20.Y ↑ jejak langkah 3 — 54 x 404 dari satu IP = pola brute tail -n 5 /var/log/apache2/access.log | grep gobuster "GET /setup.php HTTP/1.1" 200 … "gobuster/3.6" ↑ UA gobuster terlihat — mudah, tapi mudah dipalsukan: ingat Bab 7
# di unit target: rapikan banner (Bab 10), lalu dari attacker: curl -sI http://dvwaX.abdurrozak.my.id | grep -i 'server\|powered' # SEBELUM: Server: Apache/2.4.57 (Debian) · X-Powered-By: PHP/8.2.7 # SESUDAH: Server: Apache (versi lenyap → hardening terbukti) # opsional — pasang suricata di unit & lihat alertmu sendiri: apt install suricata -y && tail -f /var/log/suricata/fast.log
Jalankan Langkah A ke unit-mu. Catat timestamp tiap aksi — timestamp adalah kunci join saat membaca log.
Langkah B. Untuk tiap temuan, isi tabel: aksi → berkas log → baris bukti. Tiga contoh di atas harus kamu reproduksi.
Langkah C + satu jail fail2ban. Buktikan dengan before/after.
Serahkan matriks purple (Bab 12) milik unit-mu: teknik yang sudah punya deteksi vs yang masih gelap.
Seluruh serangan di bab ini diarahkan ke 172.16.20.20X milik kelompokmu. Menyentuh unit lain = pelanggaran scope — dan di dunia nyata, pidana.
Setiap teknik serangan wajib punya jawaban di kolom deteksi & hardening. Kolom status diisi setelah pengujian ulang — inilah cara tim mengukur kemajuan secara jujur:
| Teknik (ATT&CK) | Bukti Serangan | Deteksi | Hardening | Status |
|---|---|---|---|---|
| T1595.001 Sweep | nmap -sn | Suricata ICMP filter | Rate-limit ICMP | TERDETEKSI |
| T1595.001 SYN scan | nmap -sS | flags:S + detection_filter | Default-deny + PSAD | TERDETEKSI |
| T1596.002 WHOIS/AXFR | dig axfr | — (pasif, tanpa log) | allow-transfer none | DIHARDEN |
| T1595.003 Dir brute | gobuster | Sigma 404-count + fail2ban | limit_req, canary path | TERDETEKSI |
| T1592.002 Banner/versi | curl -I, nc | auth.log ident-string | ServerTokens Prod | SEBAGIAN |
| T1593.002 Dork/EASM | crt.sh, dork | Monitor CT log sendiri | Kebersihan sertifikat & subdomain | GELAP |
PENYERANG MENGUKUR LOBANGMU. SOC MENGUKUR KACA SPIONAGENYA. TIM MATANG MENGUKUR KEDUANYA DI TABEL YANG SAMA.