mcpField
S
subdomain-takeover-hunt

subdomain-takeover-hunt

github.com/uphiago安全1.3k41 次安装8 周前更新
代码仓库

关于 subdomain-takeover-hunt

用于查找和验证 DNS 指向未认领第三方服务的子域名,面向安全测试人员。流程涵盖 CNAME 发现、手动确认和结果记录。

主要功能

  1. 01提取并筛选 CNAME 记录
  2. 02使用 subzy 和 subjack 扫描
  3. 03检查服务特定错误响应
  4. 04手动验证候选项
  5. 05记录发现并排除误报

适用场景

  1. 01检查枚举出的子域名是否存在悬空 DNS
  2. 02调查 NXDOMAIN 或服务错误页面
  3. 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 Pages404 — “There isn't a GitHub Pages site here”是
Shopify“Sorry, this shop is currently unavailable”是
Netlify“Not Found” / “Site not found”是
Vercel404 — “DEPLOYMENT_NOT_FOUND”是
Bitbucket“Repository not found”是
Surge.sh“project not found”是
Readme.io“Project not found”是
Statuspage404 — 状态页未找到是
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)会产生误报。 扫描接管问题前,请过滤通配符响应。

验证

  1. dig SUBDOMAIN CNAME +short 返回的服务具有可由用户注册的命名空间。
  2. curl --max-time 30 --connect-timeout 10 -sk https://SUBDOMAIN 返回特定于该服务的错误页面,表明该资源可用。
  3. CNAME 目标未解析到 CDN 或负载均衡器。
  4. 上报前记录确切的错误消息和服务类型。

相关技能

  • subdomain-enumeration — 生成用于接管扫描的子域名列表。
  • origin-ip-discovery — 如果发现接管问题,检查同一 IP 是否托管其他服务。
  • port-service-discovery — 扫描 CNAME 解析出的 IP,查找其他暴露的服务。

评论

支持 Markdown