渗透测试情报收集:从被动侦察到主动探测的实战策略

📅 2026/7/4 16:47:31 👁️ 阅读次数 📝 编程学习
渗透测试情报收集:从被动侦察到主动探测的实战策略

1. 情报收集:渗透测试的“钓鱼执法”前奏

在网络安全这个没有硝烟的战场上,渗透测试员与攻击者之间的较量,往往在真正的“交火”之前就已经开始了。这个阶段,我们称之为“情报收集”。很多人,尤其是刚入行的朋友,容易把它简单理解为“用工具扫一下端口和目录”,这其实是一个巨大的误区。情报收集,更像是现实世界中的“钓鱼执法”行动前,警方所做的大量、细致、隐蔽的摸排工作。你不会在毫无准备的情况下,直接冲进一个可能藏匿着危险目标的建筑,而是会先观察周边环境、记录人员进出规律、分析建筑结构、甚至伪装成不同身份去接触相关人员。渗透测试中的情报收集,其核心逻辑与此高度一致:在不惊动目标、不触发任何防御机制的前提下,尽可能全面、深入地描绘出目标的“数字画像”,为后续的精准打击找到最薄弱的入口。

我见过太多因为情报收集不充分而导致的“翻车”案例。比如,有人兴冲冲地对着一个目标一顿漏洞扫描,结果触发了对方的Web应用防火墙(WAF),IP直接被拉黑,后续所有测试计划泡汤;也有人费尽心思找到一个看似可利用的旧版系统,结果那只是对方故意留下的“蜜罐”,自己反被溯源。这些问题的根源,都在于把情报收集当成了一个“自动化脚本执行”的步骤,而忽略了其背后“人”的思考和“策略”的运用。本期,我将结合自己多年在SRC(安全应急响应中心)漏洞挖掘和渗透测试中的实战经验,为你拆解情报收集的完整流程、核心工具背后的原理,以及那些教科书上不会写的“踩坑”心得。我们的目标不是成为工具的奴隶,而是成为驾驭情报的猎人。

2. 情报收集的整体策略与分层模型

2.1 从“被动”到“主动”:情报收集的两大维度

一个成熟的情报收集过程,必须兼顾“被动”和“主动”两个维度,它们的关系如同侦察兵使用的望远镜和夜视仪,各有用途,缺一不可。

被动信息收集,顾名思义,就是在不直接与目标系统交互的情况下获取信息。这就像通过公开的卫星地图、房产登记信息、社交媒体动态来了解一个建筑。它的最大优势是隐蔽性极高,几乎不会留下任何由你发起的访问记录。被动收集的核心来源包括:

  • 搜索引擎:不仅仅是Google、Bing。熟练运用搜索引擎语法(如site:inurl:filetype:)是基本功。例如,site:target.com filetype:pdf可能找到泄露的员工手册、技术方案;site:target.com -www可能发现那些不常被主站引用的测试、备份子域名。
  • 公开数据库和档案:如WHOIS查询(了解域名注册人、邮箱、电话)、DNS历史记录查询(查看域名解析变迁,可能发现被遗忘的旧IP或子域名)、SSL/TLS证书透明度日志(证书在签发时会被公开记录,从中可以挖掘大量子域名)。
  • 第三方聚合平台:如Shodan、Censys、Fofa、ZoomEye等网络空间测绘引擎。它们持续扫描全网,你可以查询目标IP开放了哪些非常规端口,或者全网有哪些设备使用了目标的特定技术框架(如title:“Apache Tomcat/8.5”)。这是发现暴露在公网的数据库、监控系统、开发接口的利器。
  • 代码仓库与历史泄露:在GitHub、GitLab、码云等平台搜索目标公司的名称、邮箱后缀,常常能意外发现员工不小心上传的含有API密钥、数据库连接字符串、内部账号密码的源代码片段。此外,利用psbdmp.ws等平台可以查询某个邮箱是否在历史数据泄露事件中暴露过密码。

注意:被动收集的信息可能存在滞后或不准确,但它为你勾勒了目标的初始轮廓,并提供了大量用于主动探测的“线索”,如潜在的子域名列表、IP段、员工邮箱格式等。

主动信息收集,则是需要向目标系统发送探测请求,根据其响应来分析信息。这就像派遣侦察兵靠近建筑,用手电查看门锁型号,轻推窗户测试是否关严。主动收集会留下访问日志,因此需要讲究技巧和节奏

  • 域名与子域名枚举:这是主动探测的起点。除了使用subfinderamassOneForAll等工具进行字典爆破和搜索引擎聚合,更要利用前面被动收集到的信息。例如,从SSL证书中提取的域名、从JS文件中发现的API接口地址,都可能是宝贵的子域名线索。
  • 端口扫描与服务识别:使用NmapMasscan进行端口扫描。这里的关键不是“扫全端口”,而是“智能扫描”。先快速扫描常见端口(-F),再对开放端口进行深度服务版本探测(-sV)。对于Web服务(80, 443, 8080等),要立即跟进目录扫描、指纹识别。
  • Web应用指纹识别:使用Wappalyzer(浏览器插件)、WhatWebEHole等工具,快速识别网站使用的技术栈,如CMS(WordPress, Joomla)、前端框架(React, Vue)、服务器(Nginx, Apache)、中间件(Tomcat, WebLogic)及具体版本。识别出特定版本后,才能关联已知的公开漏洞。
  • 目录与文件发现:使用dirsearchgobusterffuf等工具,基于字典对网站目录和文件进行爆破。字典的质量至关重要。一个优秀的测试者会维护自己的字典,融合通用字典、针对特定CMS的字典(如针对WordPress的wp-content/plugins/)、以及从当前目标JS文件中爬取到的路径关键词。

两者的关系先被动,后主动,循环往复。被动收集为主动探测提供目标和方向,避免盲目扫描;主动探测发现的新信息(如一个新子域名),又可以作为新一轮被动收集的起点。这个循环迭代的过程,就是目标画像不断清晰的过程。

2.2 OPSEC:贯穿始终的操作安全考量

OPSEC(Operations Security, 行动安全)是情报收集,乃至整个渗透测试的生命线。在“钓鱼执法”的比喻中,OPSEC就是侦察员的伪装、行动纪律和撤离计划。

  1. 流量来源伪装:永远不要从你自己的家庭或公司IP发起主动探测。使用可靠的VPS服务器作为跳板。对于高敏感目标,可以考虑使用多个不同地域、不同运营商的VPS进行轮换。一些云服务商提供按量计费的弹性IP,用后即弃,是不错的选择。
  2. 工具特征隐藏:默认配置的扫描工具特征明显。Nmap的默认TCP SYN扫描、dirsearch的默认User-Agent,都会被成熟的WAF或IDS轻易识别并封锁。必须进行定制:
    • 降低速率:在Nmap、ffuf等工具中设置延迟(--delay-p),模拟正常用户访问节奏。
    • 随机化User-Agent:使用工具池或随机生成合法的浏览器UA。
    • 使用代理池:对于大规模扫描,可以考虑使用一些免费的HTTP代理或 socks 代理(需注意其稳定性和安全性),将流量分散。
  3. 日志与时间管理:在VPS上操作时,注意清除命令历史(history -c并清空~/.bash_history)。扫描任务尽量安排在目标业务低峰期(例如当地时间的深夜),这样即使产生一些异常日志,也更容易被当作背景噪音忽略。
  4. 法律与授权红线:这是最重要的OPSEC。仅在获得明确书面授权的范围内对目标进行测试。清晰地界定测试边界(哪些IP、域名可以测,哪些绝对不能碰)。任何对非授权目标的探测,无论意图如何,都可能构成违法行为。

3. 核心工具链实操与深度解析

工欲善其事,必先利其器。但比工具本身更重要的是,理解它们的工作原理和最佳使用场景。下面我以几个核心场景为例,进行深度拆解。

3.1 子域名挖掘:从广撒网到精准狙击

子域名枚举是扩大攻击面的关键。一个admin.target.comvpn.target.com的价值可能远超主站。

实战流程:

  1. 被动收集(聚合)

    # 使用subfinder进行多源聚合(需配置API密钥,如VirusTotal, SecurityTrails等) subfinder -d target.com -silent -o passive_subs.txt # 使用amass进行深度枚举(内置多种数据源和智能爬取) amass enum -passive -d target.com -o amass_passive.txt

    合并去重后,你得到第一份子域名列表。这份列表通常质量较高,来自证书、搜索引擎等公开记录。

  2. 字典爆破(主动): 被动收集总有遗漏,特别是那些未公开引用的内部、测试、临时系统。这时需要字典爆破。

    # 使用gobuster进行DNS子域名爆破 gobuster dns -d target.com -w /path/to/subdomains_wordlist.txt -t 50 -o gobuster.txt

    字典的选择是成败关键。不要只用一个通用字典。我的做法是:

    • 基础字典:使用commonspeak2subdomains-top1million-5000.txt等。
    • 针对性字典:从已发现的子域名中提取关键词(如devstgapiinternal, 城市缩写, 部门名等),生成自定义字典。
    • 组合字典:将目标公司名(company)、产品名(product)与基础词汇(admintestvpn)进行组合。
  3. 递归发现与验证: 将上面发现的所有子域名作为新的目标,重复进行被动收集和字典爆破(即amass enum -brute -d found_sub1.com),这可能会发现更深层次的域名。最后,对所有发现的域名进行DNS解析验证(dnsx)和HTTP/HTTPS服务存活探测(httpx),过滤出真正可访问的Web资产。

    # 使用httpx进行存活探测和基础信息获取(标题、状态码、指纹) cat all_subs.txt | httpx -title -status-code -tech-detect -o live_subs.txt

实操心得

  • 速率控制:大规模爆破时,务必限制线程数和请求频率,避免对目标DNS服务器造成压力或触发监控。
  • 关注“泛解析”:如果发现*.target.com解析到同一个IP,说明存在DNS泛解析。此时字典爆破会产生大量“假阳性”结果(任何随机前缀都解析)。你需要通过HTTP响应内容、标题、大小等进行二次筛选,找出那些有独特内容的真实子站。
  • 记录来源:为每个发现的子域名标记其来源(如“证书透明日志”、“搜索引擎”、“字典爆破”),这有助于评估信息的可靠性和新鲜度。

3.2 端口扫描与服务测绘:理解协议背后的故事

端口是通向服务的门。扫描不是为了罗列数字,而是理解每扇门后住着谁。

Nmap的进阶用法:

# 第一阶段:快速发现(TCP SYN扫描, 前1000个常见端口) nmap -sS --min-rate 1000 -p- --open -oA nmap_quick target_ip # 第二阶段:服务深度识别(对开放端口进行版本探测和脚本扫描) nmap -sV -sC -p <开放端口列表> -oA nmap_detail target_ip
  • -sS:TCP SYN半开放扫描,速度快且相对隐蔽。
  • --min-rate 1000:设置最小发包速率,加速扫描(根据网络情况调整)。
  • -p-:扫描所有65535个端口。在时间允许的情况下进行,但通常先扫常见端口。
  • -sV:探测服务版本。
  • -sC:使用默认的Nmap脚本引擎进行更深入的探测,可能会识别出具体的应用漏洞(如Redis未授权访问)。

解读扫描结果:

  • 22/tcp open ssh OpenSSH 7.4:如果版本较老(如OpenSSH < 7.7),可能存在用户名枚举等漏洞。
  • 3306/tcp open mysql:MySQL数据库暴露在公网?尝试弱口令爆破(必须在授权范围内!),或检查是否允许匿名登录。
  • 8080/tcp open http Apache Tomcat/Coyote JSP engine 8.5.19:一个特定版本的Tomcat。立即去搜索该版本是否存在已知的RCE漏洞(如CVE-2017-12615)。同时尝试访问/manager/html进行Tomcat管理后台登录。
  • 6379/tcp open redis Redis key-value store:Redis未授权访问漏洞的经典端口。尝试使用redis-cli -h target_ip直接连接,如果成功且无需认证,则可能直接获取服务器权限。

网络空间测绘引擎的妙用: 假设Nmap发现目标开放了8080端口,是Jenkins。你可以直接在Shodan中搜索:port:8080 http.title:“Jenkins” org:“Target Company Name”。这可能会发现目标公司其他网段同样暴露的Jenkins服务,甚至是因为配置错误而暴露的内网地址。Fofa的语法类似:title=“Jenkins” && org=“公司名”

3.3 Web资产指纹与目录结构探测

确认Web服务存活后,下一步是快速识别其技术构成和探索隐藏内容。

指纹识别:

  • 浏览器插件:Wappalyzer、BuiltWith能提供最快速的初步判断。
  • 命令行工具WhatWebEHole能进行批量识别,并输出结构化结果,便于后续自动化处理。
    whatweb https://target.com --color=never # 输出可能包含: WordPress, PHP, MySQL, Nginx, JQuery等
    识别出WordPress后,你的测试策略就要立刻调整:开始查找wp-admin登录页面, 使用wpscan扫描插件/主题漏洞, 查找xmlrpc.php文件是否存在爆破可能。

目录/文件爆破:

# 使用ffuf, 功能强大且速度快 ffuf -w /path/to/wordlist.txt -u https://target.com/FUZZ -mc 200, 403, 401 -t 50
  • -mc:指定匹配的状态码。200(成功)固然重要,但403(禁止访问)和401(需要认证)同样有价值,它们告诉你这个路径是存在的,只是被保护了,这本身就是一个敏感路径的线索。
  • 字典策略:和子域名枚举一样,使用复合字典。针对PHP站点,加入php相关的字典(如phpinfo.phpadmin.php);针对备份文件,加入bakoldtar.gz等后缀字典。
  • 递归扫描:对于发现的重要目录(如/admin//backup/),可以将其作为新的根目录进行递归爆破,以发现更深层的文件。

JS文件分析——被忽视的金矿: 现代Web应用大量使用JavaScript。前端JS文件中常常硬编码了后端API接口地址、内部域名、甚至有时会不小心泄露API密钥、加密密钥、调试信息。

  • 爬取JS文件:使用gospiderhakrawler等工具爬取站点,提取所有JS文件链接。
  • 静态分析:使用grepawk或专门工具(如LinkFinderJSFinder)分析JS文件内容,搜索关键词如:
    • apiendpointurlpath
    • keysecrettokenpassword
    • internaldevstaginglocalhost
    • 域名格式(/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/) 从JS文件中发现的https://internal-api.target.com/v1/users这样的接口,其价值可能远超你爆破出来的任何目录。

4. 情报的整合、分析与攻击面绘制

收集到海量数据后,如何将它们变成可执行的“作战地图”?这一步是区分普通脚本小子和专业测试者的分水岭。

4.1 数据整理与关联分析

你需要将不同来源的信息进行关联。我通常使用一个简单的Markdown文档或Notion数据库来记录,但更专业的方法是使用类似Maltego这样的可视化工具,或者自己用Python脚本处理。

构建目标资产树

  1. 核心节点:主域名target.com
  2. 一级分支:IP地址(从A记录、历史解析记录中获得)。
  3. 二级分支:子域名(挂在对应的IP或CDN服务下)。
  4. 叶子节点:每个子域名/IP下的开放端口、服务版本、Web指纹、发现的敏感目录/文件、从JS中提取的API端点。
  5. 附加属性:为每个节点标记“风险等级”(根据暴露的服务、版本新旧、是否存在已知漏洞初步判断)、“测试状态”(未测试/已测试/有漏洞)、“备注”(如phpMyAdmin外网可访问, 需测弱口令)。

通过这种树状结构,你可以清晰地看到:

  • 资产分布:哪些业务部署在同一个IP上?是否存在“一损俱损”的风险?
  • 薄弱环节:哪个子域名的服务版本最老?哪个IP上开了最多的管理端口(如22, 3389, 5900)?
  • 关联路径:从dev.target.com发现的内部API域名api.internal, 虽然无法从外网直接访问,但可能在后续的内网横向移动中成为关键跳板。

4.2 攻击面评估与测试优先级排序

不是所有发现的目标都值得投入同等精力。你需要基于情报进行优先级排序。

高风险优先项(立即跟进)

  1. 暴露的管理后台/wp-admin//admin//manager/htmlphpMyAdminJenkins控制台等。尝试默认口令、弱口令爆破(授权下)、检查是否存在未授权访问。
  2. 老旧且有公开漏洞的服务:如Struts2特定版本、老旧WebLogic、已知漏洞的FastJSON组件等。验证漏洞是否存在,并准备利用。
  3. 敏感文件泄露/.git/目录(可能导致源码泄露)、/.env文件(可能含数据库密码)、/WEB-INF/web.xml(Java Web应用配置)、/backup/目录下的数据库备份文件。
  4. 参数化功能点:发现/api/user?id=/export?file=/preview?url=这类带有参数的接口,它们通常是SSRF(服务器端请求伪造)、文件包含、SQL注入等漏洞的高发区。

中低风险项(后续测试或监控)

  1. 版本较新暂无公开漏洞的常见服务。
  2. 静态宣传页面。
  3. 需要复杂交互才能触发的功能点。

绘制攻击面地图: 你可以用思维导图工具(如XMind)直观地绘制出来。中心是目标,第一层是主要业务线(官网、商城、APP后台),第二层是支撑这些业务的子域名/IP,第三层是具体的服务、端口和已识别的风险点。用红色高亮高风险项,黄色标出中风险项。这张图就是你后续渗透测试的“导航图”。

5. 常见陷阱、排查技巧与防御视角

5.1 实战中踩过的“坑”与应对

  1. “扫挂了”目标服务:使用dirsearchffuf时线程数过高,字典中存在大量../之类的路径,可能导致负载较低的服务器直接拒绝服务或响应缓慢。

    • 排查:测试时先从小字典、低线程开始,观察服务器响应时间和错误日志(如果能有条件查看)。使用-rate参数限制速率。
    • 技巧:针对大型目标,可以将目标列表分割,在多台VPS上同时进行低强度扫描。
  2. 被WAF/IPS完美拦截:所有主动探测请求都返回相同的错误页面或状态码(如403, 503),工具特征被识别。

    • 排查:手动用浏览器访问一个不存在的路径(如/random-12345.html),如果返回的页面和工具探测到的“404”页面一模一样,但与你正常访问的404页面不同,很可能请求在到达应用前就被WAF拦截了。
    • 技巧
      • 更换工具和指纹:使用nmap--script-args http.useragent修改UA,使用ffuf-H参数自定义Header,模拟真实浏览器。
      • 使用编码和混淆:对扫描路径进行URL编码、双URL编码、甚至Unicode编码,有时可以绕过简单的规则匹配。
      • 利用边缘节点:如果目标使用了CDN(如Cloudflare),尝试寻找其真实的源站IP(通过历史DNS记录、SSL证书关联IP、邮件服务器IP等方式),直接对源站进行测试可能绕过CDN的WAF。
  3. 信息过载与无效数据:工具跑完后,面对成千上万的子域名、端口、URL,不知从何下手。

    • 技巧自动化过滤和分类。写简单的脚本或用awkgrep命令处理结果。例如,从httpx的输出中,快速过滤出状态码为200且标题中包含“登录”、“admin”、“dashboard”的URL;从nmap输出中提取所有版本号包含特定年份(如2018)的服务。聚焦于“异常”和“敏感”信号。
  4. 忽略“非标准”端口:只盯着80, 443, 8080, 忽略了其他端口上运行的Web服务。

    • 技巧:在端口扫描阶段,对所有开放端口(不仅仅是80, 443)进行HTTP/HTTPS协议探测。使用nmap -sV --script=http-title -p <portlist>,或者用httpx直接对ip:port格式的列表进行探测。

5.2 从防御者视角反思:如何做好自己的资产梳理

作为一个经常扮演“攻击者”的测试者,从防御视角思考能让你对情报收集有更深的理解。企业该如何应对?

  1. 定期进行“自我测绘”:使用相同的工具(Shodan, Censys, Amass)从外网视角扫描自己的公网IP和域名,看看攻击者能发现什么。这比任何内部资产清单都更真实。
  2. 收敛攻击面
    • 非必要不暴露:数据库、中间件管理后台、监控系统等,严禁直接暴露在公网。必须通过VPN或零信任网络网关访问。
    • 最小化信息泄露:关闭不必要的服务器标识(如Server: Apache/2.4.1)、框架调试信息。自定义错误页面,避免泄露路径或堆栈信息。
    • 清理“僵尸资产”:及时下线不再使用的测试域名、废弃的云主机。这些是最容易被遗忘的突破口。
  3. 监控与告警
    • DNS监控:监控非预期的子域名解析记录创建(防范子域名劫持或员工误操作)。
    • 证书透明日志监控:监控是否有未经授权为你域名签发的SSL证书。
    • GitHub等代码平台监控:设置告警,当出现公司相关代码、密钥等信息时及时通知安全团队。
  4. 强化外围防御
    • 部署WAF:并合理配置规则,不仅能防御攻击,也能识别和拦截恶意的扫描探测。
    • 网络层限制:对管理端口(SSH, RDP等)实施IP白名单访问控制。

情报收集是一场信息博弈的序幕。它枯燥、繁琐,需要极大的耐心和细心,但它的质量直接决定了后续渗透测试的效率和成功率。一个优秀的渗透测试员,必然是一个出色的“情报分析师”。他不仅会使用工具,更懂得在工具的噪音中辨别信号,在海量的数据中连接线索,最终从目标的数字阴影中,勾勒出一条清晰的攻击路径。记住,你的目标不是制造最多的请求,而是获取最有价值的信息。在接下来的系列中,我们将带着这份精心绘制的地图,进入漏洞挖掘的实战环节。