关于 subdomain-takeover-hunt
用于查找和验证 DNS 指向未认领第三方服务的子域名,面向安全测试人员。流程涵盖 CNAME 发现、手动确认和结果记录。
主要功能
- 01提取并筛选 CNAME 记录
- 02使用 subzy 和 subjack 扫描
- 03检查服务特定错误响应
- 04手动验证候选项
- 05记录发现并排除误报
适用场景
- 01检查枚举出的子域名是否存在悬空 DNS
- 02调查 NXDOMAIN 或服务错误页面
- 03确认云服务目标是否可认领
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ uphiago/ recon-skills --skill subdomain-takeover-hunt安装后在 Claude Code 中输入/subdomain-takeover-hunt确认已加载。
详细介绍
子域名接管检测
检测指向未注册或无人认领的第三方云服务的子域名。当 CNAME 记录指向已不存在的服务时,攻击者可以注册该资源,并通过目标的子域名提供任意内容,从而实施钓鱼、窃取 Cookie,以及完全冒充源站。
适用场景
- 子域名枚举生成了大量结果——扫描是否存在遗留的 DNS 记录。
- 目标使用具有共享命名空间标识符的云服务(Heroku、S3、Azure、Zendesk、Shopify)。
- 子域名返回 NXDOMAIN、404 或“应用不存在”错误页面。
- CNAME 目标是允许用户注册名称的服务。
前提条件
- 安装了 curl、dnsx、subfinder 的
terminal。 - 已安装
subzy或subjack,用于自动检测。 - 来自
subdomain-enumeration的存活子域名列表。
快速检测
# DNS resolution with CNAME extraction
dnsx -retry 3 -a -cname -resp -silent -l alive_subs.txt | tee dns_records.txt
# Automated takeover scan
subzy run --targets alive_subs.txt --hide_fails --vuln
操作流程
阶段 1 — 提取 CNAME 记录
# Get all CNAME records
cat alive_subs.txt | dnsx -silent -cname -resp-only > cname_targets.txt
# Filter to suspicious services
grep -iE "heroku|s3\.amazonaws|azure|zendesk|shopify|github\.io|bitbucket|surge\.sh|netlify|vercel|ghost\.io|readme|statuspage|pantheon|desk\.com|campaignmonitor|intercom|unbounce|wordpress\.com|cargo\.collective" \
cname_targets.txt > takeover_candidates.txt
阶段 2 — 自动检测
# subzy — fast, shows vulnerable + fingerprint
subzy run --targets alive_subs.txt --hide_fails --vuln
# subjack — with custom fingerprints
subjack -w alive_subs.txt -t 100 -timeout 30 -o takeover_results.txt \
-ssl -c ~/subjack/fingerprints.json -v
# nuclei — takeover templates
nuclei -l alive_subs.txt \
-t nuclei-templates/takeovers/ \
-o nuclei_takeover_results.txt
阶段 3 — 手动验证
# For each candidate, verify the service is claimable
CANDIDATE="api.target.com"
# Check what the CNAME points to
dig $CANDIDATE CNAME +short
# Check HTTP response
curl --max-time 30 --connect-timeout 10 -skI "https://$CANDIDATE" | head -10
# Key service-specific verification:
# Heroku: visit https://CANDIDATE — "no such app" = claimable
# S3: curl -s https://BUCKET_NAME.s3.amazonaws.com — 404 NoSuchBucket = claimable
# Zendesk: visit https://CANDIDATE — "account not found" = claimable
# GitHub Pages: dig CNAME returns user.github.io — 404 = claimable
# Azure: visit https://CANDIDATE — "tenant not found" = claimable
# Shopify: visit https://CANDIDATE — "Sorry, this shop is currently unavailable"
阶段 4 — S3 接管流程
subfinder -d target.com -silent \
| dnsx -silent -cname \
| grep "s3.amazonaws" \
| while read line; do
sub=$(echo "$line" | awk '{print $1}' | sed 's/\.$//')
curl --max-time 30 --connect-timeout 10 -sk "https://$sub" | grep -q "NoSuchBucket" && echo "CLAIMABLE: $sub"
done
阶段 5 — 服务特征参考
| 服务 | 错误消息或特征 | 可认领信号 |
|---|---|---|
| Heroku | “No such app” / “There's nothing here” | 是 |
| S3 | “NoSuchBucket” / “The specified bucket does not exist” | 是 |
| Azure | “tenant not found” / “This tenant is not found” | 是 |
| Zendesk | “account not found” / “Help Center Closed” | 是 |
| GitHub Pages | 404 — “There isn't a GitHub Pages site here” | 是 |
| Shopify | “Sorry, this shop is currently unavailable” | 是 |
| Netlify | “Not Found” / “Site not found” | 是 |
| Vercel | 404 — “DEPLOYMENT_NOT_FOUND” | 是 |
| Bitbucket | “Repository not found” | 是 |
| Surge.sh | “project not found” | 是 |
| Readme.io | “Project not found” | 是 |
| Statuspage | 404 — 状态页未找到 | 是 |
| Desk.com | “This site is currently not available” | 是 |
| Campaign Monitor | “Trying to get your email from” | 是 |
| Intercom | “This page is reserved for Intercom customers” | 是 |
| Unbounce | “The requested URL was not found” | 是 |
| WordPress.com | “Do you want to register domain.wordpress.com?” | 是 |
注意事项
- CNAME 解析到 CDN 服务并不构成发现。 Cloudflare/CloudFront/Akamai 子域名无法认领。
- CNAME 可能指向有效且正在使用的服务。 将其作为发现上报前,务必验证错误页面。
- 某些服务会阻止自动扫描器。 请在浏览器中访问 URL 进行确认。
- 子域名接管需要注册目标资源。 未获得明确授权时,切勿注册资源。
- 通配符 DNS(
*.target.com→ IP)会产生误报。 扫描接管问题前,请过滤通配符响应。
验证
dig SUBDOMAIN CNAME +short返回的服务具有可由用户注册的命名空间。curl --max-time 30 --connect-timeout 10 -sk https://SUBDOMAIN返回特定于该服务的错误页面,表明该资源可用。- CNAME 目标未解析到 CDN 或负载均衡器。
- 上报前记录确切的错误消息和服务类型。
相关技能
subdomain-enumeration— 生成用于接管扫描的子域名列表。origin-ip-discovery— 如果发现接管问题,检查同一 IP 是否托管其他服务。port-service-discovery— 扫描 CNAME 解析出的 IP,查找其他暴露的服务。
评论
支持 Markdown