总之,你挖掘漏洞的方法越奇特,详尽,你所能挖到的东西也就越多。
一、理解子域名劫持漏洞
这个分标题只为了回答一个问题:子域名劫持是怎么形成的、怎么理解它?
一个域名对应着一个提供服务的服务器IP,如何对应起来的?很简单,DNS解析,是DNS让域名和IP进行对应的。同样的,子域名对应着一个IP,或者是对应着另外一个域名。
对应这张图,主要解释下几个过程。
- 递归解析。一次性完成全部名字到地址的转换。比如baidu.com直接解析到8.8.8.8,不需要经过其他步骤来处理。
- 反复解析。每次请求一个服务器,请求不通过再换其他服务器。这里我需要说下,一个服务器对应的域名是有限的,所以当域名非常多的时候,会出现当前被请求的服务器并没有找到该域名的情况。而这个过程,会和后面的CNAME记录关联起来,后面再进行描述。
- MX记录。简而言之,就是你发邮件给谁,是由它来决定的。而它是根据收信人的地址后缀来定位邮件服务器的。
- CNAME。是双线智能解析和使用CDN必须用到的解析方法,这里和前边的反复解析就对应上了。这里描述下它的场景:
第3步,其中一个DNS服务器A没有找到对应IP,但是它有CNAME记录,告诉索要IP的Recursive DNS resolver,你想要的域名在另外一个DNS服务器B那里。这个就是反复解析,根据CNAME。
好了,有了上面的基础知识,我们就来了解下,子域名劫持是啥,漏洞原理又是什么。
比如,你申请了一个域名,abc.com,主站域名当然是www.abc.com,之后为了快速开辟一个新的业务,你直接买了阿里云对应的服务,并分配了一个二级域名,shop.aliyun.com。虽然这个域名是你独有的,但是你希望顾客可以通过shop.abc.com来访问到你的新服务,所以你必须将shop.abc.com解析到shop.aliyun.com上,这时候就需要用到CNAME了,这是一个再正常不过的业务场景。
但是,如果有一天你的服务器不在使用了,但CNAME没有删除。而别人接管了shop.aliyun.com,当顾客再次访问到shop.abc.com的时候,就直接跳过shop.aliyun.com了,那么换个角度,而接管(劫持)shop.aliyun.com的人是黑客呢。是不是你的顾客的敏感信息就会被黑客盗走?
这就是子域名劫持的场景和原理。
二、漏洞危害(利用)
1、网页钓鱼
由于顾客通过shop.abc.com访问到了shop.aliyun.com。那么攻击者直接仿造shop.abc.com或者主站的界面诱导顾客操作,比如登录表单,密码表单等,由于浏览器显示的是可信域名,即使具有安全意识的人,也很容易分辨是否存在钓鱼。
2、Cookie盗取
可以在页面写入获取cookie的js方法,受害者一经访问,cookie就会被获取。
以下均是hackerone子域名劫持漏洞的例子,评定都是高危等级:
https://hackerone.com/reports/172137
https://hackerone.com/reports/32825
https://hackerone.com/reports/38007
https://hackerone.com/reports/175070
3、拦截电子邮件
安全研究者Rojan Rijal曾发现了Uber基于SendGrid服务的某个可劫持子域名,之后,利用该子域名,他成功拦截了Uber内部的公司电邮通信,获取了Uber官方$10,000美金的奖励。
翻墙演示视频和文字分析。
三、子域名劫持漏洞出现的条件和分类
这类漏洞出现的前提条件:
- 子域名的CNAME记录指向另一个域,比如x.baidu.com的CNAME记录指向vul.com
- 当vul.com到期,任何人都可以注册的时候
- x.baidu.com 没有删除CNMAE记录
说白了,可以用这个场景来概括:你nslookup一波,发现一个域名指向CDN或者github,但是访问的时候又是404打不开,暂时可以判定为该子域名指向了一个没有服务的地方,那么你就可以尝试去代替它。
这类漏洞的类型:
按照域名解析类型分可以分为4类
- CNAME子域名接管
- NS子域名接管
- A记录子域名接管
- MX子域名接管(影响较小,可用于鱼叉式网络钓鱼攻击)
直接和间接可以分为两类:
- 一阶子域名劫持漏洞(包括以上四类)
- 二阶子域名劫持漏洞
网站中有导入第三方资源的情况,也是可能存在被劫持的风险的。比如引用了一个外部的js文件(http://www.baidu.com/main.js )),因此当baidu.com域名过期的时候或者www.baidu.com被劫持的时候,间接的你的网站也就被劫持了。这种情况下可能会导致存储型XSS或者被植入暗链等等。
四、如何挖掘
顶级的白帽会实时关注目标网站的任何变动,所以我们要让这些资产的发现变得自动流程化。
首先是获取到存活的子域名,要让这些过程尽可能地流程化,我会配上相应的工具供大家参考。
子域名的挖掘自动化流程。
子域名有两种方式可以获取,一种是爆破(Bruteforce),另一种是检索。
爆破就不多说了,说说检索。检索是利用DNS解析记录、SSL证书和搜索引擎等外部服务和资源来搜集特定主机的子域名记录。
爆破的话要注意泛域名模式,什么叫泛域名模式?就是所有的子域名都会解析到一个IP地址下,那此时它就拥有了无限的子域名,爆破会有很多误报。如何检查是不是开启了泛域名?输入一个不可能存在的前缀可以判断。比如:
host randomifje8z193hf8jafvh7g4q79gh274.example.com
这里工具推荐SubFinder,它兼具检索和爆破功能。
收集到了子域名,接下来需要判断他们是不是存活着的。
可以考虑子域名截图工具,EyeWitness和msg。
可以对页面进行探测,这里着重推荐meg,它基于go编写,速度快,轻量级。
如何证明其漏洞存在?
1、使用aquatone来初步验证是否存在漏洞,如果存在vulnerable的话。
aquatone-takeover --domain live.txt --threads 500
2、找到了可能会被劫持的子域名,然后打开你的阿里云或者其他服务器进行dns解析,完成CNAME指定到你自己的服务。
如果对方是指向github但是不能访问,那么你就可以在github上创建一个页面,并将它的子域名接管到你这来。
在被劫持的子域名上部署好自己的网页,尽量简单,一个图片即可。