安全攻击者手册:CNAME子域名接管的7步指南

411 阅读3分钟

CNAME子域名接管是一种相对冷门但非常具有影响力的网络安全漏洞。

当一个域名指向一个已经停用的外部服务时,攻击者可能通过占用该服务接管子域名。

本指南将一步步带你了解如何发现并安全地进行CNAME接管操作。


第一步:了解CNAME记录

CNAME(Canonical Name)记录是DNS条目,用于将一个域名或子域名指向另一个域名。例如:

sub.example.com -> some-service.com

当目标服务(如some-service.com)停用时,该子域名可能会面临被接管的风险。


第二步:识别CNAME记录

要找到子域名及其关联的CNAME记录,可以使用以下工具:

  • 命令行工具dignslookup
  • 自动化工具:Sublist3r、Amass、Subfinder

运行以下命令以检查子域名的DNS配置:

dig sub.example.com

查看输出结果中是否有CNAME条目。


第三步:检查CNAME目标

当你发现一个子域名有CNAME记录时,需确认目标服务是否仍在使用。

通过以下方式检查目标服务:

curl -I https://target-service.com

如果返回错误信息,说明该服务未被占用。常见的错误信息包括:

  • Amazon S3No such bucket
  • GitHub PagesThere isn't a GitHub Pages site here.
  • HerokuNo such app
  • AzureResource not found

第四步:研究易受攻击的服务

并非所有服务都容易被接管。以下是一些常见的容易被接管的平台:

  • Amazon S3
  • GitHub Pages
  • Heroku
  • Microsoft Azure
  • Shopify

你可以参考资源 Can I take over XYZ 获取更多服务的详细信息。


第五步:占用资源

如果目标服务未被占用,按照以下步骤操作:

  1. 在相关平台上注册账号(如AWS、GitHub等)。
  2. 创建一个名称与目标资源完全相同的资源(如桶名、仓库名、应用名)。
  3. 确认你已经控制了目标子域名。

示例:如果sub.example.com指向my-bucket.s3.amazonaws.com且该桶不存在,你可以在自己的AWS账号中创建一个名为my-bucket的桶。


第六步:验证接管

完成资源创建后,测试子域名是否正确指向你的内容:

  1. 上传一个简单的HTML文件或占位文件到你的服务。
  2. 通过子域名访问,确认显示的是你的内容。

示例:如果sub.example.com显示了你上传的内容,则接管成功。


第七步:负责任地报告

作为一名道德黑客,需遵循负责任的披露原则:

  1. 用证据(如截图、日志)记录你的发现。
  2. 将问题报告给域名所有者,或通过其漏洞奖励计划提交。
  3. 提供防止未来漏洞的建议。

如何防止CNAME接管

对于企业,可以采取以下措施防范CNAME接管:

  1. 定期审查DNS记录:清理过时或未使用的条目。
  2. 移除未使用的服务:删除指向停用服务的CNAME记录。
  3. 验证所有权:使用需要验证域名所有权的平台。
  4. 使用通配符证书:确保所有子域名都有有效的SSL证书保护。

通过遵循本指南的步骤,你将能够掌握安全地进行CNAME子域名接管的基本方法。