子域名接管漏洞深度解析与防御实践

本文深入探讨子域名接管漏洞的形成机制,通过实际dig命令演示分析DNS配置中的安全隐患,介绍现有检测工具并分享自研工具Subtake的实现原理,帮助开发者和安全人员有效防范此类威胁。

子域名接管漏洞深度解析

让我们深入了解子域名接管漏洞,探讨什么使Web应用容易受到此类攻击,以及如何避免这种情况发生。

理解子域名接管的最佳方式

理解子域名接管的最佳方式是了解DNS层发生的情况,让我们通过使用dig命令的示例来查看。

dig命令输出解析

当我们运行dig CNAME domain时,我们通常是在询问"这个域名是否有CNAME记录?" CNAME记录是另一个域名的别名记录,当多个名称应指向同一主机或服务时很有用。但是,如果CNAME不在您的控制范围内,有时这也可能使应用程序容易受到攻击。

让我们仔细看看为什么这个域名不容易受到域名接管。

深入挖掘CNAME

1
dig CNAME myapp.api.acme.com

当我们运行dig CNAME domain时,我们通常是在询问"这个域名是否有CNAME记录?"

CNAME记录是另一个域名的别名记录,当多个名称应指向同一主机或服务时很有用。但是,如果CNAME不在您的控制范围内,有时这也可能使应用程序容易受到攻击。

从输出中,我们可以看到ANSWER: 0,所以没有CNAME记录。当我们询问上述域名是否有有效的CNAME记录时,答案是否定的。但这并不意味着它没有指向任何地方,只意味着它没有使用CNAME记录来这样做。

仍然可能有A、AAAA、ALIAS记录,这就是我们示例中的情况。

dig输出显示:

  • 当前没有为myapp.api.acme.com设置CNAME记录
  • 没有CNAME的事实告诉您这不是任何其他域名的别名
  • 查询回退到acme.com的权威区域,该区域在Google Cloud DNS上管理

因此,子域名myapp.api.acme.com没有指向任何地方——但它仍然在DNS区域中定义。

为什么不容易受到接管?

  • 该域名没有CNAME记录
  • 此外,如果CNAME记录是在主域的SOA区域内创建的,在所有者控制下(而不是指向像Vercel、GitHub、Netlify等第三方提供商),则不太可能容易受到攻击
  • 没有委托给任何外部服务
  • 记录根本不存在,但父区域(acme.com)仍然拥有它

因此,攻击者无法在任何地方注册或声明此子域名,因为它没有指向Acme控制的DNS区域之外。

子域名接管如何发生?

下图显示了一个容易受到子域名接管的应用的正常状态流程,当它进入悬空状态时(应用被移除但CNAME记录仍然存在于ACME DNS区域中),以及最后当攻击者成功接管子域名时发生的情况。

什么会使它容易受到攻击?

  • 如果外部资源不再存在
  • 攻击者可以回收或重新创建该资源(例如,注册相同的GitHub仓库名称或S3存储桶)
  • 然后流量将被重定向到攻击者的网站

易受攻击配置的示例:

1
dig CNAME test2.cybersamurai.co.uk

我们可以通过ANSWER:1看到,该域名有一个CNAME记录。

此记录的CNAME被重定向到v0.app,这是一个第三方,使该域名容易受到子域名接管。如果应用被删除,任何人都可以在v0.app中使用相同的名称创建新应用,并立即在test2.cybersamurai.co.uk下提供内容。

⚠️ 什么会使它容易受到攻击

如果Acme添加如下记录,myapp.api.acme.com将变得容易受到攻击:

1
myapp.api.acme.com. CNAME stage-app.herokuapp.com.

在这种情况下:

  • CNAME仍然存在
  • Heroku将返回"没有这样的应用"
  • 攻击者可以注册名为stage-app的Heroku应用并控制子域名

CNAME如何保护(或不保护)子域名

CNAME本身并不"保护"域名——这取决于它指向的位置以及谁控制目标。

然而:

  • 如果CNAME指向由Acme拥有和控制的域名(例如,另一个acme.com子域名或GCP托管服务),那是安全的——因为没有人可以声明该目标
  • 如果CNAME指向第三方平台(例如GitHub Pages、AWS、Netlify),如果该资源后来被移除,它可能变得容易受到攻击

所以规则是:学习就是实践

学习就是实践

学习的最佳方式是写下来,如果可能的话,为什么不编写自己的程序来帮助巩固对主题的理解,这就是我所做的。

我已经熟悉了一些检查域名接管的好工具。

1
2
3
4
5
6
7
8
subzy
subzy run --targets domains.txt --timeout 30

subjack
subjack -w domains.txt --timeout 30 -t 100 -v

nuclei
nuclei -tl | grep takeover

然而,我发现学习的最佳方式是尝试自己编写一些东西,这样我就可以看到代码的运行情况。正如一位老朋友告诉我的:“学习的最佳方式是重复重复重复”

新工具Subtake

这是我创建的一个名为subtake的工具

Subtake可在github上获得,并将执行我们在本文中讨论的检查。

工作原理

主程序用bash脚本编写,使用dig和正则表达式构建,简单而强大的工具。

它将在指定的域名或提供的文件列表上执行查找,如果dig CNAME domain的结果可用,并且域名有一个CNAME在我们的易受攻击列表中,且IP不存在,这将把域名标记为"易受攻击"。如果CNAME在我们的易受攻击列表中且IP存在,域名被标记为"有风险"。如果CNAME不存在或不在我们的易受攻击列表中,域名被标记为"安全"。任何其他结果被标记为"未知"。

如果您喜欢这篇文章或对提到的任何内容有任何反馈,请在下面评论。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计