Luke a Pro

Luke Sun

Developer & Marketer

🇺🇦
EN||

子網域接管

| , 3 minutes reading.

1. 定義

子網域接管 發生在子網域的 DNS 記錄指向已被取消設定或從未正確設定的外部服務(如雲端託管、CDN 或 SaaS 平台)時。攻擊者可以聲明這個未設定的資源,從而有效控制該子網域。

這個漏洞很危險,因為:

  • 攻擊者控制著您受信任網域下的內容
  • 作用於父網域的 Cookie 可能被存取
  • 用戶信任該子網域是合法的
  • 可被用於釣魚、憑證竊取或惡意軟體散布

2. 技術原理

如何發生:

  1. 公司建立 blog.example.com 指向雲端服務(如 GitHub Pages、Heroku、AWS S3)。
  2. 後來,雲端資源被刪除,但 DNS 記錄仍然存在。
  3. 子網域現在指向一個未被認領的資源。
  4. 攻擊者在雲端平台上建立同名的新資源。
  5. 攻擊者現在控制了 blog.example.com

易受攻擊的 DNS 記錄類型:

  • CNAME 記錄: blog.example.com CNAME example.github.io - GitHub 儲存庫已刪除
  • A 記錄: 指向可被重新分配的已釋放雲端 IP
  • NS 記錄: 委派給攻擊者可以註冊的名稱伺服器

常見易受攻擊的服務:

服務指示器接管方法
GitHub Pages404 - “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 設定已被移除。

攻擊場景:

  1. 子網域 attachments.vine.co 指向 Fastly。
  2. Fastly 返回錯誤,表明該網域未設定。
  3. 任何擁有 Fastly 帳戶的人都可以聲明這個網域。
  4. 攻擊者隨後可以在 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
done

B. 自動化監控

使用工具持續掃描易受攻擊的子網域。

  • 工具:
    • subjack - 子網域接管偵測
    • nuclei - 帶有接管範本的漏洞掃描器
    • can-i-take-over-xyz - 社群維護的易受攻擊服務清單
# 使用 subjack
subjack -w subdomains.txt -t 100 -timeout 30 -o results.txt -ssl

C. 主動聲明資源

即使您不使用某項服務,也要聲明命名空間。

  • 策略: 使用您的網域名稱在主要雲端平台上建立佔位資源。
  • 範例: 如果您擁有 example.com,在 GitHub、Heroku 等上聲明 example

D. 使用經過驗證的網域擁有權

選擇驗證網域擁有權的雲端服務。

  • 驗證方法:
    • TXT 記錄驗證
    • HTTP 檔案驗證
    • Meta 標籤驗證

具有適當驗證的服務可以防止攻擊者聲明您的網域。

如果子網域被攻陷,限制爆炸半徑。

  • 明確網域範圍: 設定帶有明確網域的 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:[email protected]"

這可以防止攻擊者為被接管的子網域取得 SSL 憑證。

G. 所有子網域的安全標頭

即使是非正式環境子網域也應該有安全標頭。

Content-Security-Policy: default-src 'self'
X-Frame-Options: DENY
X-Content-Type-Options: nosniff

6. 參考資料