子域名枚舉是網路偵察(Reconnaissance)中的一個關鍵步驟,目的是找到一個主域名下所有相關的子域名,接著攻擊者就可根據子域名清單安排攻擊計劃。
想像一個大公司(例如 example.com
),它可能會有許多不同的部門和服務,例如:
www.example.com
(主要網站)blog.example.com
(部落格)shop.example.com
(線上商店)dev.example.com
(開發伺服器)vpn.example.com
(VPN 服務)
這些子域名可能託管在不同的伺服器上,擁有不同的安全配置。一個看似安全的網站,其子域名可能存在配置錯誤或舊版本的服務,從而成為駭客的突破口。因此,找到這些「隱藏」的子域名,對於滲透測試人員來說至關重要。
子域名枚舉用途
- 擴大攻擊面(Attack Surface): 駭客可以透過子域名枚舉,發現主域名之外的潛在漏洞。
- 發現被遺忘的資產: 許多公司會有未被更新或監控的舊子域名,這些「幽靈資產」往往成為未受保護的入口。
- 獲取敏感資訊: 像
dev.example.com
或staging.example.com
這樣的子域名,可能包含測試資料、原始碼或未公開的服務,這些都可能成為敏感資訊洩漏的來源。
子域名枚舉的兩種主要方法
子域名枚舉可以分為兩大類:被動式和主動式。
1. 被動式枚舉 (Passive Enumeration)
這種方法不與目標伺服器直接互動,因此不會留下任何日誌記錄。它利用公開可用的資料來尋找子域名。
- DNS 歷史紀錄: 像 VirusTotal、SecurityTrails 等網站會收集 DNS 歷史數據。查詢這些資料庫,可以找到過去或現在的子域名。
- 空間搜尋引擎: Shodan、Censys 和 Fofa 等工具會持續掃描整個網際網路,並索引網站的 SSL 憑證資訊。許多子域名會共用同一個 SSL 憑證,因此透過查詢憑證上的 Subject Alternative Names (SANs) 欄位,就能找到相關的子域名。
- Certificate Transparency (CT) logs:這些憑證通常在其主題備用名稱 (SAN) 欄位中包含關聯子網域的列表,從而為潛在目標提供了寶庫。例如:
curl -s "https://crt.sh/?q=facebook.com&output=json"
- Google Hacking (Google Dorks): 使用 Google 的
site:
運算符,可以強制搜尋 Google 索引中的特定子域名。例如:site:*.example.com
。
2. 主動式枚舉 (Active Enumeration)
這種方法需要直接向目標的 DNS 伺服器發送查詢請求,會留下記錄,但通常能找到更完整的結果。
- 字典爆破(Brute-Force): 這是最常見的方法。工具會使用一個龐大的子域名字典(例如
www
、api
、mail
、admin
、test
、dev
等),逐一對目標域名進行 DNS 查詢。如果查詢成功,就代表該子域名存在。 - DNS 區域傳輸(Zone Transfer): 這是一種較少見的漏洞。如果 DNS 伺服器配置不當,攻擊者可以要求伺服器傳輸整個區域的 DNS 記錄,從而獲取所有子域名的完整列表。
常見工具
- 被動式:
Amass
、Sublist3r
、Subfinder
。這些工具通常會整合多種來源,如空間搜尋引擎和 DNS 歷史資料庫。 - 主動式:
Massdns
、Gobuster
、DNSRecon
、dnsenum
。這些工具善於進行字典爆破,並能快速有效地進行 DNS 查詢。
在實際的偵察工作中,滲透測試人員會將被動式和主動式方法結合使用,先進行安靜的被動式偵察,獲取公開資訊,然後再用主動式工具進行更深入的探測,以達到最完整的枚舉效果。
子域名枚舉指令
空間搜尋引擎
屬於被動式偵察方法,這些語法主要利用服務憑證(SSL/TLS)、主機名稱(host)或網頁內容來進行查詢
Fofa
Fofa 的語法簡潔但功能強大,主要依賴於 host
、cert
和 domain
等關鍵字。
- 查詢所有與主域名相關的主機這個語法會搜尋任何主機名稱中包含 example.com 的主機。
host="example.com"
- 查詢 SSL 憑證中的主體(Subject)這是尋找子網域最精確的方式。憑證主體通常包含主網域和通配符子網域(*.example.com)。
cert.subject="example.com"
- 查詢 SSL 憑證中的備用名稱(SANs)這個語法會查詢憑證中所有列出的主機名稱(SANs),這通常包含了所有子網域。
cert.subject.cn="*.example.com" || cert.subject.cn="example.com"
- 結合 domain 關鍵字domain 關鍵字可以直接指定要搜尋的網域,這是非常方便且常用的語法。
domain="example.com"
Shodan
Shodan 的語法也非常直觀,主要使用 ssl
相關的過濾器來尋找憑證資訊。
- 查詢 SSL 憑證的通用名稱(Common Name, CN)這是 Shodan 尋找子網域的標準方法。
ssl.cert.subject.cn: "example.com"
- 查詢 SSL 憑證的備用名稱(SANs)這與 Fofa 類似,能夠找出憑證中包含的所有相關網域。
ssl.cert.sans: "example.com"
- 尋找主機名稱(Hostname)這可以找出服務標語(banner)中列出的主機名稱。
hostname: "example.com"
Censys
Censys 的語法更為精細,因為它會對每個服務的每個欄位都建立索引,所以你可以進行非常精確的查詢。
- 查詢 SSL/TLS 憑證中的主體名稱
services.tls.certificates.leaf_data.subject.organization: "Example Inc."
這會尋找憑證中組織名稱為Example Inc.
的所有主機。 - 查詢子網域名稱(Subdomain)這是 Censys 獨有的功能之一,可以非常直接地查詢子網域。
services.dns.subdomain: "example.com"
或者使用通配符來尋找所有子網域:services.dns.subdomain: "*.example.com"
- 結合 hostname 查詢這個語法會尋找任何主機名稱中包含 example.com 的主機。
services.http.response.request.host: "example.com"
dnsenum
一個開源的、用於DNS 枚舉的工具。它的主要功能是自動化收集目標域名相關的 DNS 資訊,以供後續的偵察和滲透測試使用。該工具從不同層面來收集目標的網路資訊:
- DNS 記錄枚舉(DNS Record Enumeration):這是最基礎也是最重要的一步,讓你了解目標的網路架構。
- 區域傳輸嘗試(Zone Transfer Attempts):這是尋找「配置不當」伺服器的關鍵。雖然成功的機率不高,但一旦成功,其回報是巨大的。
- 子域名爆破(Subdomain Brute-Forcing):這是一種主動式偵察,能發現那些沒有公開在 DNS 記錄中、只有內部使用的子域名。
- Google 爬取(Google Scraping):這是結合被動式偵察的優勢,利用 Google 索引來尋找公開的子域名。
- 反向查詢(Reverse Lookup):這對於識別同一個 IP 位址上託管的其他域名(也就是虛擬主機)非常有幫助。
- WHOIS 查詢(WHOIS Lookups):這能讓你了解網域的註冊資訊,有時可以發現聯絡人、地址等敏感信息。
指定想要列舉的目標網域: dnsenum --enum example.com
DNS區域傳輸
屬於主動式偵察方法,要求負責的DNS 伺服器完整區域傳輸。如果伺服器配置錯誤並允許傳輸,將收到該網域的完整 DNS 記錄列表,包括所有子網域
dig axfr @nsztm1.digi.ninja zonetransfer.me
; <<>> DiG 9.18.12-1~bpo11+1-Debian <<>> axfr @nsztm1.digi.ninja zonetransfer.me
; (1 server found)
;; global options: +cmd
zonetransfer.me. 7200 IN SOA nsztm1.digi.ninja. robin.digi.ninja. 2019100801 172800 900 1209600 3600
zonetransfer.me. 300 IN HINFO "Casio fx-700G" "Windows XP"
zonetransfer.me. 301 IN TXT "google-site-verification=tyP28J7JAUHA9fw2sHXMgcCC0I6XBmmoVi04VlMewxA"
zonetransfer.me. 7200 IN MX 0 ASPMX.L.GOOGLE.COM.
...
zonetransfer.me. 7200 IN A 5.196.105.14
zonetransfer.me. 7200 IN NS nsztm1.digi.ninja.
zonetransfer.me. 7200 IN NS nsztm2.digi.ninja.
_acme-challenge.zonetransfer.me. 301 IN TXT "6Oa05hbUJ9xSsvYy7pApQvwCUSSGgxvrbdizjePEsZI"
_sip._tcp.zonetransfer.me. 14000 IN SRV 0 0 5060 www.zonetransfer.me.
14.105.196.5.IN-ADDR.ARPA.zonetransfer.me. 7200 IN PTR www.zonetransfer.me.
asfdbauthdns.zonetransfer.me. 7900 IN AFSDB 1 asfdbbox.zonetransfer.me.
asfdbbox.zonetransfer.me. 7200 IN A 127.0.0.1
asfdbvolume.zonetransfer.me. 7800 IN AFSDB 1 asfdbbox.zonetransfer.me.
canberra-office.zonetransfer.me. 7200 IN A 202.14.81.230
...
;; Query time: 10 msec
;; SERVER: 81.4.108.41#53(nsztm1.digi.ninja) (TCP)
;; WHEN: Mon May 27 18:31:35 BST 2024
;; XFR size: 50 records (messages 1, bytes 2085)