Skip to content

Web Reconnaissance & Enumeration Cheatsheet

Updated:

Pendahuluan

Reconnaissance dan Enumeration adalah dua tahap awal yang sangat penting dalam kegiatan offensive security, seperti penetration testing, bug hunting, dan red teaming.

Hasil dari recon dan enum ini menjadi dasar untuk aktivitas selanjutnya, mulai dari eksploitasi hingga eskalasi.

Berikut beberapa alasan mengapa kegiatan ini krusial:

  1. Menentukan Attack Surface
    Tanpa informasi awal seperti domain, subdomain, dan IP, arah serangan menjadi tidak jelas.

  2. Efisiensi Eksploitasi
    Dengan informasi yang akurat, kita bisa langsung fokus pada celah potensial tanpa membuang waktu pada hal-hal yang tidak relevan.

  3. Mencegah Target Terlewat
    Banyak celah tidak ditemukan bukan karena teknik yang salah, melainkan karena target tidak terdeteksi sejak awal.

  4. Dasar untuk Langkah Berikutnya
    Tahap seperti eksploitasi, pivoting, atau eskalasi sangat bergantung pada hasil recon dan enum.

Artikel ini sengaja saya tulis sebagai catatan online pribadi mengenai proses recon dan enum pada target web, yang mungkin juga bermanfaat bagi pembaca.

Artikel ini bersifat seperti live document, sehingga akan terus saya perbarui seiring berjalannya waktu.

Cheatsheet

Catatan:

  • Sebelum menggunakan cheatsheet ini, pastikan konfigurasi API pada setiap tool sudah dilakukan.
  • Perbedaan versi pada tool dapat menyebabkan perbedaan hasil dan perintah yang digunakan.

1. Menyiapkan Folder Proyek

Terminal
# 1. Membuat direktori proyek dengan format {tahun}/{target}
mkdir -p 2025/target.com
cd 2025/target.com
# 2. Membuat direktori untuk hasil recon dan enum
mkdir subdomains
mkdir ports
mkdir dirs

2. Root Domain

Terkadang target memliki lebih dari satu domain selain domain utamanya.

Terminal
# 1. Masuk ke direktori subdomains
cd subdomains
# 2. Melihat ASN dan IP publik berdasarkan nama organisasi
# Catatan: Periksa manual output file, terkadang tidak ada hasil
amass intel -org "{nama_organisasi}" -o asn.txt -config /opt/Tools/OSINT/amass/config.yaml
# 2.1. Alternatif (lebih cepat)
# Akses: https://bgp.he.net/ --> https://bgp.he.net/ASXXXX#_prefixes
# 3. Jika sudah tahu ASN-nya, cari semua domain/infrastruktur berdasarkan ASN
amass intel -asn "{asn}" -o asn-subnet.txt -config /opt/Tools/OSINT/amass/config.yaml
# 3.1. Alternatif (lebih cepat)
# Akses: https://ipinfo.io/ASXXXXX (login)
# Simpan list subnet di subnets.txt
# 4. Cari ASN berdasarkan domain:
# Catatan: Bisa dilakukan jika domain tidak menggunakan WAF
dig +short target.com
# 4.1. Hasil IP, lalu:
curl https://ipinfo.io/{ip}/json
# 5. Melihat informasi dasar domain
whois {IP}
# 5.1. Jika butuh histori domain (sebelum era regulasi privasi seperti GDPR)
# Akses: https://whois-history.whoisxmlapi.com/

3. Subdomain Enumeration

Terminal
# 1. Buat variabel untuk root domain
domain='target.com'
# 2. Dapatkan subdomain dengan OSINT
## 2.1. subfinder
subfinder -d "$domain" -o domain-ip-subfinder.txt -active -ip
awk -F"," '{print $1}' domain-ip-subfinder.txt > domain-subfinder.txt
awk -F"," '{print $2}' domain-ip-subfinder.txt > ip-subfinder.txt
## 2.2. amass
amass enum -d "$domain" -active -oA domain-ip-amass -config /opt/Tools/OSINT/amass/config.yaml
sed 's/\x1B\[[0-9;]*[mK]//g' domain-ip-amass.txt | grep -Eo "([a-zA-Z0-9_-]+\.)+${domain}" | sort -u > domain-amass.txt
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' domain-ip-amass.txt | sort -u > ip-amass.txt
grep -oE '([0-9a-fA-F:]{3,39})' domain-ip-amass.txt | grep ':' | sort -u > ip6-amass.txt
# 3. Dapatkan subdomain dengan brute-force (gobuster >= 3.8.0)
gobuster dns --do "$domain" -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -o domain-ip-brute.txt --resolver 1.1.1.1 --delay 100ms --timeout 5s
sed 's/\x1B\[[0-9;]*[mK]//g' domain-ip-brute.txt | awk '{print $1}' | sort -u > domain-brute.txt
sed 's/\x1B\[[0-9;]*[mK]//g' domain-ip-brute.txt | awk '{print $2}' | tr ',' '\n' | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort -u > ip-brute.txt
sed 's/\x1B\[[0-9;]*[mK]//g' domain-ip-brute.txt | awk '{print $2}' | tr ',' '\n' | grep ':' | sort -u > ip6-brute.txt
# 4. Gabungkan semua subdomain dan ip
cat domain-amass.txt domain-brute.txt domain-subfinder.txt | sort -u > all-subdomains.txt
cat ip-amass.txt ip-brute.txt ip-subfinder.txt | sort -u > all-ip.txt
# 5. Generate permutasi dari semua subdomain
dnsgen all-subdomains.txt > permutations-temp.txt
cat all-subdomains.txt permutations-temp.txt | sort -u > permutations.txt
rm permutations-temp.txt
# 6. Validasi hasil permutation dengan DNS resolver
dnsx -l permutations.txt -o valid-subdomains.txt -stats -silent -r 1.1.1.1
echo "$domain" >> valid-subdomains.txt

4. Port Scanning

Terminal
# 1. Masuk ke direktori ports
cd ../ports
# 2. Melakukan pasif scanning port (shodan)
## Catatan: Karena nrich tidak menggunakan token API, jika terlalu banyak dan cepat akan terkena limit
cat ../subdomains/all-ip.txt | xargs -I{} -n1 sh -c 'echo {} | nrich -; sleep 2' > shodan-ips.txt
xargs -n1 prips < ../subdomains/subnets.txt | xargs -I{} sh -c 'echo {} | nrich -; sleep 2' > shodan-asn.txt
xargs -n1 prips < ../subdomains/subnets.txt | nrich - > shodan-asn.txt
# 3. Melakukan aktif scanning port (pastikan bukan IP WAF)
# 3.1. Naabu
echo "ASXXXX" | naabu -top-ports 100 -o naabu-asn.txt # ASN
naabu -l ../subdomains/all-ip.txt -top-ports 100 -o naabu-ips.txt
# 3.2. Nmap
nmap -p- -oN {ip/domain}-allports.nmap {ip/domain} -vv
nmap -sV -sC --script vuln -p{specific_port} -oN {ip/domain}.nmap {ip/domain} -vv
# 3.2. Nessus (manual)

5. Filtering Live Domains (HTTP)

Terminal
# 1. Melihat list server web yang aktif pada subdomains
cat ../subdomains/valid-subdomains.txt | httpx -o http.txt -title -status-code -tech-detect
# 2. Melihat list server web yang aktif pada IPs
cat ../subdomains/all-ip.txt | httpx -o http-ip.txt -title -status-code -tech-detect
# 3. Melihat list server web yang aktif pada subnet ASN
xargs -n1 prips < ../subdomains/subnets.txt | httpx -o http-asn.txt -title -status-code -tech-detect
# 4. Mengabungkan list server web yang aktif
cat http-asn.txt http-ip.txt http.txt | sort -u > http-all.txt
awk '{print $1}' http-all.txt > http-all-clean.txt
# 5. Screenshot semua halaman utama server web
gowitness scan file -f http-all-clean.txt

6. WAF Detection

Terminal
# 1. Masuk ke direktori dirs (buat direktori baru jika ada banyak target)
cd ../dirs
# 2. Deteksi WAF
wafw00f https://target.com/ | tee waf.txt

6.1. Bypass WAF via Origin IP

Web Application Firewall (WAF) berfungsi sebagai lapisan pertahanan terdepan dari aplikasi web. Tugasnya memfilter request berbahaya seperti SQLi, XSS, dan command injection sebelum mencapai server aslinya (origin).

Namun, proteksi ini hanya efektif jika semua traffic dipaksa melewati WAF. Kalau ternyata server origin masih bisa diakses langsung, maka WAF bisa dilewati (bypass).

Berikut beberapa pendekatan yang bisa dicoba untuk menemukan IP origin:

Jika berhasil ditemukan, arahkan domain ke IP tersebut di /etc/hosts:

Terminal
echo "203.0.113.50 target.com" | sudo tee -a /etc/hosts
curl -i http://target.com

6.2. Security Best Practice

Dari sisi keamanan, seharusnya origin hanya menerima koneksi dari WAF. Dengan konfigurasi whitelist seperti ini, meskipun IP asli bocor, penyerang tetap tidak bisa mengakses aplikasi tanpa melalui WAF.

Jika ditemukan ada origin yang masih bisa diakses tanpa melalui WAF, itu tanda misconfiguration. Berikan rekomendasi terhadap organisasi untuk membatasi akses origin hanya dari IP WAF.

7. Content Discovery

Terminal
# Passive discovery
echo "https://target.com" | gau > gau.txt && echo "https://target.com" | waybackurls > waybackurls.txt | cat gau.txt waybackurls.txt | sort -u > osint-url.txt
# Active Discovery
# 1. dirsearch
dirsearch -u "https://target.com/" -o dirsearch.txt
dirsearch -r -u "https://target.com/" -o dirsearch-recursive.txt
# 2. gobuster
# Wordlist:
# - /usr/share/dirb/wordlists/common.txt
# - /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt
# - /usr/share/seclists/Discovery/Web-Content/raft-large-files.txt
gobuster dir -u https://target.com/ --db -w /usr/share/dirb/wordlists/common.txt -o gobuster-common.txt
gobuster dir -u https://target.com/ --db -w /usr/share/seclists/Discovery/Web-Content/raft-large-directories.txt -o gobuster-raftdir.txt
gobuster dir -u https://target.com/ --db -w /usr/share/seclists/Discovery/Web-Content/raft-large-files.txt -o gobuster-raftfile.txt
# 3. katana
katana -d 4 -jc -u https://target.com -o katana.txt
katana -d 4 -jc -u https://target.com -H 'Cookie: sessionid=abc123; csrftoken=xyz789' -o katana.txt
# list parameter
cat osint-url.txt | grep "="
grep -oP '(?<=\?).*' osint-url.txt | tr '&' '\n' | cut -d= -f1 | sort -u
grep -oP '(?<=\?).*' osint-url.txt | tr '&' '\n' | sort -u
gospider -s http://target.com/ --subs --sitemap --robots
# Google OSINT
site:target.com
site:target.com ext:php,docs,xlsx,pdf inurl:login
# finding parameter
paramspider -d target.com
arjun -u https://target.com

8. SSL Check

Terminal
# 1. Masuk ke direktori ssl
cd ../ssl
# 2. nmap
nmap --script "ssl*" -p443 -oN ssl.nmap "$domain"
# 3. testssl.sh
testssl.sh "$domain" | tee testssl.txt

Penutup

Masih banyak hal yang belum saya masukkan dalam cheatsheet ini, sehinga masih perlu saya kembangkan.

Beri tahu saya jika ada teknik yang bagus untuk saya pelajari.

Terima kasih, semoga bermanfaat!


[HTB Challenges] Watch Tower
[Bug Bounty Playground] Writeup CTF: NovaEnergy