从信息搜集到攻击面分析:漏洞赏金实战中的自动化侦察与弱点关联
1. 项目概述:从信息搜集到攻击面分析的实战闭环
在漏洞赏金的世界里,信息搜集从来都不是一个孤立的步骤,它更像是一场战役前的全面侦察。很多新手猎人拿到一个目标,比如一个主域名,往往一头雾水,不知道从哪里下手。他们可能会用几个常见的工具扫一遍,发现没有明显的漏洞,就草草放弃,认为目标“太硬”或者“已经被挖干净了”。这其实是一个巨大的误区。真正的差距,往往不在于你发现了什么,而在于你“看到”了什么。信息搜集的深度和广度,直接决定了你能看到的攻击面有多大。一个资深猎人和一个新手之间,对同一个目标的认知可能天差地别——新手看到的是一栋大楼,而资深猎人看到的,是这栋大楼的每一扇窗户、每一道通风管道、每一个废弃的后门,以及大楼旁边那间不起眼的管理员小屋。
我这次分享的案例,就是想用一个具体的、简单的目标,来演示如何将看似零散的信息点,通过逻辑串联和分析,构建成一个清晰的、可攻击的“面”。我们不会使用什么高深莫测的0day,也不会涉及复杂的绕过技巧,核心就是“直指根本”:找到那些因为配置疏忽、资产暴露、逻辑缺陷而留下的“软柿子”。这个过程,我称之为“攻击面分析”,它是信息搜集的最终目的,也是发起有效攻击的起点。无论你是刚入行的新手,还是想优化自己工作流的同行,希望这个从侦察到锁定目标的完整链条,能给你带来一些实实在在的启发。
2. 核心思路:从“资产发现”到“弱点关联”的思维模型
很多工具教程会教你用A工具找子域名,用B工具扫端口,用C工具识别技术栈。这没错,但如果你只停留在“收集列表”的层面,那这些信息就是一堆冰冷的、无意义的数据。我的核心思路是建立一个“资产发现 -> 属性枚举 -> 弱点关联 -> 攻击路径构建”的思维模型。
2.1 思维模型的四个阶段
第一阶段是资产发现。目标绝不止一个主域名。我们要利用各种公开源(证书透明度日志、DNS记录、搜索引擎、代码仓库等)和工具,尽可能全面地找出与目标相关的所有资产。这包括但不限于:子域名、IP地址、关联公司或品牌名、移动应用、API端点、云存储桶(如S3、Blob)、源代码仓库、员工在社交媒体上提到的内部系统代号等。这里的关键是“关联性”,任何与目标公司、品牌、产品线、员工相关的数字痕迹,都可能是一个入口点。
第二阶段是属性枚举。对于发现的每一个资产(比如一个子域名),我们需要给它贴上标签,丰富它的“画像”。这个资产运行的是什么服务?是Nginx 1.18还是Apache 2.4?后端是什么技术?是PHP 7.4, Python Django, 还是 Node.js?它是否使用了特定的框架或CMS,比如WordPress、Joomla、或者ThinkPHP?它开放了哪些端口?除了80/443,有没有暴露22(SSH)、21(FTP)、3306(MySQL)、6379(Redis)、9200(Elasticsearch)等管理或数据服务端口?它有没有配置错误的安全头(如缺少CSP、HSTS)?是否使用了含有已知漏洞的第三方组件(JavaScript库、jQuery版本、框架版本)?这个阶段的目标是把一个简单的域名,变成一个充满技术细节的“档案”。
第三阶段是弱点关联。这是从“信息”到“漏洞”的关键一跃。我们需要将枚举出的属性,与已知的弱点模式进行关联。这不是简单的漏洞扫描器报一个CVE编号,而是基于经验的逻辑推理。例如:
- 属性:发现一个
dev.api.target.com的子域名。 - 关联弱点:开发或测试环境。常见弱点包括:默认凭证、调试模式开启、暴露的API文档(如Swagger UI)、未授权访问、配置信息泄露(如
.env、config.php文件)。 - 属性:发现一个
legacy.target.com的子域名,技术栈识别为旧版IIS + ASP.NET。 - 关联弱点:遗留系统。常见弱点包括:未打补丁的已知漏洞(如特定版本的IIS解析漏洞)、已弃用且不安全的协议(如SSLv3)、弱加密算法、管理员疏于维护。
- 属性:在GitHub上找到目标公司员工上传的代码片段,其中包含一个硬编码的AWS密钥片段。
- 关联弱点:凭证泄露。可能直接导致云资源(如S3存储桶)被未授权访问,甚至服务器被接管。
第四阶段是攻击路径构建。单个弱点可能无法直接getshell或拿到核心数据,但多个弱点组合起来,就可能形成一条完整的攻击链。比如,通过信息泄露拿到一个内部员工邮箱,利用该邮箱进行密码重置攻击或钓鱼,获得初级权限,再结合内部系统的一个未授权访问漏洞,横向移动到更重要的服务器。我们的分析,就是要尝试描绘出这些潜在的路径。
2.2 为什么选择“简单案例”
你可能会问,为什么是“简单案例”?因为复杂的案例往往涉及特定的业务逻辑、复杂的交互流程和精巧的绕过,这些虽然技术含量高,但可复现性和普适性不强。而“简单案例”揭示的,是那些最普遍、最根本的安全问题:错误的配置、暴露的资产、疏忽的管理。这些问题在互联网上大量存在,是漏洞赏金中稳定产出的“基本盘”。掌握发现和分析这类问题的能力,是每个猎人的基本功,也是收入的重要保障。这个案例就是要打磨这项基本功。
3. 实战工具链与自动化策略
工欲善其事,必先利其器。完全手动操作效率太低,我们需要一套半自动化的工具链来支撑上述思维模型。我的策略是:以一两款核心工具为骨架,配合大量专项工具和自定义脚本,形成流水线。记住,没有“银弹”工具,最佳实践是组合拳。
3.1 核心侦察工具:Subfinder + Amass + Assetfinder
对于资产发现(子域名),我主要依赖这三者的组合,因为它们的数据源各有侧重。
- Subfinder: 纯被动收集的佼佼者。它通过查询数十个公开的API和数据源(如SecurityTrails, Censys, PassiveTotal等)来发现子域名,速度快,噪音相对较低,非常适合初步侦察。我通常用它来做第一轮广撒网。
subfinder -d target.com -silent -o subfinder.txt - Amass: 被动与主动结合的王者。它的被动收集模块非常强大,同时还能进行DNS暴力破解、爬取证书透明度日志(CT Logs)、甚至递归搜索。Amass的数据库模式能持续跟踪资产变化。我常用它进行深度枚举。
amass enum -passive -d target.com -o amass_passive.txt amass enum -active -d target.com -brute -w ~/wordlists/subdomains-top1million-5000.txt -o amass_active.txt - Assetfinder: 一个简单高效的Go工具,主要从AlienVault OTX, Wayback Machine, URLScan等源获取数据。它经常能发现一些其他工具遗漏的角落。
assetfinder --subs-only target.com > assetfinder.txt
注意:将这些结果合并、去重是必须的步骤。我习惯用
sort -u命令,并会仔细人工审查一些看起来奇怪的子域名(如mail.target.com.webcache.com这类可能由某些源误报的结果)。
3.2 服务与端口探测:Naabu + Nmap
发现子域名后,需要知道它们对应哪些IP,开放了哪些端口。
- Naabu: 用Go写的快速端口扫描器,速度比Nmap默认的SYN扫描更快,特别适合处理大量主机。我常用它进行全端口快速扫描,找出开放的端口。
naabu -list subdomains.txt -p - -exclude-ports 80,443 -o naabu_open_ports.txt - Nmap: 端口扫描的终极武器。在Naabu发现开放端口后,用Nmap进行服务版本探测和脚本扫描,获取更详细的信息。
nmap -sV -sC -p <开放端口列表> -iL target_ips.txt -oA nmap_service_scan-sC会运行默认的NSE脚本,经常能直接发现一些低悬果实,比如暴露的robots.txt、http-title信息泄露等。
3.3 Web资产分析与指纹识别:Httpx + Nuclei
这是将“资产”转化为“带属性的目标”的关键步骤。
- Httpx: 一个极快的HTTP探测工具。它可以对大量主机:端口进行HTTP/S请求,获取状态码、响应大小、标题、技术栈指纹(通过
-tech-detect)、证书信息等。我通常用它对所有发现的:80, :443, :8080等Web端口进行探测,并过滤出活着的Web服务。httpx -list subdomains_and_ips.txt -title -status-code -tech-detect -cdn -o httpx_live_hosts.txt-tech-detect选项会尝试识别技术栈(如PHP, WordPress, React),-cdn会尝试检测目标是否在CDN后面。 - Nuclei: 不仅仅是漏洞扫描器,更是基于模板的检测引擎。社区有数千个模板,覆盖从信息泄露、配置错误到各种CVE漏洞。我把它作为自动化弱点关联的主力。在获得活着的Web资产列表后,先用信息搜集类模板扫一遍。
nuclei -l httpx_live_hosts.txt -t ~/nuclei-templates/exposures/ -o nuclei_exposures.txt nuclei -l httpx_live_hosts.txt -t ~/nuclei-templates/misconfiguration/ -o nuclei_misconfig.txt
3.4 自动化流水线示例
我将以上工具串联成一个简单的Shell脚本,实现从域名输入到初步报告输出的半自动化流程:
#!/bin/bash TARGET=$1 echo "[*] 目标: $TARGET" echo "[*] 阶段1: 子域名枚举..." subfinder -d $TARGET -silent -o subfinder_$TARGET.txt & amass enum -passive -d $TARGET -o amass_passive_$TARGET.txt & assetfinder --subs-only $TARGET > assetfinder_$TARGET.txt & wait cat subfinder_$TARGET.txt amass_passive_$TARGET.txt assetfinder_$TARGET.txt | sort -u > all_subs_$TARGET.txt echo "[+] 发现子域名数: $(wc -l < all_subs_$TARGET.txt)" echo "[*] 阶段2: HTTP探测与指纹识别..." httpx -l all_subs_$TARGET.txt -title -status-code -tech-detect -cdn -o httpx_live_$TARGET.txt -silent echo "[+] 存活Web资产数: $(wc -l < httpx_live_$TARGET.txt)" echo "[*] 阶段3: 初步漏洞与信息泄露扫描..." nuclei -l httpx_live_$TARGET.txt -t ~/nuclei-templates/exposures/ -severity low,medium,high -o nuclei_initial_$TARGET.txt -silent echo "[*] 完成!报告已生成。" echo "存活资产列表: httpx_live_$TARGET.txt" echo "初始扫描结果: nuclei_initial_$TARGET.txt"这个脚本只是一个起点,你可以根据需要添加端口扫描、目录爆破、截图等环节。关键在于,自动化处理了繁琐的、重复性的收集工作,让我们能把宝贵的时间和精力集中在分析上。
4. 案例拆解:一个“简单”目标的分析全过程
假设我们的目标是examplecorp.com。这是一个虚构的公司,但我们假设它是一家中小型互联网公司,提供在线服务。下面我们一步步拆解。
4.1 广度侦察:发现隐藏的资产
运行我们的自动化脚本后,我们得到了一个存活Web资产列表。除了常见的www.examplecorp.com,mail.examplecorp.com,blog.examplecorp.com之外,我们还发现了几个有趣的条目:
dev.examplecorp.com- 状态码200,标题显示“ExampleCorp Dev Portal”。staging-api.examplecorp.com- 状态码200,返回JSON数据,提示“未提供API密钥”。legacy.examplecorp.com- 状态码200,技术栈识别为Microsoft-IIS/8.5。vpn.examplecorp.com- 状态码200,标题是“Secure Login”。s3-website-us-east-1.amazonaws.com上的一个奇怪域名,通过证书透明度日志关联到assets.examplecorp.com,但直接访问该S3 URL也能看到一些文件列表。
4.2 深度枚举:为资产贴上标签
接下来,我们对这些有趣的资产进行深度枚举。
对于
dev.examplecorp.com:nmap -sV -sC dev.examplecorp.com显示开放80和443端口。- 手动访问,发现是一个内部开发门户,有登录界面。查看页面源代码,发现注释里提到了
<!-- TODO: Remove default creds admin/admin123 before prod -->。这是一个硬编码凭证线索。 gobuster dir -u https://dev.examplecorp.com -w ~/wordlists/common.txt发现/backup目录,目录列表开启,里面有一个2023-12_db_backup.sql.gz文件。这是敏感文件泄露。- Nuclei扫描报告了
http://dev.examplecorp.com/.git/目录可访问(git-config模板命中)。这是版本控制信息泄露。
对于
staging-api.examplecorp.com:httpx的-tech-detect显示它是Node.js/Express。- 访问根路径返回
{"error": "API key required"}。尝试访问/docs或/swagger,发现https://staging-api.examplecorp.com/api-docs存在,并且是Swagger UI,详细列出了所有API端点、参数,甚至包含了测试功能。这是暴露的API文档,可能允许未授权的接口探测或测试。 - 尝试对常见的API路径进行模糊测试,如
/api/v1/users,/api/admin等。
对于
legacy.examplecorp.com:- Nmap脚本扫描 (
-sC) 显示服务器是Microsoft-IIS/8.5,并且http-server-header: Microsoft-IIS/8.5。 - 查询IIS 8.5的已知漏洞,发现其对应Windows Server 2012 R2,存在一些老的漏洞,但可能已修补。
- 更关键的是,使用
gobuster扫描发现/phpmyadmin目录,并且可以访问。这是一个未授权访问的管理界面。虽然可能需要密码,但已经是重大风险。 - 同时发现
/server-status可访问,泄露了服务器状态信息。
- Nmap脚本扫描 (
对于
vpn.examplecorp.com:- 访问后是一个定制化的登录页面。技术栈识别为某品牌VPN的Web门户。
- 检查登录表单,看是否存在用户名枚举漏洞(通过不同的错误信息)。尝试常见默认凭证。
- 搜索该品牌VPN近期的CVE。这是边界设备,一旦突破,意义重大。
对于暴露的S3存储桶:
- 直接访问
http://assets.examplecorp.com.s3-website-us-east-1.amazonaws.com可以看到文件列表。 - 使用
awscli或s3scanner工具,尝试列出桶内内容(如果配置了错误权限)。 aws s3 ls s3://assets.examplecorp.com/ --no-sign-request如果成功,则证明是可公开列表的存储桶。进一步尝试下载文件,看是否有写权限。
- 直接访问
4.3 弱点关联与攻击面绘制
现在,我们将枚举出的属性关联到具体的弱点,并尝试构建攻击面:
开发环境暴露 (
dev.examplecorp.com):- 弱点: 开发/测试环境通常安全控制较弱。
- 关联发现:
- 页面注释泄露默认凭证 (
admin/admin123) ->弱口令/默认口令。 - 开启目录列表的
/backup目录 ->敏感信息泄露(可能包含数据库凭证、业务数据)。 - 暴露的
.git目录 ->源代码泄露(通过git-dumper工具可还原完整代码,可能找到硬编码密钥、逻辑漏洞)。
- 页面注释泄露默认凭证 (
- 攻击面: 尝试使用默认凭证登录。如果成功,可能直接进入后台。下载备份文件,分析数据库转储,寻找更多凭证或业务逻辑信息。利用
.git泄露,审计源代码。
测试API文档暴露 (
staging-api.examplecorp.com):- 弱点: 测试环境API文档未做访问控制。
- 关联发现: 完整的Swagger UI ->过度信息泄露(API结构、参数)、潜在的未授权功能测试。
- 攻击面: 仔细阅读API文档,寻找不需要认证或认证逻辑有缺陷的端点。尝试调用这些端点,进行参数模糊测试(SQLi, XSS, 命令注入等)。例如,文档里可能有一个
/api/v1/user/{id}的GET请求,尝试遍历id,看是否存在用户信息泄露。
遗留系统与未授权访问 (
legacy.examplecorp.com):- 弱点: 旧系统疏于维护,可能存在未修复漏洞或错误配置。
- 关联发现:
phpMyAdmin未授权/弱口令访问 ->数据库完全控制。server-status页面暴露 ->服务器状态信息泄露。
- 攻击面: 对
phpMyAdmin进行暴力破解或尝试默认口令 (root/空)。一旦进入,可执行任意SQL语句,获取数据甚至通过SELECT INTO OUTFILE写webshell。server-status可能泄露内部请求和IP,辅助内网测绘。
边界设备 (
vpn.examplecorp.com):- 弱点: VPN是进入内网的关键通道,其漏洞价值极高。
- 关联发现: 特定品牌VPN ->已知漏洞攻击面。
- 攻击面: 搜索该VPN设备近1-2年的所有CVE和公开漏洞利用(如CVE-2023-46805, CVE-2024-21887等)。检查登录页面是否存在用户名枚举、OTP爆破等漏洞。这是高价值目标。
云存储桶配置错误 (
assets.examplecorp.comS3桶):- 弱点: 云资源权限配置错误是常见问题。
- 关联发现: S3桶可公开列表 ->存储对象泄露风险。
- 攻击面: 列出所有对象,检查是否有敏感文件(如配置文件
config.json,.env, 客户数据备份,源代码压缩包)。尝试上传文件,测试是否具有写权限(可能导致存储型XSS或恶意文件分发)。
通过以上分析,我们不再是面对一个孤立的examplecorp.com,而是看到了一个由多个脆弱节点组成的攻击面图谱。每个节点都有明确的弱点属性和潜在的利用路径。接下来,就是选择成功率最高、影响最大的节点,进行深入的漏洞验证和利用尝试。
5. 从信息到漏洞:关键验证技巧与深度挖掘
发现了潜在的弱点,如何将其转化为可报告(甚至可利用)的漏洞?这需要一些验证技巧和深度挖掘的耐心。
5.1 凭证相关漏洞的验证
- 默认/弱口令: 发现像
admin/admin123这样的线索,不要只在一个地方试。很多系统共用一套凭证。尝试在dev门户、legacy系统的phpMyAdmin、甚至VPN登录页使用这套凭证。使用工具如hydra或medusa进行定向爆破时,要合理设置线程和延迟,避免触发账户锁定。 - 密码重置与用户枚举: 对于登录页面,测试“忘记密码”功能。输入一个已知存在的邮箱(可能从Git提交记录或数据库备份中获得)和一个随机邮箱,观察响应差异(响应时间、错误信息)。如果存在差异,就可能存在用户枚举漏洞。进一步测试能否将重置链接发送到攻击者控制的邮箱。
5.2 信息泄露的深度利用
.git泄露: 使用git-dumper工具完整下载.git文件夹。然后使用git log查看提交历史,git diff查看代码变更。重点寻找:- 被注释掉但包含敏感信息的代码行。
- 硬编码的API密钥、数据库密码、加密密钥。
- 配置文件(如
config.php.dist,.env.example)中暴露的格式,可能和线上配置文件类似。 - 测试用的账号密码。
git-dumper https://dev.examplecorp.com/.git/ ./git_output cd ./git_output git log --oneline git show <commit_hash> # 查看某次提交的详情- 备份文件与目录列表: 下载发现的备份文件(如
.sql.gz,.zip,.tar)。解压后仔细分析。数据库转储文件是宝藏,搜索password,hash,secret,key,token等关键词。配置文件里找连接字符串。有时还能发现管理员会话、订单信息等业务数据。
5.3 API端点的测试方法
- 参数测试: 对于Swagger UI中发现的API,使用Burp Suite的Intruder或自定义脚本,对每个参数进行测试。
- SQL注入: 在数字型参数后加
',字符型参数尝试' OR '1'='1,观察响应差异或错误信息。 - 命令注入: 在可能调用系统命令的参数(如
file,cmd,host)中尝试; whoami,| id,$(id)。 - 路径遍历: 对于文件路径参数,尝试
../../../../etc/passwd。 - SSRF: 对于接收URL的参数,尝试
http://169.254.169.254/latest/meta-data/(AWS元数据服务)或http://localhost:8080/admin。
- SQL注入: 在数字型参数后加
- 未授权访问: 直接调用API端点,不添加任何认证头(如
Authorization: Bearer ...),看是否返回数据。有时API会对GET请求宽松,但对POST/PUT/DELETE严格,需要逐一测试。
5.4 云存储桶的权限验证
- 列出对象:
aws s3 ls s3://bucket-name/ --no-sign-request或使用浏览器直接访问S3端点。 - 下载对象:
aws s3 cp s3://bucket-name/path/to/file ./local-file --no-sign-request - 上传对象:
aws s3 cp ./test.txt s3://bucket-name/test.txt --no-sign-request。如果成功,证明有写权限,这是一个存储桶上传漏洞。可以尝试上传HTML文件触发XSS,或上传恶意脚本。 - 检查桶策略: 如果
aws s3api get-bucket-policy --bucket bucket-name可以执行(可能需要认证),可以分析策略配置错误。
6. 报告撰写与后续行动指南
发现漏洞只是成功了一半,清晰、专业地报告漏洞才能确保它被认可并得到修复,这也是猎人的核心价值体现。
6.1 漏洞报告的核心要素
一份好的漏洞报告应该让安全团队一目了然,快速复现。它必须包含:
- 标题: 简明扼要,如 “
dev.examplecorp.com存在.git目录泄露导致源代码泄露”。 - 漏洞类型: 如信息泄露、未授权访问、弱口令等。
- 风险等级: 根据CVSS标准或项目自定义标准评估(如Critical, High, Medium, Low)。评估时考虑可利用性和影响程度。
- 目标: 精确的URL或资产标识,如
https://dev.examplecorp.com/.git/。 - 详细描述:
- 发现过程: 简述如何发现的(如通过自动化扫描或手动测试)。
- 漏洞细节: 详细说明漏洞点。对于
.git泄露,说明访问该目录可以看到什么,以及如何利用git-dumper还原代码。 - 根本原因: 分析原因,如“生产环境错误地部署了包含
.git目录的源代码”。
- 复现步骤: 一步一步的指南,让安全团队能完全复现。
- 第一步:访问
https://dev.examplecorp.com/.git/。 - 第二步:使用
git-dumper工具下载仓库。 - 第三步:使用
git log查看提交历史,发现硬编码的数据库凭证在config.php文件的某次提交中。
- 第一步:访问
- 影响证明: 这是关键。不要只说“可能导致源代码泄露”。要展示实际泄露了什么。例如,附上截图显示
.git目录列表,附上git log的输出片段,并高亮显示泄露的敏感信息(如数据库密码db_password=Sup3rS3cr3t!)。如果可能,证明这些凭证是有效的(但绝对不要在未经授权的情况下连接生产数据库,可以连接一个自己搭建的测试环境来演示风险)。 - 修复建议: 提供具体、可操作的修复方案。例如:
- 在Web服务器配置中,禁止访问
.git目录(如Nginx的location ~ /\.git { deny all; })。 - 在构建和部署流程中,确保
.git目录被排除在发布包之外(如.gitignore或构建脚本中删除)。 - 对已泄露的凭证,立即进行轮换。
- 在Web服务器配置中,禁止访问
- 附加信息: 如HTTP请求/响应原始数据(可放在附件)、测试时使用的工具版本等。
6.2 后续行动:从单点到纵深
提交报告后,工作并未结束。
- 监控与跟进: 关注报告状态。如果一段时间未回复,可以礼貌地询问进展。如果被标记为“重复”或“不予受理”,仔细阅读原因,这是宝贵的学习机会。
- 关联挖掘: 在一个目标上发现的模式,可以应用到其他类似目标。例如,如果你发现这家公司习惯把
.git目录部署上线,那么检查它的其他子域名、甚至收购的其他品牌网站。 - 攻击链构建: 尝试将多个低危/中危漏洞串联。例如,利用
.git泄露获得的内部邮箱,在VPN登录页进行密码重置攻击。或者,利用测试API的未授权端点,结合某个参数注入,最终实现远程代码执行。这种“组合拳”往往能将漏洞等级提升到“高危”甚至“严重”。 - 知识沉淀: 将这次侦察过程中有效的子域名词表、特殊的指纹规则、成功的测试用例,更新到你的个人知识库和工具配置中。例如,将
dev,staging-api,legacy这类关键词加入你的子域名爆破字典。
漏洞赏金是一场信息不对称的游戏。你的优势在于,你比目标的防御者花了更多时间去观察、分析和连接那些被忽视的点。信息搜集与分析攻击面,就是构建这种优势的基础。它没有太多炫技的成分,更多的是耐心、细致和系统性的思考。从简单的配置错误入手,不断练习这种“发现-枚举-关联-验证”的肌肉记忆,你会发现自己能看到的东西越来越多,那些曾经看似坚固的目标,也会逐渐显现出它的裂缝。这条路没有捷径,但每一步都算数。
