子域名接管漏洞深度解析
让我们深入了解子域名接管漏洞,探讨什么使Web应用容易受到此类攻击,以及如何避免这种情况发生。
理解子域名接管的最佳方式
理解子域名接管的最佳方式是了解DNS层发生的情况,让我们通过使用dig命令的示例来查看。
dig命令输出解析
当我们运行dig CNAME domain时,我们通常是在询问"这个域名是否有CNAME记录?" CNAME记录是另一个域名的别名记录,当多个名称应指向同一主机或服务时很有用。但是,如果CNAME不在您的控制范围内,有时这也可能使应用程序容易受到攻击。
让我们仔细看看为什么这个域名不容易受到域名接管。
深入挖掘CNAME
|
|
当我们运行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存储桶)
- 然后流量将被重定向到攻击者的网站
易受攻击配置的示例:
|
|
我们可以通过ANSWER:1看到,该域名有一个CNAME记录。
此记录的CNAME被重定向到v0.app,这是一个第三方,使该域名容易受到子域名接管。如果应用被删除,任何人都可以在v0.app中使用相同的名称创建新应用,并立即在test2.cybersamurai.co.uk下提供内容。
⚠️ 什么会使它容易受到攻击
如果Acme添加如下记录,myapp.api.acme.com将变得容易受到攻击:
|
|
在这种情况下:
- CNAME仍然存在
- Heroku将返回"没有这样的应用"
- 攻击者可以注册名为stage-app的Heroku应用并控制子域名
CNAME如何保护(或不保护)子域名
CNAME本身并不"保护"域名——这取决于它指向的位置以及谁控制目标。
然而:
- 如果CNAME指向由Acme拥有和控制的域名(例如,另一个acme.com子域名或GCP托管服务),那是安全的——因为没有人可以声明该目标
- 如果CNAME指向第三方平台(例如GitHub Pages、AWS、Netlify),如果该资源后来被移除,它可能变得容易受到攻击
所以规则是:学习就是实践
学习就是实践
学习的最佳方式是写下来,如果可能的话,为什么不编写自己的程序来帮助巩固对主题的理解,这就是我所做的。
我已经熟悉了一些检查域名接管的好工具。
|
|
然而,我发现学习的最佳方式是尝试自己编写一些东西,这样我就可以看到代码的运行情况。正如一位老朋友告诉我的:“学习的最佳方式是重复重复重复”
新工具Subtake
这是我创建的一个名为subtake的工具
Subtake可在github上获得,并将执行我们在本文中讨论的检查。
工作原理
主程序用bash脚本编写,使用dig和正则表达式构建,简单而强大的工具。
它将在指定的域名或提供的文件列表上执行查找,如果dig CNAME domain的结果可用,并且域名有一个CNAME在我们的易受攻击列表中,且IP不存在,这将把域名标记为"易受攻击"。如果CNAME在我们的易受攻击列表中且IP存在,域名被标记为"有风险"。如果CNAME不存在或不在我们的易受攻击列表中,域名被标记为"安全"。任何其他结果被标记为"未知"。
如果您喜欢这篇文章或对提到的任何内容有任何反馈,请在下面评论。