这篇文章涵盖了所有技术方面,以便您可以使用其他签名扩展接管扫描。原文地址:https://0xpatrik.com/subdomain-takeover-ns/
CNAME 和 NS子域名接管区别
让我们先解释一下 NS 接管与传统的 CNAME 子域接管有何不同。我假设您对 CNAME 子域接管了如指掌(如果没有,请在此处继续)。在 NS 子域接管中,我们希望能够控制DNS 服务器上的整个 DNS 区域。众所周知,DNS 有一个层次结构,每个层次都可以由不同的名称服务器提供服务:
为了便于读者明白,我选择用一个简单的例子来解释整个场景。我拥有一个名为的域wolframe.eu,我将其用于测试目的。这些是该域的(权威)名称服务器:
如您所见,DNS 区域由 AWS(更具体地说是 AWS Route53)管理。我们得到的结果dig是非权威答案。非权威意味着它不是由权威 DNS 服务器(本示例中的四个 AWS 之一)返回,而是由某个中间人返回。这个中间人是8.8.8.8递归的 Google DNS 服务器,如@8.8.8.8用dig命令所示。您可以通过更改为四个 AWS 服务器之一来获得权威答案@8.8.8.8,例如@ns-1276.awsdns-31.org. 这种区别在后面的章节中将是至关重要的。
这是我在 Route53 中的 DNS 区域:
wolframe.eu只有一个 A 记录设置为1.1.1.1。
一旦 DNS 请求对任何一个有问题,*.wolframe.eu就会随机选择这四个 AWS 名称服务器之一,并返回 DNS 结果:
现在想象一下。我删除了 Route53 中的 DNS 区域,但我保留了指向 AWS 的 NS 记录。现在我得到:
现在,如果攻击者只是在 Route53 中创建新的 DNS 区域,他就可以返回任何 DNS 响应。这是NS子域接管的一个基本前提。我刚刚解释的场景有多个警告。我们将在接下来的部分中介绍这些内容。
自定义名称服务器
DNS 规范不要求名称服务器位于同一域中。想象一下example.com由两个名称服务器提供服务:
ns.gooddomain.com
ns.baddomain.com
如果至少有一个 NS 记录的规范域名的基域可供注册,则托管域名容易被 NS 子域接管。
换句话说,如果baddomain.com不存在,攻击者可以注册它并完全控制example.com(甚至它的子域)。真正的问题是,这曾经发生过吗?我强烈推荐阅读Matthew Bryant的文章,他解释了他是如何使用这种方法获得子域接管的。我也强烈推荐他的名为TrustTrees的项目。
从自动化的角度来看,这个过程相当简单:
- 解析扫描域的所有名称服务器
- 检查是否有任何名称服务器可用于注册
- 根据上一步的结果发出警报
DNS 托管
对于托管在 AWS 等第三方提供商上的 DNS 区域,情况略有不同。名称服务器域通常不可用于注册。正如我在上面的示例中所示,可能存在 NS 记录指向托管提供商的情况,但在门户中未声明 DNS 区域。2016 年,Matthew Bryant成功接管了 12 万个域,这些域的 NS 记录设置为 DNS 提供商之一,但未在其中声明。我强烈推荐阅读那篇文章。
从自动化的角度来看,这个过程有点不同。它也因提供商而异,因为对于不存在的区域,它们都可以具有不同的签名。让我们以 DigitalOcean 为例。我的网站 ( 0xpatrik) 未托管在 DigitalOcean 上。让我们尝试查询它的名称服务器。
正如我们所见,DigitalOcean 域名服务器返回REFUSEDDNS 状态。如果名称服务器0xpatrik.com设置为ns1.digitalocean.com,则可以进行子域接管。
如 Matthew 的帖子中所述,AWS 为每个 DNS 区域生成一组新的名称服务器,因此为了成功的 PoC,您需要暴力破解这些名称服务器(但这是可能的)。
我不会为每个 DNS 提供商编写签名。NS 子域接管的案例非常罕见(在我感兴趣的范围内),我不关心每个月的少数误报。现在让我们看看托管 DNS 的自动化过程:
- 对于域,提取其名称服务器
- 分别针对这些服务器中的每一个迭代地解析域
- 查找类似SERVFAILor的响应REFUSED并根据它发出警报
dnspython您可以使用和自定义解析器轻松实现此目的,如下所示:
import dns
import dns.rdatatype
for NAMESERVER_IP in NAMESERVER_IPS:
custom_resolver = dns.resolver.Resolver()
custom_resolver.nameservers = [NAMESERVER_IP]
q = custom_resolver.query(DOMAIN, dns.rdatatype.A)
总体而言,您的自动化应该通过以下过程进行扩展: