信息收集(上):被动信息收集

信息收集是整个渗透测试的基石。说白了,你连目标用的是什么技术栈、暴露了哪些资产都不知道,后面的攻击就全是瞎蒙。我个人习惯把信息收集分成两个阶段:被动和主动。这一章我们先聊被动信息收集——也就是不直接触碰目标系统,全靠公开渠道挖信息。

你想想看,一个合格的渗透测试,信息收集阶段至少要占到整个项目时间的 30% 到 40%。我见过太多新手上来就扫端口、跑漏洞,结果撞上 WAF 被 ban IP,连目标是什么框架都没搞清楚。嗯,这里要注意:被动信息收集做扎实了,后面的主动探测才能有的放矢。

核心原则:被动信息收集不产生任何直接流量到目标系统,完全基于第三方数据源和公开记录。合法、隐蔽、无痕。

被动信息收集全景图

先给你一张整体结构图,把这一章要讲的东西串起来。我每次做项目前,都会在脑子里过一遍这个流程。

被动信息收集核心框架 目标域名/IP Google Hacking Shodan 搜索 DNS 枚举 Whois 查询 site: 指令 filetype: 指令 intitle: 指令 端口/服务过滤 设备类型识别 漏洞关联查询 A/AAAA 记录 MX/NS 记录 子域名爆破 注册人信息 注册商/日期 DNS 服务器 💡 被动信息收集要点 不产生任何流量到目标系统 所有数据来自公开第三方源 合法合规,是渗透测试的起点

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 信息收集的重头戏。常用的方法有三种:

  1. 字典爆破:用常见子域名列表(如 www、mail、admin、dev、test)去解析 DNS。工具推荐 subfinder 或 dnsrecon。
  2. 搜索引擎抓取:用 Google 的 site:*.example.com 指令,或者用 crt.sh 查询 SSL 证书透明度日志。
  3. 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 上搜到目标公司的代码泄露。

被动信息收集做到位了,你心里就有底了。下一阶段我们会进入主动信息收集,那时候就要真正和目标系统打交道了。但在此之前,先把被动信息吃透——这是整个渗透测试最安全、最隐蔽、也最容易被忽视的一步。