คลัง
web

Information Gathering

Information Gathering คือขั้นแรกของการทดสอบเว็บ: เก็บข้อมูลเทคโนโลยี โครงสร้าง และพื้นผิวการโจมตี (attack surface) ให้ได้มากที่สุดก่อนเริ่มเจาะ ยิ่งรู้มาก ยิ่งเลือกช่องโหว่ได้ตรงจุด และเสีย request ไปกับการเดามั่วน้อยลง บทนี้ครอบคลุมทั้ง passive/active recon, tech fingerprinting, vhost fuzzing, การขุด endpoint จาก JavaScript, และแหล่งข้อมูลที่มักรั่ว พร้อม flow ตัดสินใจ 'เพิ่งเจอเว็บ ทำอะไรก่อน'

BeginnerIntermediate#recon#information-gathering#fingerprint#osint#whatweb#wappalyzer#nmap#vhost

1. แนวคิด — จะเก็บอะไรบ้าง

เป้าหมายของ recon คือวาดแผนที่ของเป้าหมายก่อนยิงจริง: เทคโนโลยี (ภาษา, framework, web server, CMS, WAF/CDN), โครงสร้าง (path, ไฟล์, endpoint, พารามิเตอร์, vhost), และ ข้อมูลรั่ว (source code, credential, comment, error) การรู้ stack ช่วยเลือกช่องโหว่ที่เกี่ยวข้อง เช่น เจอ PHP → คิดถึง LFI/type juggling; เจอ Node.js → prototype pollution; เจอ Java → deserialization/SSTI Freemarker; ข้อมูลเวอร์ชันยังชี้ตรงไป CVE ที่รู้จัก

ชั้นข้อมูลตัวอย่างที่เก็บเอาไปทำอะไรต่อ
Passive (ไม่แตะเป้า)whois, DNS, cert transparency, Google/GitHub dork, Shodanหา subdomain/asset โดยไม่ส่ง noise
Active fingerprintwhatweb, Wappalyzer, headers, favicon hashระบุ stack/เวอร์ชัน → map CVE
Content mappingdirectory brute, robots/sitemap, JS endpointหา path/API ที่ซ่อน
Parameter mappingarjun, param miner, hidden fieldหา input ที่ไม่ถูกป้องกัน
Leak hunting/.git, .env, .bak, source map, stack traceได้ source/credential ตรงๆ
Web recon workflow — จาก URL ถึง attack surface
target https://x Passive OSINT dns/crt/shodan Fingerprint whatweb/headers Content map ffuf/robots JS + params katana/arjun รวมผล stack + map Attack surface
recon เป็นงานที่ทำ วนซ้ำ ไม่ใช่ครั้งเดียวจบ — ทุกครั้งที่เจอ subdomain/path/param ใหม่ ให้ป้อนกลับเข้า loop แล้ว fingerprint + map ต่อ จนกว่าจะไม่มี asset ใหม่โผล่

2. เพิ่งเจอเว็บ ทำอะไรก่อน

ลำดับการ recon เว็บเป้าหมาย
เปิดเว็บ + ส่งผ่าน Burp proxy
ดู request/response ทั้งหมด, sitemap อัตโนมัติ
Fingerprint stack
whatweb, Wappalyzer, curl -sI (headers/cookie)
เจอ WAF/CDN ไหม? (Cloudflare, Akamai)
เจอ CDNหา origin IP จริง (crt.sh, DNS history) แล้วยิงตรง
ไม่เจอยิงตรงได้เลย ปรับ rate ตามปกติ
เก็บของฟรี: robots.txt, sitemap.xml, /.git/, security.txt
path ที่เขาบอกเองว่ามีอยู่
ขุด endpoint จาก JavaScript
katana/gau + linkfinder หา API path
vhost fuzzing (ถ้าเป็น IP/มีหลายเว็บ)
ffuf -H 'Host: FUZZ.target'
map stack → เลือกช่องโหว่
PHPLFI / type juggling
Node/Expressprototype pollution / SSRF
template engineSSTI

3. Tech Fingerprinting

fingerprint คือการอนุมาน stack จากร่องรอยเล็กๆ ใน response: Server/X-Powered-By header, ชื่อ session cookie, path เฉพาะของ framework, favicon hash, และลำดับ/รูปแบบ header ทำ passive ก่อน (whatweb/curl) แล้วค่อยยิง active scanner

ระบุ stack — whatweb / headers / favicon
# whatweb — aggressive level ดึงข้อมูลลึกขึ้น
whatweb -a 3 https://target

# response headers ที่บอกใบ้
curl -sSI https://target | grep -iE 'server|x-powered-by|set-cookie|x-aspnet|x-generator|via|cf-ray'

# favicon hash → เทียบกับฐานข้อมูล (ระบุ framework/แผง admin)
curl -s https://target/favicon.ico | python3 -c 'import sys,mmh3,base64,codecs; d=base64.encodebytes(sys.stdin.buffer.read()); print(mmh3.hash(d))'
# เอา hash ไปค้นใน shodan: http.favicon.hash:<hash>

# nmap service/version บนพอร์ต web
nmap -sV -Pn -p 80,443,8080,8443 --script=http-headers,http-title target
favicon hash เดียวกัน = ระบบเดียวกัน มีประโยชน์มากตอนหา origin/asset ซ้ำ
nikto + nuclei — สแกนช่องโหว่/misconfig เร็วๆ
# nikto — ตรวจ misconfig, ไฟล์อันตราย, header ที่หาย
nikto -h https://target -Tuning 123bde

# nuclei — เทมเพลตช่องโหว่/tech detection ทันสมัยกว่า
nuclei -u https://target -t http/technologies/ -t http/misconfiguration/
nuclei -u https://target -tags cve,exposure -severity medium,high,critical
nikto เสียงดัง (noisy) มาก — ใช้ในงานที่ได้รับอนุญาตและไม่กลัวโดน log/บล็อก
เบาะแสบ่งชี้ stackช่องโหว่ที่ควรนึกถึง
PHPSESSIDPHPLFI, type juggling, phar deser
JSESSIONIDJava/Tomcatdeserialization, SSTI, path traversal
connect.sid / X-Powered-By: ExpressNode.js/Expressprototype pollution, SSRF, NoSQLi
ASP.NET_SessionId / X-AspNet-Version.NETViewState deser, padding oracle
csrftoken + sessionidDjango (Python)SSTI Jinja2, pickle deser
laravel_session / XSRF-TOKENLaravel (PHP)APP_KEY leak → deser, debug mode
wp-content/, /wp-json/WordPressplugin CVE, xmlrpc, user enum
X-Drupal-Cache / sites/defaultDrupalDrupalgeddon, SA-CORE CVE
header หลายตัวถูกซ่อน/ปลอมได้ อย่าเชื่อ 100% — ยืนยันด้วยหลายสัญญาณ (cookie + path + error page) ก่อนสรุป stack

4. Virtual Host / vhost Fuzzing

เว็บเซิร์ฟเวอร์ตัวเดียว (IP เดียว) มักโฮสต์หลายเว็บผ่าน Host header (name-based virtual hosting) บางเว็บไม่มี DNS ชี้มาแต่ยังเข้าถึงได้ถ้าส่ง Host ที่ถูกต้อง — vhost fuzzing คือการเดา Host header เพื่อหาเว็บที่ซ่อน ต่างจาก subdomain enumeration ที่พึ่ง DNS สาธารณะ

vhost fuzzing ด้วย ffuf / gobuster
# ffuf — fuzz Host header, กรองด้วยขนาด response ของหน้า default
ffuf -u http://TARGET_IP/ -H "Host: FUZZ.target.com" \
  -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
  -mc all -fs <default_size>

# ถ้ารู้ default response size แล้ว ให้ filter ออก (เห็นเฉพาะ vhost จริง)
ffuf -u http://TARGET_IP/ -H "Host: FUZZ.target.com" -w wordlist.txt -ac

# gobuster โหมด vhost
gobuster vhost -u http://target.com -w wordlist.txt --append-domain
-ac = auto-calibrate (ffuf หา baseline เอง), gobuster --append-domain ต่อ domain ให้อัตโนมัติ
ต่าง vhost ให้ response ต่างขนาด/ต่าง title = เจอเว็บซ่อน ลองเพิ่ม 127.0.0.1 vhost.target.com ลง /etc/hosts แล้วเปิดตรงเพื่อดูเต็มๆ — ดูเพิ่มที่ subdomain enumeration สำหรับฝั่ง DNS

5. robots / sitemap / JS endpoint mining

หลาย path หลุดมาให้ฟรีโดยไม่ต้อง brute: robots.txt บอก path ที่เจ้าของ 'ไม่อยากให้ index' (มักคือ admin/backup), sitemap.xml ลิสต์หน้าเยอะ, และ JavaScript ฝั่ง client มักฝัง endpoint API, พารามิเตอร์, และบางทีก็ key

เก็บ path ฟรี + ขุด endpoint จาก JS
# ของที่ให้มาฟรี
curl -s https://target/robots.txt
curl -s https://target/sitemap.xml | grep -oE '<loc>[^<]+' | sed 's/<loc>//'
curl -s https://target/.well-known/security.txt

# ดึง URL เก่าจาก archive/wayback (passive มาก)
gau target.com | tee urls.txt
waybackurls target.com >> urls.txt

# crawl หา endpoint/JS ด้วย katana
katana -u https://target -jc -d 3 -o katana.txt   # -jc = parse JS

# ขุด endpoint/param จากไฟล์ .js
curl -s https://target/main.js -o main.js
grep -oE '"/[a-zA-Z0-9_/.?=&-]+"' main.js | sort -u   # path ที่ฝังในโค้ด
# หรือใช้ linkfinder
python3 linkfinder.py -i https://target/main.js -o cli
อย่าลืมลอง .js.map (source map) — คืน source code ต้นฉบับ เผยตรรกะ/endpoint ทั้งหมด
  • robots.txt, sitemap.xml — เผย path ที่ไม่อยากให้ index (มักมี admin/backup/api)
  • /.git/, /.svn/, /.hg/ — source code รั่ว (ดึงด้วย git-dumper)
  • JavaScript source + .js.map — เผย endpoint, API key, ตรรกะฝั่ง client
  • comment ใน HTML, error page (stack trace เผย path เต็ม/เวอร์ชัน/query)
  • /.env, config.php.bak, .DS_Store, web.config — ไฟล์ config/backup
  • HTTP headers, security.txt, favicon hash (ระบุ framework/องค์กร)
  • /.well-known/, /api/swagger.json, /graphql introspection — ลิสต์ endpoint ให้เลย
ถ้าเจอ /.git/ เปิดอยู่ ใช้ git-dumper http://target/.git/ out/ ดาวน์โหลด repo ทั้งหมดมาอ่าน source + history — commit เก่ามักมี credential/API key ที่ถูก 'ลบ' ในภายหลังแต่ยังอยู่ใน history

6. CTF & Pentest Walkthrough

  1. 1CTF: เปิดเว็บ → whatweb เห็น 'Werkzeug/Python' → เดา Flask → ลอง SSTI ที่ช่องค้นหา `{{7*7}}` → คืน 49 → RCE ผ่าน Jinja2
  2. 2CTF: curl -sI เห็น cookie `laravel_session` + หน้า error โชว์ APP_KEY (debug mode เปิด) → ปลอม session/decrypt cookie ได้
  3. 3Pentest: fingerprint เห็น WordPress → `wpscan --url target --enumerate ap,u` → เจอ plugin เวอร์ชันมีช่องโหว่ CVE → exploit ตาม PoC
  4. 4Pentest: robots.txt เผย `/backup/` → ffuf ใน /backup/ เจอ `db.sql.bak` → ดาวน์โหลดได้ credential ฐานข้อมูล
  5. 5Pentest: katana ขุด JS เจอ endpoint `/api/internal/v2/users` ที่ไม่มีลิงก์ → ทดสอบ IDOR ต่อได้

7. ข้อผิดพลาดที่พบบ่อย & Troubleshooting

อาการสาเหตุทางแก้
ทุก path คืน 200soft-404 (เว็บตอบ 200 ให้หน้าหาไม่เจอ)filter ด้วยขนาด/word ของหน้า not-found จริง (-fs/-fw หรือ -ac)
โดนบล็อก/CAPTCHA กลางคันWAF/rate limit ตรวจจับลด -rate/-t, สุ่ม User-Agent, เพิ่ม delay, ใช้ HTTP/2
fingerprint ผิด stackheader ถูกลบ/ปลอม โดย reverse proxyยืนยันหลายสัญญาณ (cookie+path+error), อย่าเชื่อ header เดียว
ยิงโดน CDN ไม่ถึงเซิร์ฟเวอร์จริงCloudflare/Akamai กันหน้า originหา origin IP: crt.sh, DNS history, SPF record, favicon hash ใน Shodan
เจอ endpoint เยอะแต่ noisewordlist ใหญ่เกิน + ไม่กรองเริ่มเล็ก (common.txt) → ค่อยขยาย, กรองด้วย status/size
recon ที่ก้าวร้าวเกินไป (สแกนแรง, request ถี่) อาจล่มเป้าหมายหรือทำให้โดนบล็อกทั้งช่วงทดสอบ — ทำเฉพาะระบบที่ได้รับอนุญาตเป็นลายลักษณ์อักษร และปรับความเร็วให้เหมาะกับ scope

8. Quick Reference

  • ผ่าน Burp proxy เสมอ → ได้ sitemap + ประวัติ request ฟรี
  • fingerprint ก่อน: whatweb -a 3, Wappalyzer, curl -sSI, cookie names, favicon hash
  • stack → ช่องโหว่ (PHP→LFI, Node→proto pollution, template→SSTI)
  • เก็บของฟรี: robots.txt, sitemap.xml, /.git/, .well-known/, .js.map
  • ขุด JS ด้วย katana/gau + linkfinder หา endpoint ซ่อน
  • vhost fuzzing: ffuf -H 'Host: FUZZ.target' -ac
  • เจอ CDN → หา origin IP (crt.sh, Shodan favicon)
  • git-dumper ถ้า /.git/ เปิด → อ่าน history หา credential
  • ต่อด้วย Directory Enumeration + Parameter Discovery แล้ววน loop

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

สมมติเพิ่งได้ URL เป้าหมายมาตัวเดียว ยังไม่รู้อะไรเกี่ยวกับมันเลย มีแค่ Kali เปล่าๆ ทำตามนี้ทีละขั้นเพื่อสร้างแผนที่ก่อนเริ่มเจาะ

  1. 1เปิดเว็บผ่าน Burp Suite proxy ก่อนเสมอ เพื่อให้เก็บ request/response และ sitemap ให้อัตโนมัติ
  2. 2รัน whatweb -a 3 https://target ดูว่าเป็นภาษา/framework อะไร
  3. 3รัน curl -sSI https://target | grep -iE 'server|x-powered-by|set-cookie|via|cf-ray' เก็บ header ที่บอกใบ้
  4. 4เช็คว่ามี CDN ไหม (Cloudflare/Akamai) จาก header — ถ้ามี ลองหา origin IP จริงผ่าน crt.sh หรือ DNS history
  5. 5ดึงของฟรี: curl -s https://target/robots.txt และ curl -s https://target/sitemap.xml
  6. 6ลองเปิด https://target/.git/ ด้วย curl -s -o /dev/null -w '%{http_code}\n' — ถ้าได้ 200 ให้ git-dumper ดึงมาทั้ง repo
  7. 7รัน katana -u https://target -jc -d 3 -o katana.txt เพื่อ crawl หา endpoint และ parse JavaScript
  8. 8เปิดไฟล์ katana.txt ไล่ดู endpoint ที่น่าสนใจ (มี /api/, /admin, /internal) แล้วบันทึกไว้ทดสอบต่อ
  9. 9รวมทุกอย่างที่เก็บได้ (stack, path, endpoint) แล้วเลือกว่าจะไป Directory Enumeration (หา path เพิ่ม) หรือ Parameter Discovery (หา param ซ่อน) ต่อ
Decision flow — จับมือทำ Information Gathering
whatweb -a 3 + curl -sSI ดู stack และ header
เจอ CDN/WAF ไหม?
✅ เจอ CDN (Cloudflare/Akamai)→ หา origin IP จริง (crt.sh, DNS history)
❌ ไม่มี→ ยิงตรงได้เลย
เก็บของฟรี: robots.txt, sitemap.xml, /.git/
/.git/ เปิดอยู่ไหม?
✅ เปิด (HTTP 200)→ git-dumper ดึง repo มาอ่าน source/credential
❌ ปิด/404→ ข้าม ไปขุด JS ต่อ
รัน katana crawl + parse JS หา endpoint ที่ซ่อน
ได้ stack + path + endpoint ครบพอไหม?
✅ ครบพอเริ่มเจาะ→ ไป directory enumeration/parameter discovery
❌ ยังน้อยเกินไป→ ลอง google/github dork หรือ subdomain enum เพิ่ม
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
fingerprint เทคโนโลยีwhatweb-wappalyzer, builtwith
เช็ค header/cookiecurl -sI--
หา origin IP หลัง CDN--crt.sh, viewdns.info
favicon hash เทียบฐานข้อมูล-pip install mmh3Shodan (http.favicon.hash)
ขุด JS หา endpoint-go install projectdiscovery/katana-
ดึง URL เก่าจาก archive-go install waybackurls, gauweb.archive.org
สแกน misconfig/ช่องโหว่เร็วๆniktoapt install nuclei-
🚑 ถ้าตันสนิท ลองท่าถัดไป: Directory Enumeration — ถ้า recon แบบ passive ได้ข้อมูลน้อย ให้เริ่ม brute path โดยตรง; Parameter Discovery — ถ้าเจอ endpoint แล้วแต่ไม่รู้ว่ารับ parameter อะไรบ้าง; Web Methodology — ถ้าสับสนว่าจะเลือกช่องโหว่ไหนก่อน ให้กลับไปดู master flow ทั้งหมด

หัวข้อที่เชื่อมโยง

โน้ตของฉัน

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