Asset Discovery & Kỹ thuật Mở rộng Phạm vi (Scope Expansion)
Phương pháp luận trinh sát bề mặt tấn công diện rộng: Subdomain enumeration, ASN mapping, Certificate Transparency logs và tìm kiếm Origin IP vượt WAF.
TL;DR: Trong săn bug thực tế, mục tiêu chính thường được bảo vệ bởi các lớp Cloud WAF và CDN nghiêm ngặt. Những thợ săn bug chuyên nghiệp không bao giờ đâm đầu vào các endpoint được bảo vệ kỹ lưỡng này mà tìm cách mở rộng phạm vi tấn công (Scope Expansion): tận dụng Certificate Transparency logs, ASN mapping và các dịch vụ quét DNS lịch sử để tìm ra các máy chủ nguồn (Origin IP) bị bỏ quên hoặc các subdomain nội bộ của môi trường staging/UAT. Khi kết nối thẳng vào Origin IP, toàn bộ các quy tắc bảo vệ của WAF bên ngoài đều trở nên vô hiệu.
1. Scenario — Bức tường lửa triệu đô và chiếc cửa hậu hé mở
Một tập đoàn fintech triển khai giải pháp Cloudflare Enterprise WAF bảo vệ cho tên miền chính https://pay.fintech.corp. Mọi payload độc hại từ SQL Injection, XSS đến SSRF gửi tới tên miền này đều bị chặn đứng với mã lỗi 403 Forbidden kèm trang cảnh báo của Cloudflare. Nhóm phát triển tự tin rằng hệ thống thanh toán của họ hoàn toàn bất khả xâm phạm trước các đợt rà quét tự động.
Tuy nhiên, một chuyên gia bảo mật kiểm thử hộp xám không thử nghiệm bất kỳ payload nào lên trang chủ. Thay vào đó, chuyên gia này lục tìm nhật ký cấp phát chứng chỉ SSL (Certificate Transparency logs) và phát hiện tên miền phụ staging-api.fintech.corp. Kiểm tra lịch sử bản ghi DNS (DNS History) từ 6 tháng trước của tên miền phụ này, họ tìm ra địa chỉ IP máy chủ vật lý thật: 203.0.113.45.
Khi gửi trực tiếp một HTTP request tới IP này kèm theo header Host: pay.fintech.corp:
POST /api/v1/transfer HTTP/1.1
Host: pay.fintech.corp
Content-Type: application/json
{"recipient": "attacker", "amount": 1000}
Request đi thẳng vào backend Node.js nội bộ mà không hề đi qua mạng lưới Cloudflare WAF. Backend vẫn tin tưởng request vì trường header Host khớp với cấu hình Virtual Host của Nginx. Toàn bộ lớp phòng thủ triệu đô ở rìa mạng bị vô hiệu hóa hoàn toàn.
2. Analogy — Tòa lâu đài và chiếc cửa thông hào bỏ quên
Hãy hình dung một lâu đài kiên cố:
- Cổng chính (Cloud WAF / CDN): Có lính gác nghiêm ngặt, rà soát từng người qua lại, kiểm tra giấy tờ và vũ khí. Bất kỳ ai mang đồ khả nghi đều bị chặn ngay từ chân thành.
- Tường thành (Hạ tầng mạng nội bộ): Cao và dày, nhưng được xây dựng dựa trên giả định rằng mọi người bước vào đều đã qua cổng chính kiểm duyệt.
- Cửa thoát hiểm bí mật dưới đáy hào (Origin IP): Một lối đi phụ dùng cho thợ sửa ống nước hoặc nhân viên bảo trì thời kỳ xây dựng, dẫn thẳng vào phòng kho của lâu đài.
Kỹ thuật Scope Expansion và tìm kiếm Origin IP tương tự như việc người thám tử không cố gắng trèo qua cổng chính có lính gác, mà đi vòng quanh chân thành, lục lại bản vẽ xây dựng cũ để tìm lối đi phụ không có người canh giữ.
3. Bản đồ mở rộng phạm vi hoạt động ra sao?
Một quy trình trinh sát diện rộng chuyên nghiệp không dừng lại ở một tên miền duy nhất (target.com) mà mở rộng theo mô hình phân tầng:

3.1. Certificate Transparency (CT) Logs là gì?
Theo quy định của các trình duyệt hiện đại, mọi tổ chức phát hành chứng chỉ số (Certificate Authority - CA như Let's Encrypt, DigiCert) bắt buộc phải ghi lại công khai mọi chứng chỉ SSL/TLS được cấp vào sổ cái Certificate Transparency công cộng để chống giả mạo chứng chỉ.
Sổ cái này là dữ liệu công khai (Append-only log). Bất kỳ khi nào một lập trình viên tạo ra tên miền phụ nội bộ như admin-dev.target.com và xin chứng chỉ SSL miễn phí, tên miền phụ đó lập tức được ghi nhận vào CT Log vĩnh viễn, kể cả khi tên miền đó không được công khai trên DNS server chính thức.
Bạn có thể truy vấn trực tiếp kho dữ liệu này qua API miễn phí của crt.sh:
import requests
def search_ct_logs(domain: str) -> set[str]:
"""Fetch all subdomains registered in Certificate Transparency logs."""
url = f"https://crt.sh/?q=%25.{domain}&output=json"
headers = {"User-Agent": "SecurityResearchBot/1.0"}
subdomains = set()
try:
response = requests.get(url, headers=headers, timeout=15)
if response.status_code == 200:
for entry in response.json():
name_value = entry.get("name_value", "")
for sub in name_value.split("\n"):
if domain in sub and not sub.startswith("*"):
subdomains.add(sub.strip().lower())
except requests.RequestException as e:
print(f"[-] Error querying crt.sh: {e}")
return subdomains
if __name__ == "__main__":
results = search_ct_logs("example.com")
print(f"[+] Discovered {len(results)} unique subdomains.")
3.2. Autonomous System Number (ASN) và dải IP tổ chức
Các tập đoàn lớn (Grab, Shopee, VNG, FPT) thường sở hữu dải địa chỉ IP riêng được định tuyến toàn cầu qua mã số mạng Autonomous System Number (ASN). Ví dụ, ASN AS132203 hoặc các dải mạng dạng /20 hay /24.
Bằng cách tra cứu ASN của mục tiêu trên các cơ sở dữ liệu định tuyến BGP (như Hurricane Electric BGP Toolkit hay RIPE NCC), bạn có thể liệt kê hàng nghìn địa chỉ IP thực tế thuộc quyền sở hữu của doanh nghiệp, từ đó phát hiện các máy chủ nội bộ hoặc máy chủ API chưa bao giờ được đưa ra sau Cloudflare.
4. Làm thế nào để tìm kiếm Origin IP ẩn sau Cloudflare/Akamai?
Khi tên miền chính đã nằm sau CDN (địa chỉ IP trả về khi ping chỉ là IP của Cloudflare), làm thế nào để tìm ra địa chỉ IP thật của máy chủ nguồn (Origin IP)? Các chuyên gia bảo mật thường áp dụng 4 phương pháp cốt lõi:
Cách 1: Truy vết lịch sử DNS (DNS Historical Records)
Trước khi doanh nghiệp bật Cloudflare (hoặc khi chuyển đổi nhà cung cấp hạ tầng), bản ghi A của tên miền chính thường trỏ thẳng tới IP máy chủ thật. Các công cụ thu thập dữ liệu thụ động (như SecurityTrails, ViewDNS, Censys) lưu lại toàn bộ lịch sử bản ghi DNS qua nhiều năm. Rất nhiều doanh nghiệp chỉ đổi DNS sang Cloudflare mà không hề thay đổi địa chỉ IP của server backend.
Cách 2: Rò rỉ qua các bản ghi dịch vụ gửi mail (MX, SPF, DKIM)
Nhiều ứng dụng web gửi email kích hoạt tài khoản hoặc đặt lại mật khẩu trực tiếp từ chính máy chủ backend.
- Bản ghi
SPF(v=spf1 ip4:203.0.113.10 ...) thường liệt kê rõ các IP được phép gửi mail đại diện cho domain. - Khi người dùng đăng ký nhận tin, máy chủ backend gửi mail trực tiếp tới máy chủ người nhận. Mở raw email header, trường
Received: from ... [IP]thường để lộ chính xác IP máy chủ thật.
Cách 3: Bẫy kết nối ngược qua tính năng Webhook hoặc SSRF
Nếu ứng dụng có tính năng cho phép nhập URL (như nhập link Webhook, đổi ảnh đại diện từ URL như bài Bản chất SSRF), bạn chỉ cần nhập URL trỏ về máy chủ lắng nghe của mình (http://your-server.com/callback). Khi backend của mục tiêu gửi request tới bạn, log kết nối sẽ hiển thị địa chỉ IP nguồn (Egress IP), thường chính là Origin IP hoặc cùng subnet với cụm máy chủ backend.
Cách 4: Quét toàn cầu đối chiếu Favicon Hash & SSL Certificate
Các công cụ tìm kiếm không gian mạng (Shodan, Censys, FOFA) quét toàn bộ dải IPv4 công cộng định kỳ:
- Mỗi trang web thường có một file biểu tượng
favicon.ico. Thuật toán MurmurHash3 chuyển đổi file này thành một mã hash số học duy nhất. - Tìm kiếm trên Shodan:
http.favicon.hash:<hash_number>. Shodan sẽ liệt kê toàn bộ các địa chỉ IP trên thế giới đang phục vụ cùng file favicon đó. Nếu một IP đơn lẻ trả về favicon trùng khớp với trang đích, xác suất đó chính là Origin IP lên tới 90%.
import mmh3, base64, requests
def calculate_favicon_hash(url: str) -> int:
"""Calculate MurmurHash3 of favicon for Shodan/Censys query."""
response = requests.get(url, verify=False, timeout=5)
b64_content = base64.encodebytes(response.content)
return mmh3.hash(b64_content)
# Vi du truy van Shodan: http.favicon.hash:-12345678
Thử ngẫmSau khi tìm được một IP nghi ngờ là Origin IP, nếu bạn gõ thẳng IP đó vào trình duyệt (http://203.0.113.45), tại sao máy chủ thường trả về trang mặc định của Nginx (Welcome to nginx) thay vì trang web mục tiêu?
Lý do là vì Nginx dựa vào trường header Host trong HTTP request để quyết định nạp server_block nào. Khi bạn gõ IP thô, header Host: 203.0.113.45 rơi vào default_server. Bạn bắt buộc phải cấu hình công cụ gửi kèm header Host: target.com để đánh thức đúng ứng dụng web mong muốn.
Bạn tìm được IP 198.51.100.22 nghi ngờ là Origin IP của trang https://shop.victim.corp. Lệnh cURL nào dưới đây kiểm tra chính xác nhất xem IP này có phục vụ ứng dụng backend hay không?
5. Pitfalls & Giải pháp phòng thủ triệt để
❌ Sai lầm phổ biến: Tin rằng đặt CDN ở trước là đủ an toàn
Nhiều đội ngũ kỹ thuật cấu hình Cloudflare nhưng lại để cổng 80 và 443 của máy chủ gốc mở toang ra toàn bộ Internet (0.0.0.0/0). Bất kỳ ai quét trúng dải IP đó đều có thể bypass toàn bộ luật WAF.
✅ Giải pháp chuẩn mực: Khóa chặt Origin Server (Origin Hardening)
Để bảo vệ Origin Server không bị phát hiện và khai thác trực tiếp, kiến trúc an toàn bắt buộc phải áp dụng đồng thời:
- Tường lửa cấp mạng (Security Group / IPTables): Chỉ cho phép kết nối inbound tới cổng 80/443 từ các dải IP chính thức của nhà cung cấp CDN (ví dụ danh sách IP public của Cloudflare). Mọi request từ các địa chỉ IP khác đều bị DROP ngay lập tức tại tầng mạng.
- Authenticated Origin Pulls (mTLS): Thiết lập xác thực chứng chỉ TLS hai chiều (Mutual TLS) giữa CDN và Origin. Máy chủ backend sẽ từ chối kết nối nếu client không trình ra chứng chỉ số hợp lệ do CDN ký. Kẻ tấn công dù có biết IP thật cũng không thể bắt tay TLS thành công.
- Cloudflare Tunnels (Argo Tunnel):
Máy chủ backend không mở bất kỳ cổng inbound nào ra Internet. Thay vào đó, một tiến trình nhẹ (
cloudflared) chạy trên server thiết lập kết nối outbound ngược về mạng lưới Cloudflare. Máy chủ hoàn toàn không có IP công cộng (No Public IP).
6. Liên hệ các bài khác
Kiến thức trinh sát diện rộng kết nối mật thiết với các kỹ thuật khai thác ứng dụng chuyên sâu:
- Bóc tách mã nguồn sau khi tìm được asset: Sau khi đã lập bản đồ các tên miền phụ và endpoint, bạn sẽ tiếp tục giải phẫu các file JavaScript client-side tại Bài 02 — JavaScript Recon: Đào tìm API ẩn từ Bundle Minify.
- Kỹ thuật bẫy kết nối ngược: Xem lại cách máy chủ phản hồi trong Bài SSRF Parser Discrepancies để hiểu cách lợi dụng tính năng web import làm lộ Origin IP.
- Nền tảng gói tin và Header Host: Ôn lại cơ chế định tuyến Virtual Host tại Bài 01 — Giải phẫu Web Traffic.
7. Tóm tắt
- Scope Expansion là phương pháp luận mở rộng bề mặt kiểm thử từ một domain ban đầu ra toàn bộ hạ tầng liên quan (Subdomains, ASN, IP ranges).
- Certificate Transparency (CT) logs lưu giữ vĩnh viễn mọi chứng chỉ SSL được cấp phát, là nguồn trinh sát tên miền phụ thụ động hiệu quả nhất.
- Lịch sử DNS, SPF mail headers, Favicon hashes và các tính năng kích hoạt outbound request là những con đường phổ biến làm lộ Origin IP thật.
- Khi tìm được Origin IP, việc truyền trực tiếp header
Hostgiúp bạn tiếp cận backend nội bộ mà không bị chặn bởi Cloud WAF. - Biện pháp phòng thủ tối thượng là đóng hoàn toàn cổng mạng công cộng của Origin, chỉ cho phép dải IP của CDN hoặc sử dụng mTLS (Authenticated Origin Pulls).
8. Tự kiểm tra
- Q1Vì sao Certificate Transparency logs lại có thể để lộ cả các tên miền phụ nội bộ không được công khai trên DNS server ngoài internet?
- Q2Trong lệnh cURL, cờ --resolve hoạt động như thế nào và tại sao nó lại hữu ích khi kiểm tra Origin IP?
- Q3Tại sao việc phân tích bản ghi SPF (Sender Policy Framework) của tên miền lại có thể tìm ra địa chỉ IP thật của máy chủ web?
- Q4Cơ chế Authenticated Origin Pulls (mTLS) ngăn chặn kỹ thuật bypass WAF qua Origin IP như thế nào?
- Q5Favicon Hash Matching giúp phát hiện máy chủ mục tiêu trên Shodan theo nguyên lý nào?
Bài tiếp theo: JavaScript Recon: Đào tìm API ẩn từ Bundle Minify
Tổng quan module Phương pháp luận Săn Bug Hiện đại
Bài tiếpJavaScript Recon: Đào tìm API ẩn từ Bundle Minify
Bài này có giúp bạn hiểu bản chất không?
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Thảo luận & góp ý
Hỏi đáp về bài này