คลัง
recon

Subdomain Enumeration

Subdomain Enumeration หา subdomain ทั้งหมดของ target เพื่อขยาย attack surface — แต่ละ subdomain คือ host/service ที่อาจมีช่องโหว่ บทนี้ลงลึกวิธี passive (CT logs, API, search engine) vs active (DNS brute), เครื่องมือหลัก, การ resolve+verify, และ workflow รวม (เนื้อหาเพื่อ recon ที่ได้รับอนุญาต)

BeginnerIntermediate#subdomain#recon#enumeration#passive#active#ct-logs#ctf

1. ทำไมต้องหา subdomain

องค์กรมี subdomain จำนวนมาก (dev, staging, admin, api, mail, vpn, ...) แต่ละตัวคือ host/application แยกที่อาจมีช่องโหว่หรือ config อ่อนกว่า main site — dev/staging มักปลอดภัยน้อยกว่า production การหา subdomain ครบจึงขยาย attack surface และมักเจอจุดอ่อนที่ถูกมองข้าม

เนื้อหานี้เพื่อการ reconnaissance ในงานที่ได้รับอนุญาต (CTF, bug bounty scope, pentest) เท่านั้น

2. Passive vs Active

PassiveActive
วิธีCT logs, API, search engineDNS brute-force
แตะเป้าหมาย?ไม่ (query แหล่งที่สาม)ใช่ (query DNS เป้าหมาย)
เครื่องมือsubfinder, amass (passive), assetfinderffuf/gobuster DNS, amass (active)
ข้อดีเงียบ เร็วเจอที่ไม่อยู่ใน public source
ข้อเสียได้แค่ที่เคยปรากฏ publicดัง, ต้องมี wordlist ดี

3. Passive enumeration

subfinder / amass / assetfinder + CT logsLinux
# subfinder — เร็ว รวมหลาย source (ดูหัวข้อ subfinder)
subfinder -d example.com -o subs.txt
subfinder -d example.com -all              # ทุก source

# amass passive (ดูหัวข้อ amass)
amass enum -passive -d example.com -o amass.txt

# assetfinder (ดูหัวข้อ assetfinder)
assetfinder --subs-only example.com

# Certificate Transparency logs (ฟรี เผย subdomain ที่ออก cert)
curl -s "https://crt.sh/?q=%.example.com&output=json" | jq -r '.[].name_value' | sort -u

# รวมผลจากหลาย tool
cat subs.txt amass.txt | sort -u > all_subs.txt
CT logs (crt.sh) เผย subdomain ที่ออก SSL cert — แหล่ง passive ที่ดีมาก; รวมผลหลาย tool แล้ว sort -u

4. Active (DNS brute-force)

brute-force subdomainLinux
# ffuf DNS mode (ดูหัวข้อ ffuf-playbook)
ffuf -u https://FUZZ.example.com -w subdomains.txt -fc 404
# หรือผ่าน Host header / DNS

# gobuster dns
gobuster dns -d example.com -w /usr/share/wordlists/subdomains.txt

# amass active (รวม brute)
amass enum -active -d example.com -brute

# puredns (เร็ว + resolve)
puredns bruteforce wordlist.txt example.com

# wordlist ดี: SecLists/Discovery/DNS/subdomains-top1million-*.txt
brute-force หา subdomain ที่ไม่อยู่ใน public; wordlist สำคัญ (SecLists DNS); ดัง — ใช้ใน scope ที่อนุญาต

5. Resolve + verify (สำคัญ)

subdomain ที่หามาต้อง resolve + verify ว่ายังใช้งานอยู่จริง — บางตัวตายแล้ว (แต่ subdomain ที่ชี้ไป service ที่ถูกลบ = subdomain takeover ที่น่าสนใจ)

resolve + probe aliveLinux
# resolve (กรองเฉพาะที่ resolve ได้)
dnsx -l all_subs.txt -o resolved.txt
# หรือ
cat all_subs.txt | dnsx -silent

# probe HTTP/HTTPS (เฉพาะที่ web ตอบ)
cat resolved.txt | httpx -silent -o alive.txt
httpx -l resolved.txt -title -status-code -tech-detect

# subdomain takeover check (subdomain ชี้ service ที่ถูกลบ)
subzy run --targets resolved.txt
nuclei -l resolved.txt -t takeovers/
dnsx กรองที่ resolve ได้; httpx หาที่ web alive + tech; subzy/nuclei เช็ค subdomain takeover (CNAME ชี้ service ที่ถูกลบ)

6. Workflow + Quick Reference

  1. 1passive: subfinder + amass -passive + assetfinder + crt.sh → รวม
  2. 2active: ffuf/amass -brute (ถ้า scope อนุญาต)
  3. 3รวม + sort -u ทุกผล
  4. 4resolve: dnsx (กรองที่ resolve ได้)
  5. 5probe: httpx (หา web alive + tech/title)
  6. 6takeover check: subzy/nuclei
  • passive (CT logs/API): subfinder, amass -passive, crt.sh
  • active (brute): ffuf DNS, amass -brute, puredns
  • resolve: dnsx; probe alive: httpx
  • takeover: subzy/nuclei takeovers
  • dev/staging/admin subdomain มักอ่อนกว่า production

🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ

สมมติเจอโจทย์ recon ที่ต้องหา subdomain ให้ครบที่สุดในเวลาจำกัด มีแค่ Kali เปล่าๆ ทำตาม workflow นี้ทีละขั้น

  1. 1เริ่ม passive ก่อนเสมอด้วยหลายแหล่งพร้อมกัน: subfinder -d target.com -o s1.txt, amass enum -passive -d target.com -o s2.txt, assetfinder --subs-only target.com > s3.txt
  2. 2ดึง Certificate Transparency logs เสริม: curl -s "https://crt.sh/?q=%.target.com&output=json" | jq -r '.[].name_value' | sort -u > s4.txt
  3. 3รวมทุกไฟล์แล้ว dedupe: cat s1.txt s2.txt s3.txt s4.txt | sort -u > all_subs.txt
  4. 4เช็คจำนวน: wc -l all_subs.txt — ถ้าได้เยอะพอสมควรไปต่อ resolve ได้เลย
  5. 5ถ้าได้น้อยเกินไปและ scope อนุญาต ลอง active brute-force: gobuster dns -d target.com -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
  6. 6resolve เฉพาะที่ยังใช้งานได้จริง: cat all_subs.txt | dnsx -silent -o resolved.txt
  7. 7probe ว่า web ตอบไหม พร้อมดู title/tech: cat resolved.txt | httpx -silent -title -status-code -tech-detect -o alive.txt
  8. 8เช็ค subdomain takeover (subdomain ชี้ไป service ที่ถูกลบแล้ว): cat resolved.txt | subzy run --targets -
  9. 9แยก host ที่น่าสนใจ (admin/dev/staging/api/vpn) ไว้ก่อน แล้ว nmap สแกน service เพิ่ม
  10. 10จบ recon แล้วเลือก host ที่ alive ไปเริ่ม enum เว็บ/service แบบเจาะลึกต่อ
workflow: passive → active → resolve → pivot
รวม subfinder + amass -passive + assetfinder + crt.sh
รวมแล้วได้ subdomain เยอะพอไหม?
✅ ได้เยอะพอ→ resolve ต่อ
❌ ได้น้อย และ scope อนุญาต brute→ ลอง active
ffuf/gobuster DNS brute-force ด้วย wordlist
✅ ได้เพิ่ม→ resolve ต่อ
❌ ยังน้อย/ไม่มี wordlist ดี→ ขยาย scope ทาง ASN แทน
dnsx (resolve) → httpx (probe alive)
✅ เจอ host alive→ เช็ค takeover + enum ต่อ
❌ resolve ไม่ติดเลย→ เช็ค resolver/DNS ของเราเอง
subzy/nuclei เช็ค subdomain takeover
✅ เจอ takeover ได้→ นี่คือช่องโหว่ตรง! ทำต่อ
❌ ไม่เจอ takeover→ ไป enum เว็บ/service ต่อปกติ
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
passive enumamass, assetfindersudo apt install amass; go install .../assetfinder@latestcrt.sh
passive เร็ว/ครบsubfinder (ถ้ามี)go install .../subfinder@latestsecuritytrails.com
active brute-forcegobuster, ffufsudo apt install gobuster ffuf-
resolve subdomaindnsxgo install .../dnsx@latestdnsdumpster.com
probe web alivehttpxgo install .../httpx@latesthackertarget.com
เช็ค takeoversubzy, nucleigo install .../subzy@latest-
ดูประวัติ subdomain--securitytrails.com, web.archive.org
🚑 ถ้าตันสนิท ลองท่าถัดไป: ASN Enumeration (subdomain หมดทางแล้ว ลองหา asset ทาง IP range แทน), Shodan/Censys (หา service/IP จริงหลัง CDN แทนการหาแค่ชื่อ), DNS Enumeration (ลอง zone transfer หรือดู record ละเอียดกว่านี้), Web Methodology (พอมี host ที่ alive แล้ว ไปเริ่ม enum เว็บแบบเต็ม)

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้