这篇文章主要学习在渗透测试中如何进行信息收集。文本的核心目的是学习 渗透测试中信息收集
的相关技术,任何人员如果使用这些技术从事违法活动,与本人无关。一定牢记,任何未授权的渗透测试都是非法行为。
前言
-
渗透测试:出于保护系统目的,更全面地找出测试对象的安全隐患(褒义词)
-
入侵:不择手段(甚至是具有破坏性的)拿到系统权限(贬义词)
-
红队:攻击队
-
蓝队:防守队
渗透测试一般都是黑盒测试。对应的是白盒测试,也称为代码审计。灰盒测试则是同时进行黑盒测试和白盒测试。
渗透测试流程
总体来说,工作中的渗透测试可以分为以下 8 个步骤:
- 明确目标
- 信息收集
- 漏洞探测
- 漏洞验证
- 提取所需
- 信息分析
- 信息整理
- 形成报告
其中的核心流程:
- 明确目标(明确的资产信息表)
- 收集足够的信息
- 工具扫描或者手工发现漏洞
- 工具也称为漏洞扫描器(简称漏扫),即通过自动化工具进行漏洞扫描
- 成功利用高危漏洞
- 获取 webshell
- 提权:控制服务器
- 直接获取系统权限
- 获取 webshell
- 渗透内网
- 结束
测试地点可以分为:
- 从外网测试:直接通过互联网连接进行黑客行为模拟
- 从内网测试:连接公司内网进行测试
渗透测试要求:一般客户对渗透测试过程是有要求的,比如时间、地点、测试时的参数设置、是否能够使用自动化工具测试等。这些要求都会在 授权书
中体现。没有授权书的渗透测试是非法的。
域名信息收集
域名注册信息
可以通过 站长之家->whois
查询域名注册信息。
1 | https://whois.chinaz.com/ |
除了站长之家的 whois
查询之外,还有很多其他类似的网站,例如阿里云的 whois 查询。
SEO 信息收集
可以通过 站长之间->SEO 综合查询
,也能查询到域名相关的信息。
1 | https://seo.chinaz.com/ |
子域名收集
baidu.com
是二级域名,而 www.baidu.com
就是三级域名(也是百度的主站),news.baidu.com
、tieba.baidu.com
等域名也是三级域名。
主站(通常以 www 开头)的防护一般做的很好,旁站和 C 段入侵是主要的手段,找薄弱的站点渗透。
收集某个二级域名的子域名,可以通过字典爆破的方式,逐个 ping 每个拼接构造的子域名,如果能够 ping 通,则说明该子域名真实存在。很多子域名扫描工具就是通过这种方式实现的,例如这个工具 在线子域名扫描 - Youngxj。
同样可以通过 站长之间->子域名查询
来完成该工作:
1 | https://tool.chinaz.com/subdomain |
子域名收集工具
还有一些开源的子域名收集工具,例如 jsfinder:
- jsfinder 的工作原理是通过爬取网站的 js 文件,然后分析其中涉及请求的域名,从而发现子域名
- 一个 html 文件可能会包含很多
<script>
标签,这些<script>
标签就有对应的 js 文件。通过分析这些 js 文件,分析其中通信所涉及的域名,可以发现很多子域名
还有一个 layer 子域名挖掘机。除此之外还有 OneForAll(比较强大)、subDomainBrute、Sublist3r 等工具。
备案号和 SSL 证书查询子域名
域名使用都需要在工信部进行备案,称为 ICP 备案。通过 ICP 备案号可以查询到域名相关信息。例如可以通过站点之家进行 ICP 备案查询:
1 | https://icp.chinaz.com/ |
也可以在工信部官网进行查询:
1 | https://beian.miit.gov.cn/#/Integrated/index |
SSL 证书的申请需要公司信息和域名信息,所以通过 SSL 证书的查询也可以得到一些域名信息:
1 | https://myssl.com/ |
收集真实 IP 地址
一个站点可能存在 CDN 加速,因此我们访问某个域名可能并不是直接访问到真实的服务器,而是访问了 CDN 节点。有些漏洞攻击在 CDN 节点执行意义不大,因为很可能拿不到有意义的数据。
为了直接检测真实站点服务器的漏洞,我们还是需要找到该站点真实的 IP 地址。
- 可以通过超级 ping 来判断一个站点是否存在 CDN:超级 ping 会在多地 ping 一个域名,通过 ping 结果的响应 IP 的个数,来判断该域名是否存在 CDN 加速。如果存在较多个数的 IP 地址,一般说明开启了 CDN 加速。
1 | https://ping.chinaz.com/ |
- 有的时候,ping 一个域名,但是响应的是另一个域名,也有可能是 CDN 节点进行了响应
1 | $ ping www.bilibili.com |
- nslookup/dig 也可以用来查询域名解析是否是正常的,通过它可以查询一个域名真实的 IP 地址
1 | nslookup www.bilibili.com |
cdn 绕过方法
- 使用 cdn 绕过工具(效果不一定好)
1 | fuckcdn |
- 历史 dns 解析:通过这种历史记录查询,有可能能够找到该站点没有使用 CDN 之前的真实 IP。有很多在线工具可以完成这项工作:
1 | https://www.dnsdb.io/ |
- 找子域名:使用 CDN 是有成本的,因此可能某些子域名直接指向源站,这个源站 ip 和那些使用 cdn 的域名,可能会在同一个网段(公司买公网 IP 可能是买一段 IP)。
旁站和 C 段信息收集
- 旁站:一般是指同一个 IP 下不同的站点,例如在一台 Nginx 服务器上配置多个站点(virtual host)
- C 段:公司有可能买的是一个网段,因此我们在得到某个 IP 地址时,可以对该 IP 地址所在的网段(例如使用 24 掩码,即 C 类网段)的所有 IP 地址进行扫描
扫描旁站和 C 段都可以使用一些工具,例如 DotNetScan
。
常用端口说明
通常一些服务会运行在知名的端口上,我们需要记住这些常用端口:
- ftp:21,ftp 服务主要用于文件传输
- ssh:22,ssh 服务主要用于远程登录
- telnet:23,telnet 同样用于远程登录,但是其是不安全的
- smtp:25,邮件服务
- pop3:110,邮件服务
- dns:53(udp),域名解析服务
- https:443,加密的 http 服务
- http:80,非加密的 http 服务
- mysql:3306,数据库服务
- postgresql:5432,数据库服务
- redis:6379,数据库服务
- vnc:5900,远程控制工具
- rdp:3389,Windows 远程桌面服务
nmap 扫描
nmap(网络映射器)是由 Gordon Lyon 开发的一种安全扫描器,用于发现计算机网络上的主机和服务,从而创建 网络的映射
。nmap 主要有以下功能:
- 主机发现:识别网路中的主机
- 端口扫描:枚举目标主机上开发的端口
- 版本检测:询问远程设备上的网络服务以确定应用程序的版本号
- os 检测:检测网络设备的操作系统和硬件特性
- 支持 Lua 脚本:可以编写自定义的 nmap 脚本来扩展其功能
- 漏洞检测
除了 nmap 之外,还有类似的工具,例如 masscan。
nmap 的主机发现原理类似于 ping,但是手段不限于 ping。发送探测报文到目标主机,如果收到回复,那么说明目标主机是开启的。nmap 支持多种主机探测方式,因为单纯依靠 ping 可能是不准确的,例如目标主机可以通过 iptables 规则来丢弃 icmp 报文,这样 ping 探测的结果就是不准确的。
使用 nmap 的 -sn
来实现主机扫描,但不进行端口扫描。它不仅使用 ICMP echo 请求,还会发送其他类型的探测包(例如 TCP 的 SYN 包等)来判断主机是否响应。
1 | # nmap -sn 10.9.33.133/30 |
端口扫描也是 nmap 的核心功能之一,默认它会扫描 1000 个最有可能开发的 TCP 端口。例如使用 nmap 的 -sS
选项来进行 TCP 半开放扫描
,也称为 SYN 扫描
。它发送一个 SYN 包到目标端口来探测该端口是否开放。如果目标端口是开放的,目标主机会返回一个 SYN/ACK 包作为响应,之后 nmap 会发送一个 RST 包来终止这个未完成的连接,从而避免在目标主机上留下任何连接记录。这种扫描技术既快速又相对隐蔽,因为它不会完成完整的 TCP 三次握手过程。
1 | # nmap -sS 10.9.33.133 |
namp 也支持其他方式的端口扫描,例如 全连接扫描
(-sT
),UDP 扫描
(-sU
)等。
也可以通过 telnet 来判断某个主机的端口是否开放了,如果 telnet 能够连接上该端口,就说明该主机的该端口是打开的。
1 | # telnet 127.0.0.1 22 |
1 | # telnet 127.0.0.1 81 |
扫描到端口之后,攻击者就可以搜索该端口上运行服务的已知漏洞并尝试利用。
nmap 还可以用于版本侦测,对应的选项为 -sV
。
1 | # nmap -sV 10.9.33.133 |
nmap 还可以利用 TCP/IP 协议栈指纹来识别不同的操作系统和设备。使用 -O
选项来进行操作系统检测。
nmap 也提供漏洞扫描的功能,但是 nmap 的漏洞库很少,因此一般还是使用专业的漏洞管理工具来进行漏洞扫描。使用 nmap 目标 --script=auth,vuln
进行漏洞扫描。
收集网站的指纹信息
网站的指纹信息是指网站所使用的技术栈信息,例如编程语言、框架、http 服务器信息等等。基于这些信息,同样可以去漏洞库中搜索已知的漏洞并尝试利用。
有些工具可以用于收集网站的指纹信息,例如潮汐指纹 ,wappalyzer(提供浏览器插件)、Ehole 等。
除此之外,还可以去网页代码中查找指纹信息,例如很多 CMS 生成的站点在其网页源代码中都会包含一些关键字,例如 discuz
、wordpress
等。
收集敏感信息
目录信息收集
当我们想检测一个站点的安全性时,我们需要知道该站点有哪些页面。一个网站一般有前台用户页面,同时也存在后台管理页面,后台管理页面一般只能通过内网访问。如果后台管理页面可以通过公网访问,则攻击者可以通过收集站点的目录信息,找到该后台管理页面的访问入口,进而尝试进行攻击。
有的时候,网站管理员可能会对网站内容进行备份,这个备份文件可能直接遗留在网站的根目录下了。这个备份文件也有可能被攻击者扫描到,那么攻击者就可以直接下载这个备份文件。在得到网站的源代码后,就可以分析其中的各种敏感信息/漏洞信息。例如配置文件中可能包含数据库的连接信息,进而尝试利用这些信息进行攻击。
可以通过 dirsearch 等工具对目标网站的敏感目录和文件进行扫描。
代码管理工具信息泄露
在开发过程中,一般需要使用 git、svn 等版本管理工具来进行代码分支/版本管理。代码管理工具信息泄露可能导致整个网站的源代码被攻击者获取。例如对于 git 工具,初始化仓库时会生成一个 .git
目录,用来记录代码的变更记录、日志等等。如果在部署代码时(例如在 Nginx 服务器上部署站点的静态文件),没有把 .git 目录删除,攻击者就可以通过这个目录来恢复整个网站的源代码,例如借助 GitHack 工具。
除此之外,Mac 下的 .DS_Store
文件也可能泄露敏感信息。.DS_Store
文件是 Mac 系统用来存储文件夹的自定义属性的隐藏文件。如果把该文件夹也部署到站点目录里,同样有可能造成源代码文件信息的泄露,例如借助 ds_store_exp 工具。
同样,svn 工具所使用的 .svn
目录也会造成敏感信息泄露。.snv
目录下的 wc.db
文件记录了仓库的版本信息,它是一个 sqlite 数据库文件,打开该数据库文件后就可以直接看到关于源码的各种敏感信息了。
代码托管平台信息泄露
代码托管平台(github、gitee 等),也有可能造成敏感信息泄露,例如员工不小心将公司代码泄露到 github 公共仓库中,或者将一些内网配置信息(例如数据库连接方式)泄露到 github 中,这些敏感信息都可能被攻击者利用。
信息收集综合利用工具
google hack
Google 等搜索引擎能够提供一些高级搜索功能,可以帮助我们快速定位资产,例如通过 inurl: .php
来搜索所有包含 .php
的页面。常用的高级语法有:
inurl:
搜索包含指定字符串的 URLrelated:
搜索与该网址类似的网站intext:
只搜索网页内容中包含指定内容的页面intitle:
只搜索网页标题中包含指定内容的页面filetype:
只搜索特定类型的文件,例如filetype:pdf
link:
得到一个包含某个指定 url 的页面列表,即这些页面中都存在指向该 url 的链接location:
搜索特定地理位置的页面site:
限制在某个网站下进行搜索
黑暗搜索引擎
黑暗搜索引擎,也称为 网络空间搜索引擎
,例如 Shodan、fofa、zoomeye,这些工具可以快速定位到互联网上的资产信息,它们通常支持多种查询语法。
ARL 灯塔资产探测系统
ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统 可以将上述信息收集的手段集成到一起,并提供一个统一的界面来进行资产探测,同时支持调用 nuclei 默认 PoC(Proof of Concept,这里可以理解为漏洞验证代码)对站点进行检测。
移动端信息收集
目前常用的移动端包括 App、微信小程序等。为了收集移动端的敏感信息,可以从两方面入手:
- 直接对移动端 app 进行逆向分析,从中提取服务器域名等敏感信息
- 对移动端的通信进行抓包,这样可以捕获到移动端与服务器的通信数据,进而分析其中的敏感信息
另外值得说明的是,有些移动端 App 其实是 Web 应用的封装,对于这类 App,直接通过抓包就可以收集信息。
App 逆向工程
可以通过 android-killer 工具来对 Android App 进行逆向分析。例如可以通过 Android->字符串搜索
对反编译出来的源代码进行字符串搜索,为了查找 App 与服务器通信的域名,可以使用 http://
、https://
作为关键字。
burp 抓包
为了对移动端 App 进行抓包,可以将手机和 PC 连接在同一个局域网内:
- pc 端的 Burp Suite 需要设置监听 ip 和端口
- 手机网络设置代理,将代理设置为 pc 上 burp 所监听的 ip/端口
- 安装证书(用于抓取 https 流量):首先需要导出 burp 的 CA 证书(以
.cer
作为后缀名),然后在手机上安装该证书
除了对移动端 App 进行抓包,还可以用类似的方法对微信小程序进行抓包。我们可以直接使用 PC 版本的微信来访问小程序,并通过 burp 进行抓包。