Information Gathering
Information Gathering คือขั้นแรกของการทดสอบเว็บ: เก็บข้อมูลเทคโนโลยี โครงสร้าง และพื้นผิวการโจมตี (attack surface) ให้ได้มากที่สุดก่อนเริ่มเจาะ ยิ่งรู้มาก ยิ่งเลือกช่องโหว่ได้ตรงจุด และเสีย request ไปกับการเดามั่วน้อยลง บทนี้ครอบคลุมทั้ง passive/active recon, tech fingerprinting, vhost fuzzing, การขุด endpoint จาก JavaScript, และแหล่งข้อมูลที่มักรั่ว พร้อม flow ตัดสินใจ 'เพิ่งเจอเว็บ ทำอะไรก่อน'
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 fingerprint | whatweb, Wappalyzer, headers, favicon hash | ระบุ stack/เวอร์ชัน → map CVE |
| Content mapping | directory brute, robots/sitemap, JS endpoint | หา path/API ที่ซ่อน |
| Parameter mapping | arjun, param miner, hidden field | หา input ที่ไม่ถูกป้องกัน |
| Leak hunting | /.git, .env, .bak, source map, stack trace | ได้ source/credential ตรงๆ |
2. เพิ่งเจอเว็บ ทำอะไรก่อน
3. Tech Fingerprinting
fingerprint คือการอนุมาน stack จากร่องรอยเล็กๆ ใน response: Server/X-Powered-By header, ชื่อ session cookie, path เฉพาะของ framework, favicon hash, และลำดับ/รูปแบบ header ทำ passive ก่อน (whatweb/curl) แล้วค่อยยิง active scanner
# 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# 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| เบาะแส | บ่งชี้ stack | ช่องโหว่ที่ควรนึกถึง |
|---|---|---|
| PHPSESSID | PHP | LFI, type juggling, phar deser |
| JSESSIONID | Java/Tomcat | deserialization, SSTI, path traversal |
| connect.sid / X-Powered-By: Express | Node.js/Express | prototype pollution, SSRF, NoSQLi |
| ASP.NET_SessionId / X-AspNet-Version | .NET | ViewState deser, padding oracle |
| csrftoken + sessionid | Django (Python) | SSTI Jinja2, pickle deser |
| laravel_session / XSRF-TOKEN | Laravel (PHP) | APP_KEY leak → deser, debug mode |
| wp-content/, /wp-json/ | WordPress | plugin CVE, xmlrpc, user enum |
| X-Drupal-Cache / sites/default | Drupal | Drupalgeddon, SA-CORE CVE |
4. Virtual Host / vhost Fuzzing
เว็บเซิร์ฟเวอร์ตัวเดียว (IP เดียว) มักโฮสต์หลายเว็บผ่าน Host header (name-based virtual hosting) บางเว็บไม่มี DNS ชี้มาแต่ยังเข้าถึงได้ถ้าส่ง Host ที่ถูกต้อง — vhost fuzzing คือการเดา Host header เพื่อหาเว็บที่ซ่อน ต่างจาก subdomain enumeration ที่พึ่ง DNS สาธารณะ
# 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-domain127.0.0.1 vhost.target.com ลง /etc/hosts แล้วเปิดตรงเพื่อดูเต็มๆ — ดูเพิ่มที่ subdomain enumeration สำหรับฝั่ง DNS5. robots / sitemap / JS endpoint mining
หลาย path หลุดมาให้ฟรีโดยไม่ต้อง brute: robots.txt บอก path ที่เจ้าของ 'ไม่อยากให้ index' (มักคือ admin/backup), sitemap.xml ลิสต์หน้าเยอะ, และ JavaScript ฝั่ง client มักฝัง endpoint API, พารามิเตอร์, และบางทีก็ key
# ของที่ให้มาฟรี
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 clirobots.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,/graphqlintrospection — ลิสต์ endpoint ให้เลย
/.git/ เปิดอยู่ ใช้ git-dumper http://target/.git/ out/ ดาวน์โหลด repo ทั้งหมดมาอ่าน source + history — commit เก่ามักมี credential/API key ที่ถูก 'ลบ' ในภายหลังแต่ยังอยู่ใน history6. CTF & Pentest Walkthrough
- 1CTF: เปิดเว็บ → whatweb เห็น 'Werkzeug/Python' → เดา Flask → ลอง SSTI ที่ช่องค้นหา `{{7*7}}` → คืน 49 → RCE ผ่าน Jinja2
- 2CTF: curl -sI เห็น cookie `laravel_session` + หน้า error โชว์ APP_KEY (debug mode เปิด) → ปลอม session/decrypt cookie ได้
- 3Pentest: fingerprint เห็น WordPress → `wpscan --url target --enumerate ap,u` → เจอ plugin เวอร์ชันมีช่องโหว่ CVE → exploit ตาม PoC
- 4Pentest: robots.txt เผย `/backup/` → ffuf ใน /backup/ เจอ `db.sql.bak` → ดาวน์โหลดได้ credential ฐานข้อมูล
- 5Pentest: katana ขุด JS เจอ endpoint `/api/internal/v2/users` ที่ไม่มีลิงก์ → ทดสอบ IDOR ต่อได้
7. ข้อผิดพลาดที่พบบ่อย & Troubleshooting
| อาการ | สาเหตุ | ทางแก้ |
|---|---|---|
| ทุก path คืน 200 | soft-404 (เว็บตอบ 200 ให้หน้าหาไม่เจอ) | filter ด้วยขนาด/word ของหน้า not-found จริง (-fs/-fw หรือ -ac) |
| โดนบล็อก/CAPTCHA กลางคัน | WAF/rate limit ตรวจจับ | ลด -rate/-t, สุ่ม User-Agent, เพิ่ม delay, ใช้ HTTP/2 |
| fingerprint ผิด stack | header ถูกลบ/ปลอม โดย reverse proxy | ยืนยันหลายสัญญาณ (cookie+path+error), อย่าเชื่อ header เดียว |
| ยิงโดน CDN ไม่ถึงเซิร์ฟเวอร์จริง | Cloudflare/Akamai กันหน้า origin | หา origin IP: crt.sh, DNS history, SPF record, favicon hash ใน Shodan |
| เจอ endpoint เยอะแต่ noise | wordlist ใหญ่เกิน + ไม่กรอง | เริ่มเล็ก (common.txt) → ค่อยขยาย, กรองด้วย status/size |
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เปิดเว็บผ่าน Burp Suite proxy ก่อนเสมอ เพื่อให้เก็บ request/response และ sitemap ให้อัตโนมัติ
- 2รัน whatweb -a 3 https://target ดูว่าเป็นภาษา/framework อะไร
- 3รัน curl -sSI https://target | grep -iE 'server|x-powered-by|set-cookie|via|cf-ray' เก็บ header ที่บอกใบ้
- 4เช็คว่ามี CDN ไหม (Cloudflare/Akamai) จาก header — ถ้ามี ลองหา origin IP จริงผ่าน crt.sh หรือ DNS history
- 5ดึงของฟรี: curl -s https://target/robots.txt และ curl -s https://target/sitemap.xml
- 6ลองเปิด https://target/.git/ ด้วย curl -s -o /dev/null -w '%{http_code}\n' — ถ้าได้ 200 ให้ git-dumper ดึงมาทั้ง repo
- 7รัน katana -u https://target -jc -d 3 -o katana.txt เพื่อ crawl หา endpoint และ parse JavaScript
- 8เปิดไฟล์ katana.txt ไล่ดู endpoint ที่น่าสนใจ (มี /api/, /admin, /internal) แล้วบันทึกไว้ทดสอบต่อ
- 9รวมทุกอย่างที่เก็บได้ (stack, path, endpoint) แล้วเลือกว่าจะไป Directory Enumeration (หา path เพิ่ม) หรือ Parameter Discovery (หา param ซ่อน) ต่อ
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| fingerprint เทคโนโลยี | whatweb | - | wappalyzer, builtwith |
| เช็ค header/cookie | curl -sI | - | - |
| หา origin IP หลัง CDN | - | - | crt.sh, viewdns.info |
| favicon hash เทียบฐานข้อมูล | - | pip install mmh3 | Shodan (http.favicon.hash) |
| ขุด JS หา endpoint | - | go install projectdiscovery/katana | - |
| ดึง URL เก่าจาก archive | - | go install waybackurls, gau | web.archive.org |
| สแกน misconfig/ช่องโหว่เร็วๆ | nikto | apt install nuclei | - |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้