未经授权,侵删。
2017年6月4日
凡听见我这话就去做的,好比一个聪明人,把房子盖在磐石上。雨淋、水冲、风吹,撞着那房子,房子总不倒塌;因为根基立在磐石上。凡听见我这话不去做的,好比一个无知的人,把房子盖在沙土上。雨淋、水冲、风吹,撞着那房子,房子就倒塌了。
--马太福音7章24-27节
域名是我们当代互联网的根基,然而尽管所有人都在使用却很少有人理解他背后的机制。因为现在有各种抽象中间层以及供应商提供的服务,大部分人都能在不知道什么是DNS、域名注册和WHOIS的情况下搭建自己的网站并拥有自己的域名。虽然这些抽象中间层非常有用,但是它也为最终的使用者屏蔽了很多重要的信息。举个例子,很多域名注册的网站会更乐意向你推荐.io 的域名,但是买了.io 域名的人真的知道是哪些组织正在维护管理.io 域名吗?我认为大部分买了域名的人对域名背后的运作所知甚少,更不要说有多少人会问“这个域名的安全追溯记录是什么样的?”。
DNS结构简介
如果你已经了解DNS是如何运行和被代理的,可以直接跳过这节。
当你为域名掏钱时到底买到了什么呢?从本质上来说,你只是买到了一些NS (nameserver,域名服务器)记录,这些记录会被域名后缀对应的服务器(包括各种类似与WHOIS、registry/registrar operational costs, and other fees which go to ICANN)所持有。为了更好地理解后缀名在整个DNS各个阶段中的位置,我们来看一副图,上面标注了example.com的“代理链”。我发现图表对于理解DNS运作方式有很大的好处,所以我写了一个名叫TrustTrees的工具,它可以用来生成某个域名完整的代理路径。
上图展示了从根DNS服务开始的完整“代理链”,可见DNS代理的工作方式就是在连续的链路上寻找对应的域名是否存在。用户在发起的DNS请求会从请求某一个根域名服务器开始。根节点可能不知道这个请求的结果,然后后会将这次请求通过代理的方式转发给TLD(顶级域名服务器),而后者则会再次通过代理的方式转发给和是的域名服务器,直到接收到“权威回答”并确认它来自正确的域名服务器。上图战士了所有可能的代理路径(蓝色的线代表了“权威回复”)。之所以会有这么多路径,是因为DNS最终的回复中会包含一系列随机排列的答案(称之为 Round Robin DNS的技术),这么做是为了实现一定程度上的负载均衡。根据返回结果的顺序,每次请求的可能会是不同的域名服务器,并得到一些不同的答案。上图还展示了所有的排列可能以及域名服务器之间的联系。
综上所述,如果你购买了 example.com 域名,那么.com 注册局将会增加一些NS记录,然后所有关于example.com 的DNS请求都会被转发到对应的域名服务器上。这些接受代理的域名服务器则是会真正控制example.com 域名以及生成其他子域名的地方。如果拥有 .com 的组织决定去掉相关的域名服务器(NS)记录,那么你的域名请求将不会被代理给给任何服务器,进而你的example.com 就不能正常运作了。
进一步思考你会发现顶级域名服务器(TLD)和域名后缀之间的关系在其他域名层级的关系也是类似的。TLD存在的意义就是等待根域名服务器将请求代理给他们。如果根域名服务器决定去掉 .com 的NS记录,那么世界上所有的.com结尾的域名都将无法解析。
和普通域名相同,域名后缀也会受到同样漏洞的影响
现在我们理解了TLD和域名后缀也同样是通过域名服务器来管理的,就像普通的域名一样。那么问题来了,这意味着TLD也会受到同样的DNS安全问题的影响吗?答案当然是肯定的。如果你在我的博客里看过之前的一些文章,那么就可以知道我们可以通过各种方式劫持域名服务器。我演示过 过期或出错的域名服务器可能导致被劫持(typo-ed还没找到如何翻译……),也看过很多DNS供应商可以无需验证就获得其控制权。在学习完上述渗透实例之后,我们就有了足够的知识来做一件更伟大的事情:控制整个域名后缀。
拿下域名后缀之攻击计划
我并不是一个坏人,因此并不愿意教你们如何快速达到劫持域名后缀的目的。在整个寻找攻击方法的研究过程中,我发现很多TLD级别的域名服务器以及注册局都处于一团糟的状态,所以获取他们的控制权可能比想像的要简单很多。尽管类似与在注册局或者域名服务器上远程执行恶意代码这样的策略并不在我们的考量范围内,但是我仍然将提及他们,毕竟现实中的作恶者并没有多少道德顾虑。
一般来说,下列几个方法是拿下TLD相对可行的方法:
- 通过域名后缀所在的DNS 服务器的漏洞。攻击注册局也算是这种方法的范围之内,因为它有能力可以直接操作对应域名服务器上的内容。
- 找到已经过时或者写错的域名服务,并且抢先注册。
- 通过在域名提供商那里重新创建一个 DNS 区,以此来劫持域名后缀。
- 劫持TLD的WHOIS联系邮箱(在 IANA root zone 数据库中列出的这些)。
我们将逐一介绍每一种方法以及在实践中发现的对应结果。
TLD和域名后缀服务器的漏洞其实相当常见
为了开始对第一种方法进行探索,我决定对一个TLD域名服务器做一个简单的端口扫描。在理想状况下你将看到一批服务器在53端口监听着UDP/TCP消息,并且其他所有的端口都是关闭的。毕竟这些域名服务器十分关键,他们应该尽量减少对外的暴露。任何类似于HTTP,SSH或者SMTP都可能成为攻击者进入TLD的方式。
这一章的内容可能会有点奇怪,因为我将介绍如果不对恶意的活动设防情况会有多糟糕。在调查过程中我甚至发现,某些TLD上竟然还运行着网站,这意味着他很可能有被入侵的入口。我们将忽略这些极端的例子,主要集中分析一些典型案例。
Finger
- 203.119.60.105 (e.dns-servers.vn): 越南的.vn TLD域名服务器
- 202.29.151.3 (munnari.oz.au): 波斯尼亚和黑塞哥维那的.ba TLD 域名服务器
finger 协议 是Les Earnestz 在1971年创建的,它可以让用户查看远程电脑上某个用户的状态。这是一种超级过时的协议,现代的操作系统中基本不会支持。这个协议的想法实质上是为了回答“Dave现在在他的机子上登录着吗?他现在忙吗?”这样的问题。你可以通过finger协议来查看远程机器上用户的登录名,真是姓名,终端名,空闲时间,登录时间,办公室地址和办公室电话号码。举个例子,我们将访问波斯尼亚的域名服务器的finger服务,查看他的root用户的下列信息:
bash-3.2$ finger -l root@202.29.151.3
[202.29.151.3]
Login: root Name: Charlie Root
Directory: /root Shell: /bin/sh
Last login Sat Dec 14 16:41 2013 (ICT) on console
No Mail.
No Plan.
看上去root用户已经很久没有登录了!让我们再看看越南的某个域名服务器:
bash-3.2$ finger -l user@203.119.60.105
[203.119.60.105]
Login name: nobody In real life: NFS Anonymous Access User
Directory: /
Never logged in.
No unread mail
No Plan.
Login name: noaccess In real life: No Access User
Directory: /
Never logged in.
No unread mail
No Plan.
Login name: nobody4 In real life: SunOS 4.x NFS Anonymous Access User
Directory: /
Never logged in.
No unread mail
No Plan.
Login name: named In real life: User run named
Directory: /home/named Shell: /bin/false
Never logged in.
No unread mail
No Plan.
bash-3.2$
bash-3.2$ finger -l root@203.119.60.105
[203.119.60.105]
Login name: root In real life: Super-User
Directory: / Shell: /sbin/sh
Last login Tue Sep 30, 2014 on pts/1 from DNS-E
No unread mail
No Plan.
这边root用户的上一次登录时间是2014年9月30号。实际上这机子上装载这这种协议也表明了这服务器是有多过时了。
动态网站
可能除了53之外,域名服务器上最常见的公开端口应该就是80(HTTP)了。访问他们的网站经常会获得很有趣的结果。例如某个域名服务器直接将我重定向到一个广告网站:
* Rebuilt URL to: http://93.190.140.242/
* Trying 93.190.140.242...
* Connected to 93.190.140.242 (93.190.140.242) port 80 (#0)
> GET / HTTP/1.1
> Host: 93.190.140.242
> Accept: */*
> User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0
>
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.10.1
< Date: Sun, 04 Jun 2017 03:16:30 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: close
< X-Powered-By: PHP/5.3.3
< Location: http://n158adserv.com/ads?key=6c6004f94a84a1d702c2b8dc16052e50&ch=140.242
<
* Closing connection 0
我仍然不能确定,这个域名服务器是不是之前就已经被人入侵过,或者他的拥有者想以此赚点外快?
其他的域名服务器(例如阿尔巴尼亚的 .com.al ,.edu.al,.mil.al,.net.al,和.nic.al 的域名服务器)则返回了很多描述他们机器详细信息的配置页:
另外还有能在上面直接远程执行命令行工具的(例如.ke,.ba 和其他一大把域名后缀):
更有甚者……
我们还发现了其他很多有意思的服务,但这里就不详细展开了。例如SMTP,IMAP,MySQL,SNMP,RDP都是域名服务器上常见的开放端口。这给了攻击者一个很大的施展空间,我认为通过各种漏洞成功拿下服务器的成功路很高。但是我们将不再做进一步测试,因为我们不是坏人。由于很多服务器都已经过时了,修复上面的安全漏洞对于各个所有者来说工作量十分巨大。
……
PS:原文后面还有很多展开讲述其他奇技淫巧来攻占顶级域名服务器,这里就先不翻译了:)
网友评论