Skip to content

02信息收集:掌握目标的一切信息

你好,我是赢少良。上一讲我介绍了一些常用的渗透测试工具,有些在这一讲中就会用到。这一讲主要是想和你分享渗透目标的信息收集技术,它在开始一项渗透测试工作的前期工作中有着很重要的地位,因为这决定了你能找到的攻击面有多大,也是你能否成功渗透目标的关键。

信息收集方法

根据收集方式的不同,我们可以将信息收集分为两类:主动收集和被动收集。下面我先介绍一下这两个概念。

  • 主动收集是指通过扫描确认目标的操作系统和网络服务,为后续发现漏洞提供信息帮助,但它可能引起目标的注意,或被记录下扫描行为。一些服务指纹检测、网站爬虫都是主动收集的方式,它们直接向目标发起请求,在有防火墙的情况下,可能会被拦截告警。

  • 被动收集是指在不接触目标的情况下,通过互联网搜索来收集目标遗留在网络中的信息 。这样可以避免引起目标的警觉。网上很多人说的公开来源情报(Open-Source Intelligence,OSINT,简称"开源情报")正是需要被动收集的信息,它是从公共资源中收集到的。

综上可以看出,主动收集与被动收集的主要区别就在于收集信息的过程中是否需要接触目标。在实际渗透测试过程中,一般两种方法都会用上,以收集更多有价值的信息。

在收集信息时,无论是主动还是被动,都建议使用小号,尤其是在一些社交平台上的信息收集,小号可以避免行为暴露。

信息收集实践

关于信息收集的工具,你平常可以多关注一些开源工具。GitHub 上有很多,遇到好的工具可以下载收藏,避免临时找工具或者被迫手工操作,那会非常影响效率。

在操作系统 KaliParrot 中有相应的工具列表,你可以找到很多不错的工具。

下面我将介绍 6 个信息收集的方法,分别是子域名与 IP 收集、端口服务探测、网站指纹识别、旁站与 C 段查询、WAF 探测和敏感信息收集。

子域名与 IP 收集

收集子域名和 IP 常常是信息收集的开端,这对你摸清整个目标的资产起着很关键的作用,它们直接决定了渗透目标范围的大小。当然,有时候渗透测试任务直接限死子域名,这种情况下这一步就可以直接省略了。

在 GitHub 上有一个开源项目,叫 bounty-targets-data,它会收集一些漏洞奖励计划中的域名范围,并在持续更新,目前已经收集了 2000 多个域名。对于喜欢刷漏洞奖励平台的同学,bounty-targets-data 确实是一份不错资源,它可以开启循环扫描,不停地去扫这些有奖励计划的域名,运气好的话,可以挖到漏洞拿奖金。

关于收集子域名的技术原理在《红蓝对抗之域名搜集方法总结》中有详细的介绍,主要包括证书透明度、DNS 查询、Whois 查询、备案网站、搜索引擎、暴力猜测等多种方法实现。

收集子域名可以通过一些在线网站或者本地工具来收集,常用的工具或站点有 OneForAll、subDomainsBrute、subfinder、ESD、Amass、DNSDumpster 和 Subdomain Finder。

  • OneForAll 在功能上非常集全,使用字典爆破、证书透明度、常规检查(域传递、sitemap 文件、robts 文件、内容安全策略 csp 等)、网络爬虫、DNS 数据集、DNS 查询、威胁情报平台、搜索引擎等多种方式,也支持多种文件格式导出。OneForAll 收集到的有效域名很多,但经常会有误报,速度也相对比较慢。

使用示例如下:

java
python3 oneforall.py --target lagou.com run

图 1:OneForAll

  • subDomainsBrute采用暴力猜解域名的方式,速度快、准确度高。但由于是字典猜解方式,仍会存在一定的漏报。

图 2:subDomainsBrute 运行效果图

图 3:subDomainsBrute 爬取的域名结果图

同一域名有时会有指向多个 IP 地址情况,因为企业可能采用 CDN 内容分发网络,就近选择网络最好的节点服务器响应用户。因此,有时同一台机器访问同一个域名时,会访问到不同的 IP,比如 weixin.lagou.com 就是如此。

图 4:同一个域名的不同 IP

subDomainsBrute 也会将同一域名指向的多个 IP 一并收集起来,但如果超过 10 个 IP 就会放弃收集。

使用示例如下:

java
python3 subDomainsBrute.py lagou.com
  • subfinder 的扫描速度很快,它支持很多第三方 API 接口(需要配置),同时支持多种输出格式,但 subfinder 没有字典爆破域名的功能。

使用示例如下:

java
subfinder -d lagou.com

图 5:subfinder

  • ESD支持域名爆破、DNS 解析、域传递、搜索引擎、证书透明度等多种搜索方式,还支持 zoomeye、censys、fofa、shodan 等网络空间搜索引擎的接口结果收集,这个需要在配置文件中设置 key 或者账密才能使用。

ESD 有时的搜索结果不太稳定,对同一域名的多次搜索可能会不一样,比如跑 lagou.com,一次跑出 27 个域名,一次跑出 67 个域名,差异很大。

使用示例如下:

java
esd -d lagou.com

图 6:ESD

  • Amass是一款 OWASP 出口的资产搜索工具,除了常规的域名收集方式,它还支持搜索结果可视化,并能从很多网站和 API 收集子域名。另外,它提供了一套类似 Nmap 的脚本引擎,支持用户自定义数据源以扩展搜索范围。它的扫描速度非常慢,但能够收集到非常多的子域名信息。

以 lagou.com 为例,它共收集到了 40769 个子域。这数据相当多了,不过里面有不少是跳转到主页 lagou.com 的,实际没有单独的子域网站,即不同域名指向同一台服务器,或者是直接 302 跳转到主页的情况。这些子域在网站扫描时可以考虑去重,避免重复扫描。

使用示例如下:

java
amass enum -o out.txt -d lagou.com

图 7:Amass

  • DNSDumpster可以在线搜索子域名以及相应的 IP 地址,提供 xlsx 文件导出,以及整个域名映射关系图、IP 分布地图等信息,在展示和准确度上还是不错的。它的搜索速度也很快,但就是子域收集相对少很多。

图 8:DNSDumpster

  • Subdomain Finder支持在线搜索子域名以及相应的 IP 地址。它的扫描速度很快,若没有显示 IP 则代表域名没有绑定有效的网络服务器,或者无法访问该域名。在界面上,它直接提供"Check Status"功能来检测网站的访问状态。该网站上还提供有"Private scan"功能,可以防止扫描时被记录。但它的不足之处在于,扫描结果无法直接导出文件到本地。

图 9:Subdomain Finder

拉勾网(lagou.com)为例,我对上述工具的子域检测结果进行了统计对比,得到的结果如下表所示:

图 10:不同工具的子域检测结果统计对比

可以看到,Amass 扫出的数据实在是太多了(大部分是直接跳转到 lagou.com 主页),其他工具的柱状数据会小得无法比较。因此,在画统计图的时候我去掉了它。

图 11:子域检测结果统计图

我用得比较多的是 OneForAll 和 Subdomain Finder,在收集域名时则更喜欢用 Subdomain Finder + OneForAll + subfinder + Amass 的组合。像 Amass 输出太多了,它扫描和验证有效性的时间也比较长。

端口服务探测

在上一讲"01 | 武器库:常用的渗透测试工具"中我介绍了 Nmap,用它来扫描端口服务就足够了。那我们为什么要做端口服务探测呢?

近期 FBI 发布紧急警告称,SonarQube 商业化源码审计系统被利用默认弱密码窃取政府内部一些产品源代码。

安装 SonarQube 时会默认开启 9000 端口,默认的管理员账号密码均为 admin。攻击者在网站上扫描开放 9000 端口的服务器,若发现是 SonarQube 就可以尝试用 admin 登录,如果能登录就可以窃取到上面的产品源码了。这是扫描端口服务非常典型的应用场景。

再比如端口 3389 用于远程桌面连接,如果发现了,也可以尝试用弱密码登录,或者利用一些远程桌面漏洞去测试。

针对开放端口和服务识别的方式,在渗透测试过程可以有针对性地采取不同的测试方法,虽然简单,但非常有效。

下面以探测拉勾网的端口服务为例,使用 Nmap 去探测:

shell
$ Nmap -A lagou.com
Starting Nmap 7.91 ( https://Nmap.org ) at 2020-11-15 12:55 CST
Nmap scan report for lagou.com (117.50.36.103)
Host is up (0.037s latency).
Other addresses for lagou.com (not scanned): 117.50.39.99 106.75.118.232
Not shown: 993 closed ports
PORT     STATE    SERVICE        VERSION
80/tcp   open     http           OpenResty web app server
|_http-server-header: openresty
|_http-title: Did not follow redirect to https://www.lagou.com/
135/tcp  filtered msrpc
139/tcp  filtered netbios-ssn
443/tcp  open     ssl/http       OpenResty web app server
|_http-server-header: openresty
|_http-title: Did not follow redirect to https://www.lagou.com/
| ssl-cert: Subject: commonName=*.lagou.com/organizationName=\xE5\x8C\x97\xE4\xBA\xAC\xE6\x8B\x89\xE5\x8B\xBE\xE7\xBD\x91\xE7\xBB\x9C\xE6\x8A\x80\xE6\x9C\xAF\xE6\x9C\x89\xE9\x99\x90\xE5\x85\xAC\xE5\x8F\xB8/stateOrProvinceName=\xE5\x8C\x97\xE4\xBA\xAC/countryName=CN
| Subject Alternative Name: DNS:*.lagou.com, DNS:lagou.com
| Not valid before: 2019-04-01T08:51:44
|_Not valid after:  2021-05-19T12:00:00
|_ssl-date: TLS randomness does not represent time
| tls-alpn: 
|   h2
|_  http/1.1
| tls-nextprotoneg: 
|   h2
|_  http/1.1
445/tcp  filtered microsoft-ds
593/tcp  filtered http-rpc-epmap
4444/tcp filtered krb524

Service detection performed. Please report any incorrect results at https://Nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 24.95 seconds

-A 参数开启端口扫描、系统检测、版本检测、脚本扫描及路由追踪,是一个比较常用的参数。

从扫描结果可以看到,lagou.com 开放端口:80、135、139、443、445、593、4444 以及对应的服务名称。

网站指纹识别

网站指纹是 Web 服务组件在开发时留下的类型、版本等标记信息,包括 Web 服务器指纹、Web 运用指纹及前端框架指纹等。

除了前面用 Nmap 扫描端口和服务的方法,我们还可以通过前端网页和返回一些 HTTP 头信息来判断网站使用的哪些开发框架、服务器、系统,在渗透测试时也可以提供有针对性的测试思路。

我比较推荐 Chrome 插件Wappalyzer。在你打开网站后,点击插件,按钮就会弹出如下类似信息,网站的指纹信息一目了然。

图 12:Wappalyzer

还有一个在线检测网站也支持指纹检测:https://scan.top15.cn/web/,如下图所示:

图 13:ThreatScan

其他检测指纹的工具还有 WhatWeb、WPScan、JoomScan 等,你可以自行搜索试用。

旁站与 C 段查询

有时测试的网站非常坚固,找不到任何漏洞,那我们就可以尝试对"旁站"进行渗透测试。旁站即同一服务器上的其他域名网站,如果你能攻下该旁站,就有机会间接拿到目标网站的权限。

还有另一种方法就是查询 C 段 IP,即同一内网段的服务器。比如 lagou.com 的 IP 为 106.75.118.232,那它的 C 段 IP 为 106.75.118.1~106.75.118.255,通过攻下同一 C 段的服务器,再间接渗透到目标服务器。

无论是旁站还是 C 段渗透方式,都是尝试从目标网站的旁路途径去间接渗透目标。在这里我推荐几个在线查询旁站和 C 段的网站,同时提供一些指纹检测信息。

(1)https://www.webscan.cc/

图 14:The Web of WebScan

(2)https://chapangzhan.com/

图 15:IP 查询

WAF 探测

当网站开启 WAF(Web 防火墙)时,很多测试请求都会被拦截,导致无法正常扫描。此时就要分析 WAF 找到绕过的方法,否则很难挖到漏洞。在不知道的情况下,还以为真的没有漏洞,其实有时只是被 WAF 拦截了而已。不过就算挖到了漏洞,利用起来也有一定的门槛。

因此,在测试前,若发现发包经常测试失败的话,除非网络不通,否则都建议先探测下 WAF。如果存在 WAF 就尝试寻找绕过的方法,再改造测试用例进行重试。

上一讲中介绍的 SQLMap 就支持 WAF 检测,上文介绍的 TScan 也支持,不过有时会误报。这里我主要介绍一下 SQLMap 检测 WAF 的方法,使用命令如下:

java
python sqlmap.py -u "http://www.lagou.com" --identify-waf --batch

上述代码中,--identify-waf 参数开启 WAF 检测,--batch 参数不询问用户输入,按默认执行。

SQLMap 既支持常见 WAF 的检测,也支持自己写脚本扩展检测能力。

敏感信息收集

2019 年 4 月发生了一起大疆前员工泄密源码的事件,该名员工将大疆公司的在用产品源码开放到 GitHub 上,其中还包含云服务器上登录密钥,导致他人可以登录服务器查看上面存在的各种用户数据,最后被判刑。

图 16:大疆前员工泄密源码事件

从这件事也可以看到在网络上泄露的一些敏感信息,有时会直接导致服务器被入侵,公司相关的知识技术产权被窃取,造成实际的经济财产损失。

因此,在授权的渗透测试过程中,我们要多方收集与目标相关的信息,包括 Google、GitHub、社交平台等多方渠道。我曾多次利用 GitHub 找到一些账号密码或密钥,从而获得授权测试的网站的最高权限,收集 GitHub 相关的敏感信息如下:

根据收集到的相关信息,我们还可以制作字典用来猜解一些相关账号和密码,此类的相关工具有:

最后我再推荐几款综合能力较好的信息收集工具。

  • Recon-NG 是一款被动信息收集工具,它可以通过搜索获取 IP 地址、地理位置、用户、邮件地址、密码泄露或者其他敏感信息,最终生成一份完整报告。

图 17:Recon-NG

  • iKy的界面很酷,它能够从 Twitter、GitHub、Skype、Linkedin、Instagram 等社交平台上收集信息,但需要提前设置各平台上的 API KEY,可以输入一个邮箱地址去搜索其上述平台上的关联信息,最后会以可视化效果展示出来,如下图所示。

图 18:iKy

  • discover综合使用了很多工具,包括 dnsrecon、goofile、whois、recon-ng、dnssy\Nikto 等,它能够收集邮箱地址、雇员名字、主机信息、域名、IP 等一系列信息,最后提供 html 报告。

信息收集不局限于我上面举例的这些,有些你通过 Google 搜索到的文档、图片、敏感文件和目录等都可以。在后面的渗透测试过程中,说不定它们就能派上用场了。

收集的信息不怕多,就怕不全

总结

这一讲我主要介绍了一些收集目标相关信息的常用方法和工具,包括域名和 IP、端口服务、网站指纹、旁站和 C 段、WAF、敏感信息等信息的收集。但信息收集不应局限于此,你可以根据渗透测试的需要,对扩展收集信息的范围,灵活变通。

收集信息之所以如此关键,是因为它能曝光出更多的攻击面,有助于我们寻找到目标的短板,这常常决定渗透测试的成败。

前面讲的域名收集方法中介绍了不少工具,但扫出来的域名该如何批量检测是否可访问呢?手工显然是不合理的,毕竟数量通常都很大。因此,我们需要自己动手写个脚本。

你可以尝试写一个看看,比如用 Python 的 requests 模块。但你要注意一下,有些域名只允许 https 或 http 的方式连接,需要把这些因素考虑进去。如果域名较多,你还要考虑下多线程并发提高检测速度,同时还要做好域名的去重。比如下列脚本的检测效果:

图 19:域名验证脚本

你可以尝试写一个域名验证脚本(Python、Shell......),如果遇到了什么问题或者是有什么心得,欢迎在留言区分享和讨论。

下一讲,我将带你了解如何自己搭建用于练习漏洞攻防的靶场,避免你在他人网站做测试,造成承担不必要的违法责任。