【技术分享】实例演示如何科学的进行子域名收集

http://p6.qhimg.com/t014574fce08dcff735.jpg

译者:興趣使然的小胃

预估稿费:150RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


一、前言

当我在HackerOne上寻找新的目标时,我总是会重点关注已解决漏洞数量较大的那一类目标,因为相比漏洞数量较小的那些目标,这类目标可能更容易找到问题。我想自己动手尝试一下,因此我选择了Yahoo!作为目标,这个目标的已解决漏洞在HackerOne上排名第一,总共有3613个。


二、子域名搜集

我们都知道Yahoo!是个大型国际公司,因此我认为它应该包含许多子域名、路径以及重定向信息,但具体从哪里入手呢?我最喜欢的用来枚举或爆破子域名的工具为:Sublister(我认为最好的一个工具)以及Fierce。我希望借助这些工具找到被管理员遗忘的、错误配置的或者正在运行陈旧版本软件的子域名。Sublister给我生成了超过9000个子域名,我如何核实这些域名的准确性呢?

http://p0.qhimg.com/t01771802de3665f98f.png

图1. 子域名搜集

http://p0.qhimg.com/t01eb302fda3cede8f0.png

图2. 原始子域名个数


三、半自动搜索方法

这9000个子域名中至少有一个存在漏洞,我认为在如此大的一个公司中要在安全方面做到万无一失是很难的一件事情。当Sublister运行完毕后,我打开结果文件,手动删除了无用和重复的子域名,这些域名要么无法正确解析,要么不会返回任何响应。我当然没有逐一进行核实,因为工作量实在太大,即便如此,还有大约7000个子域名保留下来。我们先来快速扫描一下,利用扫描结果进一步筛选子域名。我使用Nmap来完成这一任务,并将结果文件保存为更容易解析的XML文件。

nmap -sS -p80,443 -iL nmap_input.txt -oX nmap_output

典型的输出如下所示:

<hostnames>
<hostname name=”start.producersdesktop.yahoo.com” type=”user”/>
<hostname name=”proxy.publish.bf1.yahoo.com” type=”PTR”/>
</hostnames>
<ports><port protocol=”tcp” portid=”80"><state state=”closed” reason=”reset” reason_ttl=”42"/><service name=”http” method=”table” conf=”3"/></port>
</ports>
<times srtt=”148262" rttvar=”148262" to=”741310"/>
</host>

我们可以在nmap命令中指定需要扫描的端口。对我来说,结果中最有用的参数是“state”以及“hostname name”参数。我认为“hostname name”代表的是DNS信息,有时候这个字段会保存ISP的地址,此时我就知道这个域名无法被正确解析。基于这个信息,我们可以扔掉好几百个错误的子域名。我写了个脚本,可以根据结果中的主机名删除无用的XML表项,并将处理结果保存为另一个XML。

import xmltree
def removeHostname():
   for host in root.iter('host'):
        for elem in host.iter():
            if 'name' in elem.attrib and elem.attrib['name'] == 'ISP_redir_site':
                root.remove(host)
tree.write('output.xml')

现在,我们手头上的子域名都开放了80端口。我们可以使用nmap扫描这些子域名,获取HTML标题信息(–script http-title),然后再删掉标题一样的子域名。

Yahoo!的网站可能使用不同的语言,比如ru.search.yahoo.com、br.search.yahoo.com、de.starts.yahoo.com等,下一步我们可以过滤掉具有不同语言的同一类子域名,这也可以删掉很多冗余的子域名。经过这些处理工作,我得到了大约700个可能存在漏洞的子域名。


四、初步探索

接下来是好好研究的时间了。我无法在这些子域名中找到可以利用的共同点,因此我需要手动检查这些子域名。经过一番搜索,我发现某些子域名存在一定的类似性及重复性,因此情况没有想象的那么难。我发现http://yvap.query.yahoo.com/这个地址开放了一个YQL内部控制台接口,经过进一步研究,我还发现http://ygh-app.media.yahoo.com/这个网站用于Beaker用例测试。

http://p8.qhimg.com/t01d732f017cd912c65.png

图3. YQL(Yahoo!查询语言)内部控制台接口

http://p6.qhimg.com/t018c3fbc5369172495.png

图4. Beaker


五、深入分析

除了在http://yvap.query.yahoo.com/v1/test/js/console_ajax.js 这个地址发现一段javascript代码之外,我没有发现其他有趣的信息。Yahoo!不止有一个内部控制台,但其他控制台对外都处于锁定状态,如下所示:

http://p4.qhimg.com/t011cea538fe71cc32a.png

图5. 处于锁定状态的YQL控制台

对于YQL来说,典型的查询语句如下所示:

https://query.yahooapis.com/v1/public/yql?q=show%20tables&diagnostics=true 

因此,我使用这种查询语句对剩余的已锁定的控制台发起请求。从结果中可知,这些控制台的主面板虽然处于关闭状态,但我们仍然可以通过url地址提交请求。我枚举测试了所有控制台,逐一进行核实。对大部分控制台而言,“show tables”命令都能正常工作,因此我尝试深入分析这些控制台,但直到我向HackerOne报告这个问题时,仍然没有取得进展,看起来这些控制台的问题只是对外开放,仅此而已。

http://p8.qhimg.com/t0112e87684b1402727.png

图6. 对外开放的控制台

我发现http://ygh-app.media.yahoo.com/是一个Beaker测试网站,实话实说我以前从来没接触过Beaker,经过快速探索后,我发现了另一处信息泄露点。

http://p1.qhimg.com/t018713e8b2e954e302.png

图7. 另一处信息泄露点


六、总结

在整个过程中我没有使用到革命性的方法,肯定有其他方法能够得到更快、更精确并且耗时更短的结果,但我还是想跟大家分享整个过程。几周之前,我发现了Aquatone这个工具,这个工具包含了所有的功能。


七、时间线

5月10日:报告发送给HackerOne。

5月11日:Yahoo!反馈YQL控制台问题已经有人提交过,但第二个问题是个新的问题。

5月12日:我演示了如何向内部YQL控制台发起查询请求。

5月18日:Yahoo!反馈这种行为符合预期。

6月2日:收到奖金。

(完)