1. 项目概述:从零开始构建你的“侦察兵”技能树
刚接触网络安全,尤其是Web渗透测试的朋友,常常会有一个误区:觉得那些炫酷的漏洞利用、一键拿shell才是真本事。但真正在这个行业里摸爬滚打多年的老手都明白,信息收集才是整个渗透测试流程的基石,甚至决定了你后续所有行动的成败。你可以把它想象成一场战役前的侦察工作,如果连敌人在哪、有多少兵力、有什么防御工事都搞不清楚,就贸然发起冲锋,结果可想而知。
这个教程要解决的,就是让你从零开始,系统地学会如何当一个合格的“侦察兵”。我们不会一上来就讲复杂的漏洞原理,而是聚焦于最基础、最核心的七个维度:域名、端口、服务、指纹、旁站、CDN和敏感信息。这七个点,几乎覆盖了一次标准信息收集流程的80%以上工作。掌握它们,你就能对一个目标网站或系统建立起一个立体的、多维度的认知画像。无论是参加CTF比赛、进行授权的渗透测试,还是仅仅为了提升自己的安全技能,这套方法论都是你必须跨过的第一道门槛。接下来,我会以一个虚拟目标example-target.com为例,带你一步步拆解每个环节的工具、命令、思路以及我踩过的那些坑。
2. 核心思路与侦察框架设计
在动手之前,我们必须先建立一个清晰的侦察框架。漫无目的地使用工具,只会得到一堆杂乱无章的数据,无法形成有效情报。我的核心思路是遵循“由外而内,由广至深”的原则。
由外而内,指的是先从互联网公开信息(OSINT)入手,再尝试与目标进行交互探测。比如,我们先通过搜索引擎、域名注册信息(Whois)了解目标背景,再通过DNS查询、端口扫描等技术手段进行主动探测。
由广至深,指的是先进行广度扫描,发现所有可能的入口点(如子域名、开放端口),再对每一个入口点进行深度分析(如服务版本、Web指纹、目录结构)。这个流程可以形象地理解为:先画地图,再标出所有建筑,最后进入每一栋建筑查看内部结构和有价值物品。
基于这个思路,我设计了一个标准化的侦察流程,你可以把它保存为检查清单(Checklist):
- 域名资产梳理:确定核心目标域名,并穷尽其相关的子域名、历史域名等。
- 网络空间测绘:针对发现的域名和IP,进行端口扫描,确定开放了哪些服务。
- 服务与应用识别:识别开放端口上运行的具体服务(如Apache, Nginx, MySQL)及其版本。
- Web应用指纹探测:针对Web服务,识别其使用的CMS(如WordPress, Joomla)、框架、前端组件等。
- 关联资产发现:寻找与目标在同一服务器(旁站)或同一IP段(C段)的其他资产。
- CDN与真实IP研判:判断目标是否使用了CDN,并尝试绕过CDN找到真实服务器IP。
- 敏感信息泄露挖掘:在GitHub、网盘、搜索引擎中搜索与目标相关的代码、文档、配置文件等。
这个流程并非完全线性,各环节发现的信息会相互补充和验证。例如,在子域名扫描中发现的某个域名,可能指向一个未使用CDN的IP,从而帮助我们找到真实IP。
3. 域名信息收集:绘制目标资产地图
域名是我们在互联网上定位目标最直接的标识。但一个企业或组织在互联网上的资产,绝不仅仅只有一个主域名。我们的首要任务就是绘制出一张尽可能完整的“资产地图”。
3.1 子域名枚举:发现隐藏的入口
子域名(如admin.example-target.com,dev.example-target.com)常常是开发、测试、管理后台的入口,安全防护可能较弱。枚举子域名主要有以下几种方法:
1. 字典爆破:这是最直接的方法,使用一个庞大的子域名字典,尝试拼接并解析。常用的工具有subfinder,amass,ksubdomain等。
# 使用 subfinder (被动收集+字典爆破) subfinder -d example-target.com -o subdomains.txt # 使用 ksubdomain (纯暴力爆破,速度极快) ksubdomain enum -d example-target.com -b -o subdomains_ks.txt注意:爆破会产生大量DNS查询请求,务必在授权测试范围内进行,并控制速率,避免对目标DNS服务器造成压力。
2. 证书透明度日志(CT Log):CA机构在签发SSL证书时,会将记录公开到CT Log。我们可以从中提取为目标域名签发的所有证书,从而发现子域名。crt.sh网站和amass工具都利用了这个来源。
# 使用 amass 收集证书信息 amass enum -passive -d example-target.com -o amass_passive.txt3. 搜索引擎语法:利用搜索引擎的site:语法,可以搜索被收录的子域名。
site:example-target.com此外,还可以使用-www来排除主站,有时能发现一些特别的结果。
4. 聚合平台与数据源:像SecurityTrails,VirusTotal,Shodan,Censys这样的平台聚合了海量扫描数据,是绝佳的被动信息源。amass和theHarvester这类工具会集成多个这样的数据源进行查询。
# 使用 theHarvester theHarvester -d example-target.com -b all -f output.html实操心得:不要依赖单一工具。我通常的做法是,先用amass或subfinder进行一轮被动收集(不直接与目标交互),再用ksubdomain进行一轮高性能字典爆破,最后将结果合并、去重。你会发现,不同工具的数据源有互补性。
3.2 域名历史与关联信息
域名本身也蕴含着信息。通过Whois查询,我们可以获取注册人、注册邮箱、联系电话、注册商和DNS服务器等信息。这些信息可能用于:
- 社会工程学:注册邮箱可能是员工邮箱格式(如
name@company.com),可用于猜测其他员工邮箱。 - 关联资产发现:同一个注册人/邮箱可能注册了其他相关域名。
- 攻击面扩大:历史DNS记录(A记录、MX记录等)可能指向一些已被遗忘但仍在运行的旧服务器。
可以使用在线Whois查询网站,或者命令行工具whois:
whois example-target.com此外,查看域名的DNS解析记录(A, AAAA, CNAME, MX, TXT等)也至关重要。TXT记录中有时会包含SPF配置、验证代码甚至内部服务器信息。
# 使用 dig 命令查询各种记录 dig example-target.com ANY dig example-target.com TXT4. 端口与服务探测:敲开每一扇门
拿到一批域名和对应的IP地址后,下一步就是探测这些IP地址上开放了哪些“门”(端口),以及门后提供什么“服务”。
4.1 端口扫描:Nmap的进阶用法
Nmap是端口扫描的瑞士军刀,但很多人只停留在nmap -sS -p-。这里分享几个更高效、更隐蔽的姿势。
1. 端口选择策略:全端口扫描(-p-)在大型网络中非常耗时。更聪明的做法是:
- 常用端口扫描:
nmap -sS -sV --top-ports 1000。这1000个端口覆盖了90%以上的常见服务。 - 结合服务版本的扫描:
-sV参数可以尝试识别服务版本,这对于后续漏洞利用至关重要。 - UDP端口扫描:不要忽略UDP,像DNS(53)、SNMP(161)等服务运行在UDP上。但UDP扫描慢且不可靠,应有选择地进行:
nmap -sU -p 53,161,123,137-139。
2. 扫描速度与隐蔽性:
-T<0-5>设置时序模板。-T3是默认,-T4更快但更易被察觉,-T2或-T1更慢更隐蔽。--max-rate和--min-rate直接控制发包速率。-sS(SYN半开扫描) 比-sT(全连接扫描) 更隐蔽。- 在高度敏感的环境下,可以考虑使用
-sN(NULL扫描)、-sF(FIN扫描) 等,但这些扫描方式对Windows主机无效,且结果解析复杂。
3. 输出与结果管理:使用-oA <basename>输出所有格式(正常、Grepable、XML),便于用其他工具(如grep, 或者导入到Metasploit、Nessus)进行后续处理。
nmap -sS -sV -oA nmap_initial example-target.com4.2 服务识别与Banner抓取
端口扫描确定了门牌号,-sV探测给出了服务名称。但有时我们需要更详细的信息,或者-sV没能识别出来。这时需要手动进行Banner抓取。
使用Netcat或Telnet直接连接端口,观察服务的欢迎信息:
nc -nv 192.168.1.100 22 # 可能输出:SSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u7 telnet 192.168.1.100 80 # 连接后输入:HEAD / HTTP/1.0 然后按两次回车 # 可能输出:Server: nginx/1.18.0对于Web服务(80/443),curl和httpie是更好的选择,可以查看完整的HTTP响应头,其中常包含服务器软件、框架、编程语言等信息。
curl -I http://example-target.com # 查看响应头 curl -s http://example-target.com | grep -i "powered by" # 在页面源码中查找特征注意事项:有些服务会修改或隐藏Banner信息(Banner Grabbing)以增加识别难度。这时就需要依靠更高级的指纹识别技术。
5. Web应用指纹识别:看清对手的真面目
确定了Web服务的存在,下一步就是识别它具体是什么应用。是WordPress博客?还是ThinkPHP开发的业务系统?或者是自定义的Java应用?不同的应用对应着不同的漏洞库和测试方法。
5.1 指纹识别工具与方法
1. 被动指纹识别:通过分析HTTP响应头、Cookie、HTML源码中的特征字符串来识别。工具如Wappalyzer(浏览器插件)、WhatWeb等。
# 使用 WhatWeb whatweb http://example-target.com -vWhatWeb会输出它检测到的所有组件,包括CMS、JavaScript库、Web服务器、编程语言等,非常全面。
2. 主动指纹识别:通过访问特定的文件或路径来判断。例如:
http://target/wp-login.php存在 → 可能是WordPress。http://target/admin/存在特定登录页面 → 可能是某种后台。http://target/console/存在 → 可能是JBoss或WebLogic。
我们可以使用字典来爆破这些常见路径,工具如dirsearch,gobuster,ffuf。
# 使用 dirsearch 扫描常见路径和文件 python3 dirsearch.py -u http://example-target.com -e php,html,js -w /path/to/common.txt3. 指纹库的维护与更新:指纹识别工具的核心是一个特征规则库。规则库的时效性非常重要。新的框架版本、旧框架的新特征都需要及时更新。关注工具的GitHub仓库,定期更新。对于自定义系统,可能需要手动分析,总结其特征,添加到自己的规则库中。
5.2 针对特定CMS的深度信息收集
如果识别出是常见的CMS(如WordPress, Joomla, Drupal),信息收集可以立刻进入“专项”模式。
以WordPress为例:
- 版本确定:查看页面源码的
<meta>标签,或访问/readme.html。版本号是寻找已知漏洞的关键。 - 用户枚举:访问
/wp-json/wp/v2/users或/author/1这类路径,可能泄露用户名。 - 插件/主题枚举:通过访问
/wp-content/plugins/和/wp-content/themes/目录,可以列出已安装的插件和主题。再用wpscan这类专用工具扫描已知漏洞。
wpscan --url http://example-target.com --enumerate vp,vt,u实操心得:指纹识别不是一次性的工作。在渗透测试的不同阶段,随着你对目标了解的深入,可能需要重新进行或修正指纹识别。例如,登录后台后看到的界面可能暴露更准确的后台框架信息。
6. 旁站、C段与CDN绕过:突破边界限制
主站防御严密?不妨看看它的“邻居”。
6.1 旁站与C段扫描
- 旁站:指同一台服务器(同一个IP)上部署的多个网站。如果主站
www.example.com和blog.example.com解析到同一个IP1.1.1.1,那么它们就是旁站。攻击旁站可能最终影响到主站(如通过服务器提权)。 - C段:指同一IP网段(例如
1.1.1.0/24)中的其他服务器。这些服务器可能属于同一公司不同部门,安全水平参差不齐,攻破一台就可能作为跳板进入内网。
如何发现?
- 通过子域名解析获取一批IP。
- 对这批IP进行反查(Reverse IP Lookup),看一个IP绑定了哪些域名。网站如
viewdns.info/reverseip/, 工具如amass的-addr参数。 - 对目标IP所在的C段进行扫描。例如,目标IP是
1.1.1.100, 那么扫描1.1.1.1-254。可以使用nmap:
先进行主机发现(nmap -sn 1.1.1.0/24-snPing扫描),再对存活主机进行端口扫描。
重要警告:C段扫描的侵略性非常强,极易触发目标网络的安全警报,并且可能扫描到与目标无关的其他公司或个人的服务器,构成法律风险。必须在获得明确书面授权,且授权范围包含相关网络段时才能进行!
6.2 CDN识别与真实IP溯源
内容分发网络(CDN)像一面盾牌,隐藏了服务器的真实IP。我们的目标就是尝试绕过这面盾牌。
1. 如何判断目标使用了CDN?
- 多地Ping:使用
ping.chinaz.com或www.itdog.cn等网站,从全球多地Ping目标域名。如果返回的IP地址各不相同,且属于CDN服务商(如Cloudflare, Akamai, 阿里云, 腾讯云)的IP段,则很可能使用了CDN。 - 检查DNS记录:大型CDN通常会使用CNAME记录将域名指向CDN的别名,例如
xxx.kunlun.com。 - 检查HTTP响应头:某些CDN会在响应头中添加特有字段,如
Server: cloudflare,CF-RAY等。
2. 寻找真实IP的常见方法(“绕过CDN”)
- 历史DNS记录查询:网站可能是在后期才接入CDN的。查询历史DNS记录(通过
SecurityTrails,viewdns.info等),可能会找到早期的A记录直接指向真实IP。 - 子域名大法:很多公司只给主站或核心业务用了CDN,而一些子域名(如
test.example.com,dev.example.com,intra.example.com)可能直接解析到真实IP。这也是为什么子域名枚举如此重要。 - 邮件服务器溯源:公司的邮件服务器(MX记录)有时和Web服务器在同一内网或同一台机器上。给目标公司邮箱发封邮件,查看邮件原文的邮件头,其中的
Received字段可能包含发件服务器的内部IP。 - SSL证书关联:如果目标使用了独享的SSL证书,可以通过证书的序列号、指纹(SHA1)在
Censys或Shodan上搜索,可能会找到使用相同证书的其他域名或IP,其中可能包含真实IP。 - 国外访问:有些CDN服务商对国内和国外线路的配置不同。主站可能针对国内用了CDN,但国外线路直接解析回源站。可以使用国外的在线代理或VPS进行访问测试。
- 利用网站功能:网站上的“忘记密码”、“邮件订阅”、“RSS订阅”等功能,在发送邮件或通知时,其系统可能会从源站直接发出,从而在邮件头中暴露真实IP。
踩坑记录:真实IP溯源是个体力活加运气活,没有一种方法保证100%成功。我经常是多种方法组合使用,并且需要持续关注。有时候,在测试的某个深夜,目标的某个子域名解析突然变了,可能就会暴露真实IP。养成记录和整理所有关联IP、域名的习惯,建立一个自己的情报库。
7. 敏感信息泄露挖掘:在互联网的“垃圾桶”里寻宝
开发人员、运维人员无意中上传到公开仓库、网盘、论坛的代码、配置文件、日志文件,是信息泄露的重灾区,常常能直接拿到数据库密码、API密钥、后台地址等“宝藏”。
7.1 搜索引擎黑客技巧
利用搜索引擎(如Google, Bing, Shodan, Fofa, ZoomEye)的高级语法进行精准搜索。
- 搜索特定文件类型:
site:example-target.com filetype:pdf site:example-target.com ext:doc | ext:docx | ext:ppt - 搜索目录列表:
site:example-target.com intitle:"index of" - 搜索配置文件、密码文件:
site:example-target.com inurl:"config" | inurl:"password" | inurl:"key" site:example-target.com "password" | "passwd" | "pwd" | "key" | "secret" - 搜索数据库连接信息:
site:example-target.com "jdbc:mysql" | "DB_PASSWORD" | ".env"
Shodan/Fofa/ZoomEye这类网络空间搜索引擎更强大,可以直接搜索特定标题、特定端口、特定服务版本、特定国家城市的资产。
# Shodan 搜索 Apache 2.4.49 (该版本有严重漏洞) apache 2.4.49 # Fofa 搜索标题包含“后台管理”的网站 title="后台管理"7.2 代码仓库与公开文档挖掘
GitHub/GitLab是最大的敏感信息泄露来源。搜索公司名、项目名、邮箱后缀,可能会发现:
- 源代码中硬编码的密码、API Key、Token。
- 内部系统的访问地址、架构图。
.git目录泄露,通过git-dumper等工具可以下载整个仓库历史,可能找到历史提交中的敏感信息。
网盘与文档分享站点:在百度网盘、Google Drive、SlideShare等平台搜索目标公司名称,有时能找到内部培训PPT、客户名单、通讯录等。
实操心得:这项工作需要极大的耐心和想象力。关键词需要不断变换组合(公司简称、全称、产品名、项目代号、员工姓名拼音等)。找到一份泄露的运维文档,其价值可能超过你扫描一个星期的漏洞。建议将这项工作常态化,而不仅仅是渗透测试开始时才做。
8. 信息整理与自动化:让侦察工作流程化
手工操作效率低下,且容易遗漏。我们需要将上述所有环节工具化、流程化。
8.1 工具链整合
你可以编写一个Shell脚本或Python脚本,将各个工具串联起来。一个简单的流程可能是:
- 输入主域名。
- 调用
subfinder/amass收集子域名。 - 调用
massdns/dig解析子域名到IP。 - 调用
nmap/masscan对IP进行快速端口扫描。 - 调用
httpx/naabu识别HTTP/HTTPS服务。 - 调用
whatweb/nuclei对Web服务进行指纹识别和基础漏洞扫描。 - 将结果(域名、IP、端口、服务、指纹)输出到一个结构化的报告中,如JSON或HTML。
市面上也有成熟的集成化工具,如recon-ng,SpiderFoot(更偏向OSINT),以及自动化程度更高的Sn1per,Arjun等框架。
8.2 情报管理与持续监控
一次性的信息收集是不够的。目标的资产、配置、代码都在变化。你需要建立一个持续监控的机制。
- 定期(如每周)重新运行你的侦察脚本,对比新旧结果,发现新增的子域名、新开放的端口、新上线的服务。
- 利用
GitHub Watch功能监控目标相关代码仓库的更新。 - 设置
Google Alerts或使用monitor之类的工具,监控互联网上是否出现新的与目标相关的敏感信息。
最终,所有收集到的信息应该被妥善整理,放入笔记(如Obsidian, Notion)或情报管理平台,并清晰地标注来源、时间、可信度。这份不断更新的“目标档案”,是你后续进行漏洞扫描、渗透攻击、横向移动的导航图。
信息收集是一门艺术,更是一项需要耐心、细心和创造力的工程。它没有太多炫技的成分,但扎实的信息收集能力,是区分脚本小子和专业渗透测试人员的第一道分水岭。希望这篇长文能帮你打好这个基础。记住,在虚拟世界里,情报就是一切。