渗透测试之信息收集:从零到一的实战资产测绘指南
1. 信息收集:渗透测试的基石
第一次接触渗透测试时,我总想着直接上工具找漏洞,结果碰了一鼻子灰。后来才明白,信息收集就像打仗前的侦察工作,没摸清敌情就冲锋纯粹是送人头。记得有次对某企业做授权测试,花了两周时间做信息收集,最后只用一天就通过一个不起眼的子站拿下了整个内网。
信息收集的核心目标是绘制完整的数字资产地图。这就像拼图游戏,我们收集的每一块信息都是拼图的一角。当拼图完成度达到80%以上,攻击路径就会自然浮现。实际操作中,我会把收集到的信息分为三类:
- 基础设施类:IP段、域名、服务器信息、网络拓扑
- 应用系统类:Web应用、移动端、API接口、后台管理系统
- 人员组织类:员工邮箱、社交账号、技术栈偏好
2. 被动信息收集:无接触侦察
2.1 网络空间搜索引擎实战
FOFA、Shodan、ZoomEye这类工具就像互联网的CT扫描仪。我常用的FOFA搜索语法组合:
# 搜索指定域名的所有资产 domain="example.com" # 查找使用ThinkPHP的站点 app="ThinkPHP" # 定位特定IP段的MySQL服务 ip="192.168.1.0/24" && port="3306"最近一次项目中,通过title="内部管理系统" && region="Beijing"这个搜索组合,直接找到了客户未公开的测试环境,里面还有全套的测试账号。
2.2 证书透明度日志挖掘
crt.sh这个宝藏网站很多人不会用。通过查询SSL证书,我发现某金融公司竟然有30多个未在DNS记录的子域名。具体操作:
import requests def query_cert(domain): url = f"https://crt.sh/?q=%.{domain}&output=json" res = requests.get(url).json() return {item['name_value'] for item in res} print(query_cert("bank.com")) # 返回所有关联子域2.3 GitHub敏感信息挖掘
开发者经常不小心上传配置文件,我用这个组合拳屡试不爽:
# 搜索数据库配置 site:github.com "spring.datasource.password" AND "example.com" # 找API密钥 filename:.env "AWS_ACCESS_KEY_ID" # 查内部文档 extension:pdf "内部使用" AND "机密"曾发现某厂商工程师把生产环境Redis密码写在issue里,直接导致整个用户数据库泄露。
3. 主动信息收集:精准扫描策略
3.1 子域名爆破的科学方法
纯字典爆破早就过时了,我现在用混合策略:
- 先用证书透明度日志获取已知子域
- 用AI生成基于企业名的候选列表(如hr、oa、crm等前缀)
- 最后用SecLists的字典查漏补缺
python3 subfinder.py -d example.com -o subs.txt assetfinder --subs-only example.com | tee -a subs.txt3.2 智能端口扫描方案
Nmap的黄金组合参数:
nmap -sS -Pn -n -T4 --min-rate 1000 \ --max-retries 1 --open -p- \ --script discovery,vuln -oA full_scan 192.168.1.1对于云环境,我会特别关注:
- 2878:Kubernetes API
- 2379:ETCD
- 9092:Kafka
- 9200:Elasticsearch
3.3 Web指纹识别的进阶技巧
传统指纹识别经常误判,我的解决方案是多重验证:
- 首先用Wappalyzer插件快速筛查
- 然后检查HTTP头中的X-Powered-By
- 最后分析特定路径的静态资源特征
比如识别Vue.js应用:
// 检查是否存在/vue-router/路由 // 查看/js/app.[hash].js文件结构 // 检测__webpack_require__特征4. 资产关联分析:绘制攻击地图
4.1 构建资产关系图谱
用Maltego可以可视化资产关系,但命令行党更喜欢这个:
import networkx as nx G = nx.Graph() G.add_node("主站", type="web") G.add_node("子站A", type="web") G.add_edge("主站", "子站A", relation="同IP")4.2 风险暴露面评估模型
我给每个资产打分会考虑:
- 暴露程度(0-10分)
- 漏洞严重性(CVSS评分)
- 数据敏感性(1-5级)
- 攻击路径复杂度
风险值 = (暴露分 × 0.3) + (CVSS × 0.4) + (敏感级 × 0.2) - (复杂度 × 0.1)4.3 自动化工具链搭建
我的自动化流程长这样:
graph LR A[子域名收集] --> B[端口扫描] B --> C[服务识别] C --> D[漏洞扫描] D --> E[报告生成]实际用的是这个Shell脚本:
#!/bin/bash domain=$1 # 信息收集阶段 subfinder -d $domain -o subs.txt httpx -l subs.txt -o urls.txt nmap -iL ips.txt -oA scans # 分析阶段 python3 analyzer.py urls.txt scans.xml5. 特殊场景应对策略
5.1 云环境下的资产测绘
云厂商的API经常暴露惊喜:
# AWS资产枚举 aws ec2 describe-instances --query 'Reservations[*].Instances[*].PublicIpAddress' # Azure资源扫描 az resource list --query '[].{Name:name, Type:type, Location:location}'5.2 移动端资产发现
不要忽视移动端:
- 反编译APK找API域名
- 抓包分析网络请求
- 检查Firebase配置
// 典型的API端点泄露 public static final String API_HOST = "https://dev-api.example.com";5.3 隐藏接口挖掘技巧
通过JS文件找隐藏接口:
fetch('/admin/api/v1/users').then(...) // 发现未授权接口用Chrome开发者工具的"Search in files"功能,搜索关键词:
- api
- admin
- internal
- debug
6. 防御视角的思考
做了这么多年渗透,我总结出企业资产管理的三大痛点:
- 影子资产:离职员工创建的未回收资源
- 僵尸系统:下线不彻底的遗留系统
- 配置漂移:测试环境意外暴露
建议企业建立资产DNA库:
- 定期自动化测绘
- 人工复核关键系统
- 建立变更审批流程
最后提醒新手:信息收集不是目的而是手段。我曾见过有人收集了200G数据却找不到突破口,关键是要带着攻击思维去分析数据,找出那条隐藏的攻击路径。记住,最好的漏洞往往藏在最不起眼的角落里。