不在服务器上留下日志,我翻出了它的数据库密码
假设我给你一个域名,再加上一台能上网的电脑,你能查出什么?
答:它的后台入口、它的相关站点、它开放了哪些端口或者它数据库里用过的一些密码。整个过程不需要触碰到目标的服务器,能用到的只有搜索引擎和公开的数据库。
听起来好像很厉害,好像是电影里的桥段,其实这是一次渗透测试里基本都会做的事情。
以下所有示例均在授权测试与本地靶场环境中进行,仅用于理解资产暴露面与防御方法。对未授权目标使用文中技术属于违法行为。
下手之前,先查资料
有些人认为渗透就是用命令行加工具一顿敲,但是真正在行的人才明白,在一次渗透流程中信息收集的时间权重占比是非常大的。
在行业里,渗透测试非分为了七个阶段:前期交互 / 预接触、情报收集、威胁建模、漏洞分析、渗透攻击 / 漏洞利用、后渗透、报告。做完这几个步骤之后建议再进行清理和复测。信息(情报)收集是整个阶段花费时间最长且最重要的一个阶段。
为什么?因为掌握的信息面意味着你在后续渗透中的攻击面。你不知道目标有什么资产,那渗透方面就更无从下手了;越多的攻击面也就意味着能找到更多可能的漏洞。
先宽后窄,先被动再主动。
先宽后窄:先大范围的摸清楚目标的资产,从所有的资产中找重点资产下手。
先被动后主动:首先用第三方服务查询,在能不接触目标的时候先不要动。
这个顺序之所以重要,是因为主动扫描的方式会先在对方的日志下留有痕迹,还大概率触发对方的告警。多次的主动扫描可能会让对方引起怀疑,后面的渗透流程会更难。
一、把搜索引擎当数据库用
有的搜索引擎早就会把目标的页面给爬一遍,你要做的就是用正确的语法来问它,这套用法有是有专门的名字的叫做Google Hacking,
最常用的搜索语法有六个
| 语法 | 作用 |
|---|---|
| intext | 搜索页面正文 |
| intitle | 搜索标题 |
| inurl | 搜索网址里的关键词 |
| site | 限定域名 |
| filetype | 限定文件类型 |
| info(已停用) | 查站点概况 |
其中intitle一次只能搜一个词,需要多个词时使用allintitle更合适
这些语法组合起来才能发挥作用。比如你想找某企业的后台入口,可以用:site:(目标域名) intitle:"后台管理"。想要找暴露在外面的表格文件可以写 filetype:xls site:目标域名,这样你有概率获得一个带有员工信息的Excel表格。
还有三个运算符:减号排除,引号完全匹配,OR逻辑或。想排除政府一些政府网站就可以在末尾加上-site:gov.cn就行。
这套语法的作用在于,它是翻的搜索引擎已缓存的公开页面。目标服务器不知道有人在查它,你的IP也不会出现在它的任何一条日志里。
第二招:空间测绘引擎
刚刚使用的搜索引擎是查页面,而接下来学习的测绘引擎查的是设备。FOFA和Hunter这两个是最常用的,它们基本把全网的指纹设备全部给扫了一遍存进数据库,你写查询语句就能查询,全程和目标基本没有交互。
在FOFA中写domain="目标.com" && title="后台",能直接找到带后台字样的资产。

如果写ip="12.12.12.0/24"即可查询这个C段暴露出来的全部资产。写`icp="(备案号)"即可按照备案号查询同一主体下的所有域名,很多企业漏管的边缘站点就是这么被发现的。
在获取到对方授权进行测试的时候应该还要注意对方授权的范围,如果在测试的时候对方并没有给予你权限做渗透测试有违法风险。
Hunter的思路也是相似的:app="(网站名称)" && ip.ports="8000"用于查找特定设备,`header.server=="Microsoft-IIS/10"按响应头筛中间件,domain="目标.com"做子域名枚举
栗子:

或者是说想要找某个特定版本组件的站点可写app.vendor="PHP" && app.version="1.8.1"

FOFA还有逻辑运算符&&与、||或、==精准匹配、!=排除,输入方法其实和写代码的习惯差不多。
一个口诀:&& 全都要,|| 有一个就行,== 完全相等,!= 排除不要。
收集清单上有什么
在渗透之前我们要收集以下数据:
| 收集的数据 | 作用 |
|---|---|
| IP和DNS信息 | 找到目标真实 IP、域名解析关系、邮件服务、CDN/WAF 线索、NS/MX/TXT 等记录 |
| 子域名、旁站和 C 段 | 扩大资产面。子域名常暴露测试站、旧站、OA、VPN、后台;旁站是同 IP 其他站点;C 段是同网段资产 |
| CMS 类型与版本 | 识别网站用什么建站系统,如 WordPress、Drupal、Joomla、ThinkPHP、织梦等 |
| 敏感目录与文件 | 发现备份文件、配置文件、日志、.git、.svn、phpinfo、上传目录、测试页、robots.txt 等 |
| 开放端口与服务 | 确定目标对外暴露了哪些端口和服务,如 22、80、443、3306、6379、8080、3389 等 |
| 操作系统与中间件版本 | 识别 Windows/Linux 版本,以及 IIS、Nginx、Apache、Tomcat、WebLogic、JBoss 等中间件版本 |
| 邮箱与人员信息 | 收集员工姓名、邮箱、职位、组织架构、社交账号、公开联系方式 |
| 历史漏洞与安全公告 | 查目标历史 CVE、CNVD、厂商通告、泄露事件、旧漏洞修复情况 |
其中的旁站还有C段可以拿出来单独讲,旁站指的是同一台服务器上挂着的其他网站,如果能拿下其中一个服务器,也就说明摸到了其他几个服务器的门。C段是目标IP所在的一整个网段,同网段里可能会有同一家的测试机或者监控系统,这些机器的防护相对于对外网站可能会更薄弱一点。
这些信息拿到以后,目标的网络轮廓就掌握的差不多了,后面要讲的[敏感目录与文件]这一章是清单里最容易致命的一项。
被动手段用完,开始轮到主动
被动信息收集完后才开始考虑主动信息收集:拿工具对目标网站和主机进行扫描,效率更高,但是缺点是:对方的日志会留下你的操作记录。
端口扫描的最常用的软件是nmap,这里很容易搞混。
例:使用nmap进行全端口扫描:

全端口扫描靠的是-p-,-A指的是激进探测,会顺带做版本、操作系统、脚本和路由探测,两个不能搞混。除了这两个还有-sC是跑默认安全脚本,-T4调的是扫描速度。
除了端口之外,还有目录扫描收集,这件事情很直白。就是把backup\test\login这些常见路径挨个向服务器访问一遍,只要是200就问题不大说明可以访问。像后台入口、忘记删的备份压缩包、上线之前忘记清理的测试页面,很多就是通过这样的方法测试出来的。
如果进行目录扫描可以用dirsearch
它的主要参数不多:-u指定目标,-e指定扩展名,-w换字典,-t调线程,-x 404排除不存在的页面。
例子:

如果你想进行子域名查询的话,kali里面还有一些顺手的工具,
sublist3r它把搜索引擎和各种公开数据源进行了聚合,一条sublist3r -d 目标.com能拉出一大批的内容。它走的是第三封数据,动静相对较小。
例子:

一个被遗忘在发布目录里的文件夹
有个文件夹叫.git,它是Git版本控制系统在项目里生成的隐藏目录。它主要记录着完整的提交历史:每次改了什么内容,谁改的、什么时候改的、为什么改,还有一些被删掉的代码可以在这里面找回。
除了Git,SVN项目会生成.svn,Mercurial项目会生成.hg,都差不多,只不过用的人少了,所以出现的也少。
它是如何跑在服务器上的?
这个情况的出现主要出现在部署的环节。有些开发者为了图省事,把整个项目目录连同.git一起上传到了Web发布目录,但是服务器也没有配置规则来禁止访问隐藏的目录。
然后这个文件夹就出现在了公网上,就有概率被一些知道的人挖掘到。
攻击者拿到了这个文件能知道什么?
举个例子:要是某个人用户在提交里写过DB_PASSWORD=123456,后来密码改了,配置也加进了.gitignore。但旧版本的对象还躺在.git/objects/里。
此时要是翻一下历史能拿到密码。这个和大马力曾经硬编码过API key同理,加进忽略列表也只是保证从今往后不会再提交,历史它并不会跟着一起消失。
这个目录存的是对象化的完整源码,可以用它顺着把整个仓库拉回来并且在本地还原,基本等于把生产环境的代码打包发给你了,你能在里面找到配置文件、内部接口地址、注释里写的临时账号。
回头看着一整个攻击链:利用搜索引擎的语法帮你找到网站,然后使用测绘工具帮你画出资产地图,.git帮你在地图上找到密码,全程没有碰到过目标服务器以下,对方的日志里没有任何痕迹。
怎么防
现在我们知道了攻击者的大概渗透手段,那我们要怎么防。
1.
部署的时候剔除版本控制的目录。发布流程里用rsync排除或者单独打包,千万别把.git传上去,这一步能减少9成的源码泄露。
2.
Web服务器里禁止访问用.开头的隐藏目录(一般情况下也不会有正常的用户访问隐藏文件)。Nginx加一条location匹配规则,就能够抵挡大部分的扫描器
3. 密钥在开发的时候就不要写进代码。写进去再删除也会留痕,基本相当于没删,Git历史会一直保留。走配置中心或环境变量,如果泄露了还能立刻轮换。如果密钥已经进入了历史,一律当做已经泄露,直接换掉。
4. 定期自查暴露面,可以用测绘软件按照域名和备案号等重要信息查一遍公司的资产看看有哪些暴露在了公网,特别是后台管理系统,如果IP能用白名单就加白名单,攻击者能看到的东西必须要比他能先看到。
写到最后
信息收集其实就是收集拼图,利用各方收集到的信息来进行拼凑,信息完整了就能拿到整个网站的全貌,相反,如果是防守方的话这章就是对攻击者所能接收到的信息进行盘查:上面每一条查询的语法,都是在自查暴露面的时候排查的清单。