信息收集(上):被动信息收集
信息收集是整个渗透测试的基石。说白了,你连目标用的是什么技术栈、暴露了哪些资产都不知道,后面的攻击就全是瞎蒙。我个人习惯把信息收集分成两个阶段:被动和主动。这一章我们先聊被动信息收集——也就是不直接触碰目标系统,全靠公开渠道挖信息。
你想想看,一个合格的渗透测试,信息收集阶段至少要占到整个项目时间的 30% 到 40%。我见过太多新手上来就扫端口、跑漏洞,结果撞上 WAF 被 ban IP,连目标是什么框架都没搞清楚。嗯,这里要注意:被动信息收集做扎实了,后面的主动探测才能有的放矢。
核心原则:被动信息收集不产生任何直接流量到目标系统,完全基于第三方数据源和公开记录。合法、隐蔽、无痕。
被动信息收集全景图
先给你一张整体结构图,把这一章要讲的东西串起来。我每次做项目前,都会在脑子里过一遍这个流程。
Google Hacking:搜索引擎是你的第一把刀
很多人觉得 Google Hacking 就是搜几个关键词,太简单了。其实不然。我见过有人用 site:target.com filetype:sql 直接找到了生产数据库的备份文件——就因为 DBA 把备份放在了 Web 可访问目录下。
Google Hacking 的核心是利用搜索引擎的高级搜索指令,把目标相关的敏感信息从海量网页里筛出来。常用的指令就这几个,但组合起来威力巨大:
| 指令 | 作用 | 实战示例 |
|---|---|---|
site: |
限定搜索域名 | site:example.com |
filetype: |
搜索特定文件类型 | filetype:pdf |
intitle: |
搜索页面标题 | intitle:"index of" |
inurl: |
搜索 URL 中包含的关键词 | inurl:admin |
intext: |
搜索页面正文内容 | intext:"password" |
link: |
搜索指向某域名的链接 | link:example.com |
cache: |
查看 Google 缓存的页面 | cache:example.com |
我的习惯:拿到目标域名后,第一件事就是跑 site:target.com intitle:"index of"。这个组合能直接找到开启了目录列表的 Web 服务器,经常能翻到意想不到的东西。
举个例子,假设目标域名为 example.com,你可以这样组合:
# 查找所有 PDF 文件
site:example.com filetype:pdf
# 查找可能的管理后台
site:example.com inurl:admin OR inurl:login
# 查找包含密码的文件
site:example.com intext:"password" filetype:txt OR filetype:log
# 查找配置文件
site:example.com filetype:conf OR filetype:config OR filetype:ini
# 查找数据库备份
site:example.com filetype:sql OR filetype:bak OR filetype:dump
我曾经在一次红队演练中,用 site:target.com filetype:env 找到了一个暴露的 .env 文件,里面直接写着数据库连接字符串。嗯,那个项目后来被我们写进了内部案例库。
注意:Google Hacking 的结果依赖于 Google 的爬虫索引。如果目标网站设置了 robots.txt 禁止爬取,或者页面需要登录才能访问,那 Google 就搜不到。另外,搜索结果可能包含大量无关页面,需要耐心筛选。
Shodan:互联网设备的搜索引擎
如果说 Google 搜的是网页,那 Shodan 搜的就是设备。路由器、摄像头、工控系统、数据库——只要连了网,Shodan 就有可能扫到。我刚开始用 Shodan 的时候,随便搜了个 port:3389,结果跳出来几千个暴露在公网上的 Windows 远程桌面,有些连密码都没改。
Shodan 的核心能力在于它持续扫描全网 IP 的开放端口,并抓取服务的 banner 信息。你可以通过过滤条件精确锁定目标:
# 搜索特定端口和服务
port:22 OpenSSH
# 搜索特定设备
apache country:CN
# 搜索特定组织
org:"Target Company" port:443
# 搜索工控系统
"SCADA" "Siemens" port:102
# 搜索摄像头
"webcam" "default password"
Shodan 的过滤语法很灵活,我整理了几个最常用的:
| 过滤条件 | 说明 | 示例 |
|---|---|---|
port: |
按端口号过滤 | port:3306 |
country: |
按国家代码过滤 | country:US |
org: |
按组织名称过滤 | org:"Google" |
hostname: |
按主机名过滤 | hostname:example.com |
product: |
按产品名称过滤 | product:Apache |
version: |
按版本号过滤 | version:2.4.49 |
os: |
按操作系统过滤 | os:Windows |
避坑指南:我曾经在 Shodan 上搜到一个目标公司的 Jenkins 服务器,版本是 2.190,存在未授权访问漏洞。但直接访问会被 WAF 拦截。后来我通过 Shodan 提供的 HTTP 响应头信息,发现它前面挂了 Nginx 做反向代理,于是绕过了 WAF 直接访问 Jenkins 的 8080 端口。Shodan 的 banner 信息里藏着很多细节,别只看端口。
DNS 枚举:从域名到 IP 的资产地图
DNS 枚举说白了就是搞清楚目标有哪些域名、子域名、以及它们对应的 IP 地址。我见过太多公司只保护了主站,子域名却暴露了一堆测试环境、开发后台,甚至还有 VPN 入口。
常用的 DNS 记录类型和它们的作用:
| 记录类型 | 含义 | 渗透测试价值 |
|---|---|---|
| A | 域名到 IPv4 的映射 | 直接获取目标服务器 IP |
| AAAA | 域名到 IPv6 的映射 | 发现 IPv6 资产,可能被忽略 |
| MX | 邮件交换记录 | 找到邮件服务器,用于钓鱼或社工 |
| NS | 域名服务器记录 | 了解 DNS 架构,寻找区域传输漏洞 |
| CNAME | 别名记录 | 发现 CDN、云服务等第三方资产 |
| TXT | 文本记录 | 可能包含 SPF、DKIM 等安全配置信息 |
| SOA | 起始授权记录 | 获取 DNS 管理员邮箱 |
手动查 DNS 可以用 nslookup 或 dig,但我更推荐用脚本批量枚举。下面是一个简单的 Python 示例:
import dns.resolver
def dns_enum(domain):
records = ['A', 'AAAA', 'MX', 'NS', 'CNAME', 'TXT', 'SOA']
for record in records:
try:
answers = dns.resolver.resolve(domain, record)
for rdata in answers:
print(f"{record}: {rdata}")
except Exception as e:
print(f"{record}: 未找到或查询失败 - {e}")
dns_enum('example.com')
子域名枚举是 DNS 信息收集的重头戏。常用的方法有三种:
- 字典爆破:用常见子域名列表(如
www、mail、admin、dev、test)去解析 DNS。工具推荐subfinder或dnsrecon。 - 搜索引擎抓取:用 Google 的
site:*.example.com指令,或者用crt.sh查询 SSL 证书透明度日志。 - DNS 区域传输:如果目标 NS 服务器配置不当,可以直接请求整个域名的 DNS 记录。虽然现在很少见了,但值得一试。
实战技巧:我习惯把子域名枚举的结果和 Shodan 结合起来。比如找到 dev.example.com 后,去 Shodan 搜 hostname:dev.example.com,看看它开放了哪些端口、跑了什么服务。有时候开发环境会开着 22、3306、8080 这些端口,而且密码还是默认的。
Whois 查询:挖出目标背后的注册信息
Whois 查询能告诉你一个域名是谁注册的、什么时候注册的、什么时候过期、以及注册商和 DNS 服务器信息。这些信息看起来不起眼,但社工的时候特别好用。
常用的 Whois 查询方式:
# 命令行查询
whois example.com
# 使用 Python 库
import whois
domain_info = whois.whois('example.com')
print(f"注册人: {domain_info.name}")
print(f"注册邮箱: {domain_info.email}")
print(f"注册日期: {domain_info.creation_date}")
print(f"过期日期: {domain_info.expiration_date}")
print(f"DNS 服务器: {domain_info.name_servers}")
Whois 信息里最值钱的是注册邮箱和注册人姓名。我曾经在一次项目中,通过 Whois 找到了目标公司的 IT 负责人邮箱,然后去 LinkedIn 上找到了他的个人资料,发现他同时在几个技术论坛上发过帖子。顺着这些帖子,我找到了他曾经公开过的个人项目代码,里面居然还留着公司内网的 VPN 配置信息。
注意:现在很多域名注册商提供隐私保护服务,会把真实的注册人信息隐藏起来,显示为代理信息。这种情况下 Whois 能拿到的信息就很有限了。不过,有些老域名或者小公司的域名可能没有开启隐私保护,值得一试。
信息整合:把碎片拼成地图
上面讲的四个方向——Google Hacking、Shodan、DNS 枚举、Whois 查询——单独看都是零散的信息。真正的价值在于把它们整合起来。我每次做完被动信息收集,都会整理成一张表格:
| 资产类型 | 来源 | 示例 | 潜在风险 |
|---|---|---|---|
| 主域名 | Whois / DNS | example.com | 基础攻击面 |
| 子域名 | DNS 枚举 / Google | dev.example.com | 开发环境暴露 |
| IP 地址 | DNS A 记录 | 192.168.1.1 | 端口扫描目标 |
| 开放端口 | Shodan | 22, 80, 443, 3306 | 弱口令、漏洞服务 |
| 敏感文件 | Google Hacking | backup.sql | 数据泄露 |
| 注册人信息 | Whois | admin@example.com | 社工攻击 |
| SSL 证书 | crt.sh / Shodan | *.example.com | 子域名发现 |
这张表就是后续主动信息收集和漏洞探测的作战地图。你想想看,如果连目标有哪些资产都没搞清楚,后面的渗透测试不就是瞎打吗?
我的工作流:拿到目标后,先跑 Whois 和 DNS 枚举,把主域名和子域名列出来。然后去 Shodan 搜这些域名对应的 IP,看看开放了哪些端口。最后用 Google Hacking 搜敏感文件。整个过程大概 30 分钟到 1 小时,但能覆盖 80% 的被动信息。剩下的 20% 靠经验和运气——比如在 GitHub 上搜到目标公司的代码泄露。
被动信息收集做到位了,你心里就有底了。下一阶段我们会进入主动信息收集,那时候就要真正和目标系统打交道了。但在此之前,先把被动信息吃透——这是整个渗透测试最安全、最隐蔽、也最容易被忽视的一步。