dig命令
dig 命令默认的输出信息比较丰富,大概可以分为 5 个部分。
第一部分显示 dig 命令的版本和输入的参数。
1 | ; <<>> DiG 9.11.3-1ubuntu1.7-Ubuntu <<>> @8.8.8.8 https://mdap.yuque.com |
第二部分显示服务返回的一些技术详情,比较重要的是 status。如果 status 的值为 NOERROR 则说明本次查询成功结束。
1 | ;; Got answer: |
第三部分中的 "QUESTION SECTION" 显示我们要查询的域名。
1 | ;; OPT PSEUDOSECTION: |
第四部分的 "ANSWER SECTION" 是查询到的结果。
1 | ;; ANSWER SECTION: |
第五部分则是本次查询的一些统计信息,比如用了多长时间,查询了哪个 DNS 服务器,在什么时间进行的查询等等。
1 | ;; Query time: 143 msec |
默认情况下 dig 命令查询 A 记录,上图中显示的 A 即说明查询的记录类型为 A 记录。在尝试查询其它类型的记录前让我们先来了解一下常见的 DNS 记录类型。
类型 | 目的 |
---|---|
A | 地址记录,用来指定域名的 IPv4 地址,如果需要将域名指向一个 IP 地址,就需要添加 A 记录。 |
AAAA | 用来指定主机名(或域名)对应的 IPv6 地址记录。 |
CNAME | 如果需要将域名指向另一个域名,再由另一个域名提供 ip 地址,就需要添加 CNAME 记录。 |
MX | 如果需要设置邮箱,让邮箱能够收到邮件,需要添加 MX 记录。 |
NS | 域名服务器记录,如果需要把子域名交给其他 DNS 服务器解析,就需要添加 NS 记录。 |
SOA | SOA 这种记录是所有区域性文件中的强制性记录。它必须是一个文件中的第一个记录。 |
TXT | 可以写任何东西,长度限制为 255。绝大多数的 TXT记录是用来做 SPF 记录(反垃圾邮件)。 |
查询 CNAME 类型的记录
1 | dig abc.filterinto.com CNAME |
从指定的 DNS 服务器上查询
1 | dig @8.8.8.8 abc.filterinto.com |
反向查询
1 | dig -x 8.8.8.8 +short |
控制显示结果
1 | dig +short abc.filterinto.com |
查看 TTL(Time to Live)
TTL 是 DNS 解析中很重要的指标,主要是控制 DNS 记录在 DNS 服务器上的缓存时间:
1 | dig abc.filterinto.com |
跟踪整个查询过程
1 | dig +trace abc.filterinto.com |
各个返回参数说明下:
- status: NOERROR 表示查询没有什么错误,Query time 表示查询完成时间
- SERVER: 10.202.72.116#53(10.202.72.116),表示本地 DNS 服务器地址和端口号
- QUESTION SECTION 表示需要查询的内容,这里需要查询域名的 A 记录
- ANSWER SECTION 表示查询结果,返回 A 记录的 IP 地址。600 表示本次查询缓存时间,在 600 秒本地 DNS 服务器可以直接从缓存返回结果
- AUTHORITY SECTION 表示从那台 DNS 服务器获取到具体的 A 记录信息。记住本地 DNS 服务器只是查询,而 AUTHORITY SECTION 返回的服务器是权威 DNS 服务器,由它来维护 rss.newyingyong.cn 的域名信息。返回的 DNS 记录类型是 NS,对应的名称是 dns10.hichina.com.,dns9.hichina.com.。
- ADDITIONAL SECTION 表示 NS 服务器对应的 IP 地址,这些 IP 地址对应的服务器安装了 BIND 软件。
接管CNAME
CNAME 的存在原因:
- 某个域名(A)可能会下线,但是这些域名可能还是被访问到,为了避免不友好的提示,可以将这个域名 cname 到另外个域名(B),这样访问 B 相当于返回 A。
- 很多公司项目可能有很多个域名,但是指定的 IP 地址可能每几个,一旦 IP 地址变化,可能要修改每个域名的 DNS 信息。假如这些域名 cname 到某个特定的域名,那么修改域名信息的时候就会非常方便。
github创建takeover
仓库,添加index.html
文件
1 | <html> |
使用dig -t a/mx/soa/cname rss.newyingyong.cn
进行查询是否存在CNAME
,CNAME
的域名是否被’删除‘
子域名查找如果发现存在有未删除CNAME的子域名,可以在github的takeover
仓库添加CNAME
文件为未删除CNAME的子域名。
访问:https://wh0ale.github.io/takeover/ 验证漏洞。
本来这里想搭建单独的GitHub Pages,但是每一个账号只能搭建域名为 username.github.io 的GitHub Pages
每个GitHub帐号下只能有1个人主页repo,但是可以有不限数量的项目主页repo。
没有自定义域名的情况下,项目主页的访问链接只能是
<username>
.github.io/<projectname>
所以创建了takeove仓库,Use the master branch for Github Pages.
Your site is published at https://wh0ale.github.io/takeover/
漏洞案例:
site:pentester.land intext:takeover
接管NS
NS 记录(Name Server)
NS 记录和SOA记录是任何一个DNS区域都不可或缺的两条记录,NS记录也叫名称服务器记录
,用于说明这个区域有哪些DNS服务器负责解析,SOA记录说明负责解析的DNS服务器中哪一个是主服务器。
1 | dig ns wolframe.eu @8.8.8.8 +nostats |
- +nocomments – 关闭注释行
- +noauthority – 关闭来源段
- +noadditional – 关闭附加段
- +nostats – 关闭统计段
- +noanswer – 关闭结果段 (Emmm, 我想你应该不会这样)
DNS规范不要求名称服务器位于同一个域中。想象一下,这example.com
是由两个名称服务器提供的:
1 | ns.gooddomain.com |
如果至少一个NS记录的规范域名的基本域可用于注册,则托管域名易受NS子域接管的攻击。
换句话说,如果baddomain.com
不存在,攻击者可以注册并完全控制example.com
(甚至其子域)。真正的问题是,这种情况会发生吗?我强烈推荐阅读Matthew Bryant的帖子,他解释了他如何使用这种方法获得子域名接管。我还强烈推荐他的名为TrustTrees的项目。它用于为任何域生成委派图。他能够使用这个工具发现更多类似的问题。
从自动化的角度来看,这个过程非常简单:
- 解析扫描域的所有名称服务器
- 检查是否有任何名称服务器可用于注册
- 根据上一步的结果发出警报
检查DNS回复中的唯一状态不足以指示。问题是多个服务器对给定域具有权威性。如果一个名称服务器不工作,你会得到,NOERROR
因为另一台服务器工作正常。DNS解析在后台悄然进行。这就是为什么像TrustTrees这样的工具在这些类型的分析中派上用场的原因。
可用于接管的云服务
- 亚马逊S3 - 以前简要提到了亚马逊S3。用于访问存储桶的默认基本域并不总是相同,具体取决于所使用的AWS区域。AWS文档中提供了Amazon S3基本域的完整列表。与CloudFront类似,Amazon S3允许指定备用(自定义)域名以访问存储桶的内容。
- Heroku - Heroku是一个平台即服务提供商,可以使用简单的工作流程部署应用程序。由于需要访问应用程序,Heroku使用herokuapp.com上形成的子域公开应用程序。但是,也可以指定自定义域名以访问已部署的应用程序。
- Shopify - Shopify提供了一种在云中创建和自定义电子商务商店的方法。访问商店的默认子域是在myshopify.com上构建的。作为之前描述的服务,Shopify允许指定备用域名。值得注意的是Shopify验证了正确的CNAME记录配置。但是,此验证不是域名所有权验证。Shopify仅检查备用域的DNS区域中存在的准确CNAME记录。因此,此验证不会阻止子域名的接管。
- GitHub - GitHub是Git的版本控制存储库。GitHub还允许使用他们的GitHub Pages项目进行免费的网络托管。此Web托管通常用于项目文档,技术博客或支持开源项目的Web页面。除github.io下的默认域名外,GitHub Pages还支持自定义域名。
- Microsoft Azure - Microsoft Azure是一个更加突出的云提供商,类似于AWS。与上面提到的云服务相比,它不同,因为它不提供虚拟主机架构。简而言之,对于每个云服务,Azure都会创建自己的具有自己IP地址的虚拟机。因此,域名和IP地址之间的映射是明确的(一对一映射)。值得注意的是,由于这不是常规虚拟主机设置,因此不一定必须在资源设置中明确定义配置CNAME记录。Azure提供多种云服务,但本文中讨论的服务具有cloudapp.net和azurewebsites.net的默认域。其文档描述了使用A或CNAME记录设置域名和Azure资源之间的链接(指向前面提到的两个域之一)。一个有趣的观察是,对于A记录,Azure使用TXT记录进行域所有权验证。但是,对于CNAME记录而言并非如此,因此即使在Microsoft Azure的情况下也可以进行子域接管。
参考:
https://0xpatrik.com/takeover-proofs/