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 ที่ได้รับอนุญาต)
1. ทำไมต้องหา subdomain
องค์กรมี subdomain จำนวนมาก (dev, staging, admin, api, mail, vpn, ...) แต่ละตัวคือ host/application แยกที่อาจมีช่องโหว่หรือ config อ่อนกว่า main site — dev/staging มักปลอดภัยน้อยกว่า production การหา subdomain ครบจึงขยาย attack surface และมักเจอจุดอ่อนที่ถูกมองข้าม
2. Passive vs Active
| Passive | Active | |
|---|---|---|
| วิธี | CT logs, API, search engine | DNS brute-force |
| แตะเป้าหมาย? | ไม่ (query แหล่งที่สาม) | ใช่ (query DNS เป้าหมาย) |
| เครื่องมือ | subfinder, amass (passive), assetfinder | ffuf/gobuster DNS, amass (active) |
| ข้อดี | เงียบ เร็ว | เจอที่ไม่อยู่ใน public source |
| ข้อเสีย | ได้แค่ที่เคยปรากฏ public | ดัง, ต้องมี wordlist ดี |
3. Passive enumeration
# 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.txt4. Active (DNS brute-force)
# 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-*.txt5. Resolve + verify (สำคัญ)
subdomain ที่หามาต้อง resolve + verify ว่ายังใช้งานอยู่จริง — บางตัวตายแล้ว (แต่ subdomain ที่ชี้ไป service ที่ถูกลบ = subdomain takeover ที่น่าสนใจ)
# 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/6. Workflow + Quick Reference
- 1passive: subfinder + amass -passive + assetfinder + crt.sh → รวม
- 2active: ffuf/amass -brute (ถ้า scope อนุญาต)
- 3รวม + sort -u ทุกผล
- 4resolve: dnsx (กรองที่ resolve ได้)
- 5probe: httpx (หา web alive + tech/title)
- 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เริ่ม 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ดึง Certificate Transparency logs เสริม:
curl -s "https://crt.sh/?q=%.target.com&output=json" | jq -r '.[].name_value' | sort -u > s4.txt - 3รวมทุกไฟล์แล้ว dedupe:
cat s1.txt s2.txt s3.txt s4.txt | sort -u > all_subs.txt - 4เช็คจำนวน:
wc -l all_subs.txt— ถ้าได้เยอะพอสมควรไปต่อ resolve ได้เลย - 5ถ้าได้น้อยเกินไปและ scope อนุญาต ลอง active brute-force:
gobuster dns -d target.com -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt - 6resolve เฉพาะที่ยังใช้งานได้จริง:
cat all_subs.txt | dnsx -silent -o resolved.txt - 7probe ว่า web ตอบไหม พร้อมดู title/tech:
cat resolved.txt | httpx -silent -title -status-code -tech-detect -o alive.txt - 8เช็ค subdomain takeover (subdomain ชี้ไป service ที่ถูกลบแล้ว):
cat resolved.txt | subzy run --targets - - 9แยก host ที่น่าสนใจ (admin/dev/staging/api/vpn) ไว้ก่อน แล้ว nmap สแกน service เพิ่ม
- 10จบ recon แล้วเลือก host ที่ alive ไปเริ่ม enum เว็บ/service แบบเจาะลึกต่อ
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| passive enum | amass, assetfinder | sudo apt install amass; go install .../assetfinder@latest | crt.sh |
| passive เร็ว/ครบ | subfinder (ถ้ามี) | go install .../subfinder@latest | securitytrails.com |
| active brute-force | gobuster, ffuf | sudo apt install gobuster ffuf | - |
| resolve subdomain | dnsx | go install .../dnsx@latest | dnsdumpster.com |
| probe web alive | httpx | go install .../httpx@latest | hackertarget.com |
| เช็ค takeover | subzy, nuclei | go install .../subzy@latest | - |
| ดูประวัติ subdomain | - | - | securitytrails.com, web.archive.org |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้