子網域接管
| , 3 minutes reading.
1. 定義
子網域接管 發生在子網域的 DNS 記錄指向已被取消設定或從未正確設定的外部服務(如雲端託管、CDN 或 SaaS 平台)時。攻擊者可以聲明這個未設定的資源,從而有效控制該子網域。
這個漏洞很危險,因為:
- 攻擊者控制著您受信任網域下的內容
- 作用於父網域的 Cookie 可能被存取
- 用戶信任該子網域是合法的
- 可被用於釣魚、憑證竊取或惡意軟體散布
2. 技術原理
如何發生:
- 公司建立
blog.example.com指向雲端服務(如 GitHub Pages、Heroku、AWS S3)。 - 後來,雲端資源被刪除,但 DNS 記錄仍然存在。
- 子網域現在指向一個未被認領的資源。
- 攻擊者在雲端平台上建立同名的新資源。
- 攻擊者現在控制了
blog.example.com。
易受攻擊的 DNS 記錄類型:
- CNAME 記錄:
blog.example.com CNAME example.github.io- GitHub 儲存庫已刪除 - A 記錄: 指向可被重新分配的已釋放雲端 IP
- NS 記錄: 委派給攻擊者可以註冊的名稱伺服器
常見易受攻擊的服務:
| 服務 | 指示器 | 接管方法 |
|---|---|---|
| GitHub Pages | 404 - “There isn’t a GitHub Pages site here” | 建立符合名稱的儲存庫 |
| Heroku | ”No such app” | 建立同名應用程式 |
| AWS S3 | ”NoSuchBucket” | 建立同名儲存貯體 |
| Azure | ”404 Web Site not found” | 聲明資源名稱 |
| Shopify | ”Sorry, this shop is currently unavailable” | 註冊 myshopify.com 子網域 |
| Fastly | ”Fastly error: unknown domain” | 將網域新增到 Fastly 帳戶 |
3. 攻擊流程
sequenceDiagram
participant DNS as DNS 伺服器
participant Attacker as 攻擊者
participant User as 受害用戶
participant Cloud as 雲端服務提供商
Note over DNS: blog.example.com<br/>CNAME → old-app.herokuapp.com<br/>(資源已刪除)
Attacker->>Cloud: 檢查 old-app 是否可用
Cloud-->>Attacker: 資源名稱可用
Attacker->>Cloud: 建立名為 old-app 的新應用程式
Cloud-->>Attacker: 應用程式建立成功
Attacker->>Cloud: 部署惡意內容
User->>DNS: 解析 blog.example.com
DNS-->>User: CNAME → old-app.herokuapp.com
User->>Cloud: 請求 old-app.herokuapp.com
Cloud-->>User: 攻擊者控制的內容<br/>在 example.com 子網域下提供
Note over User: 用戶看到合法的<br/>example.com 網域<br/>信任該內容4. 真實案例:Vine (Twitter) 子網域接管 (2014)
目標: Vine(Twitter 的影片平台)。 漏洞類別: 透過 Fastly CDN 的子網域接管。
漏洞背景: 安全研究公司 Detectify 發現 attachments.vine.co 有一條指向 Fastly CDN 的 CNAME 記錄,但 Fastly 設定已被移除。
攻擊場景:
- 子網域
attachments.vine.co指向 Fastly。 - Fastly 返回錯誤,表明該網域未設定。
- 任何擁有 Fastly 帳戶的人都可以聲明這個網域。
- 攻擊者隨後可以在
attachments.vine.co上提供任意內容。
潛在影響:
- Cookie 竊取: Vine 的工作階段 Cookie 可能作用於
*.vine.co,這意味著攻擊者可以竊取用戶工作階段。 - 釣魚: 用戶看到 URL 中的
vine.co會信任該內容。 - OAuth 劫持: 如果 Vine 使用這個子網域進行 OAuth 回呼,攻擊者可以攔截權杖。
解決方案: Twitter 透過其漏洞獎金計畫收到通知,並及時移除了懸空的 DNS 記錄。
5. 深度防禦策略
A. DNS 衛生
維護所有 DNS 記錄的準確清單。
- 定期稽核: 定期審查所有 DNS 記錄,驗證它們指向活躍資源。
- 退役流程: 在取消設定雲端資源之前,始終先移除 DNS 記錄。
- 文件: 記錄每個子網域由哪個團隊負責。
# 稽核指令碼範例
for subdomain in $(cat subdomains.txt); do
result=$(dig +short $subdomain)
if [ -z "$result" ]; then
echo "DANGLING: $subdomain"
fi
doneB. 自動化監控
使用工具持續掃描易受攻擊的子網域。
- 工具:
subjack- 子網域接管偵測nuclei- 帶有接管範本的漏洞掃描器can-i-take-over-xyz- 社群維護的易受攻擊服務清單
# 使用 subjack
subjack -w subdomains.txt -t 100 -timeout 30 -o results.txt -sslC. 主動聲明資源
即使您不使用某項服務,也要聲明命名空間。
- 策略: 使用您的網域名稱在主要雲端平台上建立佔位資源。
- 範例: 如果您擁有
example.com,在 GitHub、Heroku 等上聲明example。
D. 使用經過驗證的網域擁有權
選擇驗證網域擁有權的雲端服務。
- 驗證方法:
- TXT 記錄驗證
- HTTP 檔案驗證
- Meta 標籤驗證
具有適當驗證的服務可以防止攻擊者聲明您的網域。
E. Cookie 安全
如果子網域被攻陷,限制爆炸半徑。
- 明確網域範圍: 設定帶有明確網域的 Cookie(無前導點)。
- 分離 Cookie 網域: 對敏感 Cookie 使用不同的網域。
__Host-前綴: 對只應由主機設定的 Cookie 使用__Host-前綴。
# 壞:所有子網域可存取
Set-Cookie: session=abc123; Domain=.example.com
# 好:僅 www.example.com 可存取
Set-Cookie: session=abc123; Domain=www.example.com
# 最好:主機繫結 Cookie
Set-Cookie: __Host-session=abc123; Secure; Path=/F. 實施 CAA 記錄
限制哪些憑證頒發機構可以為您的網域頒發憑證。
example.com. CAA 0 issue "letsencrypt.org"
example.com. CAA 0 issuewild "letsencrypt.org"
example.com. CAA 0 iodef "mailto:security@example.com"這可以防止攻擊者為被接管的子網域取得 SSL 憑證。
G. 所有子網域的安全標頭
即使是非正式環境子網域也應該有安全標頭。
Content-Security-Policy: default-src 'self'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff