子域名接管(Subdomain Takeover)漏洞与防护(进阶实战篇)
字数 2603 2025-12-09 12:41:33
子域名接管(Subdomain Takeover)漏洞与防护(进阶实战篇)
描述
子域名接管是一种安全漏洞,当攻击者能够控制某个子域名的DNS记录指向的云服务资源(如AWS S3存储桶、Azure Web应用、GitHub Pages等)不再被应用程序所有者使用时,攻击者可以“接管”这个子域名,从而将其指向自己控制的资源,进而进行网络钓鱼、恶意软件分发、Cookie窃取、绕过同源策略甚至扩大攻击面(如获取本应仅该子域名可访问的敏感Cookie)。本进阶实战篇将在基本概念上,深入探讨在混合云和现代CI/CD环境下的攻击变种、自动化检测手段以及纵深防御策略。
解题过程
-
漏洞核心原理与前提条件
- 核心:域名(如
app.example.com)的DNS记录(通常是CNAME记录)指向一个第三方服务提供的资源地址(如myapp.azurewebsites.net)。 - 接管前提:
a. 资源被释放:应用程序所有者删除了在第三方服务上对应的资源(如删除了Azure Web应用、清空了S3存储桶并删除了存储桶)。
b. DNS记录未清理:相应的DNS CNAME记录仍然保留,指向那个“空闲”的地址。
c. 资源可被注册:攻击者能够在该第三方服务上创建或注册同名/同标识的资源(例如,在Azure上成功创建名为myapp的Web应用)。
- 核心:域名(如
-
进阶攻击向量与场景分析
- 多云/混合云环境:子域名CNAME可能指向AWS CloudFront、Azure CDN、Google Cloud Storage等。每个服务的“资源释放”定义不同(如CloudFront分发被禁用但未删除)。攻击者需了解各平台特性。
- CI/CD与自动化部署:开发人员可能通过脚本自动创建临时环境(如预览部署)并配置DNS,但清理脚本失败会导致“僵尸”子域名。攻击者可监控此类模式。
- 供应商锁定与遗留记录:在更换云供应商或服务时,旧CNAME记录未被移除,攻击者可在原供应商处注册资源。
- 通配符子域名的滥用:如果主域使用了通配符DNS记录(
*.example.comCNAME指向某个服务),攻击者可以接管任何未被主动使用的子域名,而不仅限于已知的。 - 组合攻击:接管子域名后,攻击者可以:
- 托管恶意内容,欺骗用户。
- 利用浏览器的同源策略,窃取主域或其他子域设置的Cookie(如果Cookie的
domain属性设置为父级域,如.example.com)。 - 作为其他攻击的中继站(如钓鱼、C2服务器)。
- 在内部网络场景中,接管内部使用的子域名可能导致内部服务凭证泄露。
-
自动化检测与发现
- 被动侦察:通过证书透明度日志(如crt.sh)、DNS历史记录查询(如SecurityTrails, DNSDumpster)、搜索引擎(
site:*.example.com)枚举所有历史及当前子域名。 - 主动扫描:
a. DNS查询:对枚举出的子域名进行DNS查询,重点是CNAME记录。
b. 服务存在性检查:解析出CNAME指向的目标地址(如xxx.cloudfront.net)后,尝试访问该地址。如果返回“NoSuchBucket”、“404 Not Found”等特定错误,则可能存在接管风险。
c. 自动化验证:通过工具(如SubOver, Subjack, nuclei templates)模拟攻击者,自动检查CNAME指向的云服务端点是否可被注册。这些工具内置了大量云服务商指纹和验证逻辑。
- 被动侦察:通过证书透明度日志(如crt.sh)、DNS历史记录查询(如SecurityTrails, DNSDumpster)、搜索引擎(
-
漏洞确认与利用步骤
- 步骤1:信息收集:确认子域名
vulnerable.example.com的CNAME记录指向myapp.herokudns.com。 - 步骤2:服务状态探测:访问
myapp.herokuapp.com,返回“No such app”错误页面。 - 步骤3:资源注册尝试:在Heroku上尝试创建一个名为
myapp的应用。如果成功,证明该“命名空间”可用。 - 步骤4:验证接管:访问
vulnerable.example.com,浏览器将加载攻击者在Heroku上托管的任意页面,漏洞确认。 - 步骤5:恶意利用:在接管的应用上部署:
- 虚假登录页面,窃取凭证。
- 托管恶意JavaScript,利用Cookie的
domain属性为.example.com来窃取会话。 - 设置重定向到恶意网站。
- 步骤1:信息收集:确认子域名
-
纵深防护策略
- 生命周期管理:建立子域名与外部资源的严格清单。在删除云资源时,必须同步删除DNS记录。将DNS记录管理纳入基础设施即代码(IaC)流程,确保一致性。
- 监控与告警:
- 使用自动化工具(如OWASP AMASS, Monitor)持续监控组织的DNS记录,并与已知资产清单对比,发现未知或可疑记录。
- 监控证书透明度日志,及时发现为你的子域名颁发的未经授权的SSL证书。
- 设置告警,当DNS查询返回已知的危险错误页面(如AWS S3的NoSuchBucket)时通知安全团队。
- 技术性保留:在删除云资源前,先在该资源上托管一个静态页面,明确声明“此域名已停用”或重定向回主站,然后再删除资源。这可以延迟攻击窗口。
- 谨慎使用通配符:避免使用通配符DNS记录(
*.example.com),除非绝对必要。如果必须使用,确保所指向的服务有严格的访问控制,防止任意子域名被创建。 - 安全的Cookie设置:为Cookie设置明确的
Domain和Path属性,避免过度放宽(如使用顶级域.example.com)。使用SameSite=Strict或Lax属性。 - 定期审计:定期执行子域名接管扫描,作为渗透测试和红队演练的常规环节。可使用内部工具或商业安全平台。
- 供应商特定防护:了解并利用云服务商提供的防护功能。例如,AWS S3存储桶名称全局唯一,删除后需等待其他用户可能注册,可使用S3阻止公共访问策略和MFA删除。Azure App Service支持自定义域名绑定验证,可防止未经授权的绑定。
通过以上步骤,我们可以深入理解子域名接管漏洞的完整生命周期,从原理、发现、利用到建立一套主动的、自动化的、纵深的防御体系,从而有效管理企业日益增长的云资产和子域名攻击面。