1. 项目概述:从“蛮力”到“巧劲”的密码爆破思维跃迁
在安全测试和渗透测试的日常工作中,密码爆破(Password Brute-Forcing)是一个绕不开的基础环节。很多刚接触BurpSuite Intruder模块的朋友,可能还停留在使用“Sniper”模式,对着一个用户名或密码参数,挂上一个几万、几十万条的大字典,然后点击“Start attack”就听天由命的阶段。这种“单线程、无脑怼”的方式,在面对简单的弱口令时或许有效,但一旦遇到稍微复杂一点的场景——比如需要同时枚举用户名和密码、密码由多个动态部分组成、或者存在验证码和锁定机制——就显得力不从心,效率低下且容易被防御系统识别。
今天要聊的,就是如何把BurpSuite Intruder这个“大锤”用成“手术刀”,核心就在于掌握其高级攻击模式: Pitchfork(叉子) 和 Cluster bomb(集束炸弹) 。这两个模式的名字听起来就很形象,一个像精准的叉子同时刺向多个点,另一个则像炸弹覆盖式轰炸。它们解决的正是“Sniper”和“Battering ram”模式无法处理的多参数、多组合并发枚举问题。我见过太多测试人员,因为不熟悉这两种模式,在面对需要组合爆破的场景时,要么手动构造大量请求累死累活,要么干脆放弃这个攻击向量,错失良机。
掌握Pitchfork和Cluster bomb,本质上是从“单一变量爆破”思维升级到“多变量组合攻击”思维。这不仅能极大提升你在CTF比赛、授权渗透测试中的效率,更能让你在面对真实世界复杂的登录框、找回密码、API密钥验证等场景时,思路更加清晰,工具运用更加得心应手。接下来,我们就深入拆解这两种模式的原理、适用场景以及那些只有踩过坑才知道的实操细节。
2. 核心攻击模式原理深度解析
在深入实操之前,我们必须先彻底理解BurpSuite Intruder四种攻击模式的核心差异,这是高效运用的基础。很多混淆和错误都源于概念不清。
2.1 四种攻击模式横向对比
Intruder的四种模式可以看作应对不同“未知数”方程的解法:
-
Sniper(狙击手) :这是最基础的模式。它只有一个“有效载荷集合(Payload Set)”。你标记多个位置(Positions),但它每次攻击只使用载荷集中的一个载荷,依次替换 每一个 标记位置,其他位置保持不变。比如你标记了
username和password两个参数,载荷集是[admin, test, root]。那么攻击会依次生成:username=admin&password=固定值,username=test&password=固定值,username=root&password=固定值;然后是username=固定值&password=admin,username=固定值&password=test... 它适合 单个未知参数 的枚举,比如爆破用户名 或 密码,或者遍历ID参数。 -
Battering ram(攻城锤) :同样只有一个载荷集。但它会把载荷集中的 同一个 载荷,同时替换到 所有 标记的位置。还是上面的例子,攻击会生成:
username=admin&password=admin,username=test&password=test,username=root&password=root。这适用于用户名和密码可能相同的情况,或者多个参数需要设置为相同值的场景(比如多个Cookie字段)。 -
Pitchfork(叉子) :这是进阶的开始。它允许你为 每一个 标记的位置配置 独立的 载荷集(Payload Set)。攻击时,它会从每个载荷集的 同一行 (索引)取出一个值,组合成一个请求。假设你标记了两个位置,载荷集A是
[alice, bob, charlie],载荷集B是[123456, qwerty, password]。那么攻击会生成三个请求:username=alice&password=123456,username=bob&password=qwerty,username=charlie&password=password。 关键点在于:它要求各个载荷集的行数最好一致,因为它会取相同索引的值进行配对。 这适用于你知道用户名和密码可能存在一一对应关系的情况,比如从信息泄露得到的用户列表和默认密码、或者从其他渠道获取的成对凭证。 -
Cluster bomb(集束炸弹) :这是功能最强大的模式,也是本次的重点。它同样为每个标记位置配置独立的载荷集。但攻击时,它会进行 笛卡尔积 运算,即第一个载荷集的每一个值,都会与第二个载荷集的每一个值进行组合,以此类推。继续上面的例子,载荷集A
[alice, bob],载荷集B[123, 456]。Cluster bomb会生成:username=alice&password=123,username=alice&password=456,username=bob&password=123,username=bob&password=456。它用于 完全未知 的用户名和密码组合枚举,是最典型的“爆破”场景。
为了更直观地理解,我们可以看下面的对比表格:
| 攻击模式 | 载荷集数量 | 替换逻辑 | 生成请求数 | 典型应用场景 |
|---|---|---|---|---|
| Sniper | 1个 | 载荷依次替换每个位置 | 载荷数 × 位置数 | 枚举单个参数(用户名、ID、文件名) |
| Battering ram | 1个 | 同一载荷替换所有位置 | 载荷数 | 用户名密码相同、多参数同值 |
| Pitchfork | 每个位置1个 | 各载荷集同索引值配对 | 各载荷集最小长度 | 已知对应关系 的成对枚举(用户-默认密码) |
| Cluster bomb | 每个位置1个 | 各载荷集值完全交叉组合 | 各载荷集长度的乘积 | 完全未知 的多参数组合枚举(用户-密码爆破) |
注意 :选择模式的根本依据是 你对目标参数的了解程度 。如果你完全不知道用户名和密码的对应关系,Cluster bomb是唯一选择。如果你有一份用户名单和一份密码字典,但不确定谁对应谁,也应该用Cluster bomb。Pitchfork仅在你确信“列表A的第N行一定对应列表B的第N行”时才使用。
2.2 Pitchfork模式的应用精髓与陷阱
Pitchfork模式看似简单,但用错的情况非常多。它的核心思想是“对齐配对”。一个经典的
正确
使用场景是:你通过信息收集,拿到了公司员工的工号和初始密码(可能是生日、工号本身、或统一规则生成)。你有一个
users.txt
,里面是按部门排列的工号
[1001, 1002, 1003]
;同时你通过规则知道初始密码是
[P@ss1001, P@ss1002, P@ss1003]
。这两个列表是严格按顺序对应的。这时使用Pitchfork,就能精准地用
1001/P@ss1001
,
1002/P@ss1002
去尝试,而不会浪费时间尝试
1001/P@ss1002
这种错误组合。
最常见的陷阱 就是把它当“轻量级Cluster bomb”用。比如你有一个100个用户名的列表和一个1000个密码的字典,你误用Pitchfork,结果它只尝试了前100个密码(因为用户名列表只有100行),与每个用户名配对一次就结束了,完全遗漏了后面900个密码的可能性。这会导致严重的测试盲区。
实操心得 :在使用Pitchfork前,务必检查两个(或多个)载荷集是否 行数一致 且 顺序对应 。在BurpSuite的“Payloads”标签页,你可以清晰看到每个载荷集的内容和数量。如果不一致,BurpSuite会以最短的载荷集为准,长列表多余的部分会被忽略,这通常不是你想要的结果。
2.3 Cluster bomb模式的威力与成本控制
Cluster bomb是真正的“暴力”美学体现,但也是资源消耗的“怪兽”。它的请求总数是各载荷集大小的乘积。这意味着:
- 100用户名 × 1000密码 = 100,000 次请求
- 100用户名 × 10,000密码 = 1,000,000 次请求
如此巨大的请求量会带来几个问题:1. 测试时间极长;2. 对目标服务器造成巨大压力,可能触发WAF或IP封禁;3. 结果分析困难,海量数据容易淹没真正的成功响应。
因此,使用Cluster bomb的核心技巧不在于如何启动它,而在于 如何精细化地控制它的爆破范围和提升效率 。这需要结合前期的信息收集来“瘦身”你的载荷集:
- 用户名枚举 :先通过注册页面、忘记密码、OA系统等接口,用Sniper模式验证哪些用户名是存在的。只对存在的用户名进行密码爆破,这能直接减少一个数量级。
-
密码字典优化
:不要一上来就用“rockyou.txt”这种千万级别的字典。应该采用“阶梯式”爆破:先尝试
top100、top500的通用弱口令;再尝试与目标相关的密码(公司名、产品名、年份等组合);最后再考虑大型字典。 -
利用Pitchfork进行预处理
:如果怀疑存在“用户名+特定后缀”作为密码的规则(如
zhangsan2024),可以先用Pitchfork模式,载荷集1是用户名列表,载荷集2是使用“Custom iterator”或“Rule-based”生成的规则密码,进行快速验证。这比直接用Cluster bomb把所有用户名和所有规则密码组合一遍要高效得多。
3. 实战演练:构建一个高效的复杂密码爆破流程
理解了原理,我们通过一个模拟的实战场景,将Pitchfork和Cluster bomb融入一个完整的、高效的测试流程中。假设目标是一个员工登录门户,登录点为
/api/login
,请求体为JSON格式:
{"username":"admin","password":"123456"}
。
3.1 第一步:侦察与载荷集准备
盲目爆破是低效的。我们首先需要准备高质量的载荷集。
-
用户名收集 :
-
通过目标网站“忘记密码”功能,输入可能的姓氏或邮箱前缀,根据返回信息差异(“用户不存在” vs “验证码已发送”)枚举有效用户名。将结果保存为
valid_users.txt。 -
从LinkedIn、官网等渠道搜集员工姓名,生成可能的用户名格式:
zhang.san、zhangsan、zsan、zhangs、sanz等,保存为potential_users.txt。 -
技巧
:使用BurpSuite的
Intruder->Payloads->Payload Processing功能,可以给列表中的每个条目添加前缀后缀。例如,对zhangsan添加后缀@company.com,快速生成邮箱账号列表。
-
通过目标网站“忘记密码”功能,输入可能的姓氏或邮箱前缀,根据返回信息差异(“用户不存在” vs “验证码已发送”)枚举有效用户名。将结果保存为
-
密码字典打造 :
-
基础弱口令
:包含
admin、password、123456、[当前年份]、[公司名]、[公司名]123等。这是top_short.txt。 -
规则生成
:利用收集到的用户名。如果用户名为
zhangsan,可能的密码有:zhangsan、zhangsan123、zs123456、san.zhang等。这里可以借助外部工具如Crunch、CUPP或BurpSuite的Payload Processing中的Case modification和Add prefix/suffix来动态生成。这部分保存为rule_based_pass.txt。 -
大型字典
:作为最后的手段,如
rockyou.txt的精选子集。但优先使用前两者。
-
基础弱口令
:包含
3.2 第二步:使用Pitchfork进行“对口型”测试
在获得
valid_users.txt
(假设有50个有效用户)后,我们首先怀疑系统是否存在“初始密码”或“统一密码规则”。
- 场景 :我们了解到该公司的初始密码可能是“出生年月日”(8位数字)。
-
操作
:
-
将请求中的
username和password参数标记为攻击位置。 - 攻击模式选择 Pitchfork 。
-
在
Payload Sets中,设置Payload set 1(对应username)加载valid_users.txt。 -
设置
Payload set 2(对应password)。这里 不是 加载一个静态字典,而是使用 “Runtime file” 功能?不,对于Pitchfork的配对场景,更常见的做法是使用 “Custom iterator” 或通过 “Payload Processing” 来根据用户名动态生成密码。-
更优解
:如果密码规则简单(如
用户名+‘!’),可以在Payload set 2加载valid_users.txt,然后通过Payload Processing添加后缀!。这样就能实现user1/user1!,user2/user2!的精准配对。 -
对于复杂规则
:比如密码是“姓名拼音首字母+工号”。你需要先准备好一个与
valid_users.txt顺序完全一致的、包含对应工号的user_id.txt文件。然后在Payload set 2加载这个工号文件,再利用Payload Processing添加前缀(如姓名首字母,这需要你事先处理好)。 这要求两个列表严格对齐 。
-
更优解
:如果密码规则简单(如
-
将请求中的
- 启动攻击 :这次攻击只会发起50个请求(用户数),高效验证了“一一对应”的密码假设。
3.3 第三步:使用Cluster bomb进行全覆盖爆破
当Pitchfork模式未能命中,或者我们想测试更广泛的密码组合时,就需要祭出Cluster bomb。
-
配置攻击 :
-
标记
username和password参数。 - 攻击模式选择 Cluster bomb 。
-
Payload set 1加载我们精心准备的valid_users.txt(50个用户)。 -
Payload set 2加载我们打造的top_short.txt(500个密码)或rule_based_pass.txt。
-
标记
-
关键优化设置(Intruder选项卡) :
-
Resource Pool
:设置为
Maximum并发线程,但建议根据目标服务器情况调整,避免压垮服务。 -
Request Engine
:
Throttle(节流)功能至关重要。可以设置“固定间隔”(如每次请求间隔200毫秒)或“随机延迟”,以规避基于请求速率的防御。 - Attack Results :勾选“Store requests/responses”以便后续分析,但注意这会消耗大量磁盘空间,对于超大攻击可以只存储差异部分。
-
Resource Pool
:设置为
-
启动与监控 :点击“Start attack”。这时,攻击会生成 50 × 500 = 25,000 个请求。在攻击结果窗口,我们需要快速识别成功请求。
3.4 第四步:结果筛选与智能识别
面对成千上万条结果,如何快速找到那条“成功”的响应是关键。
-
基础筛选 :
-
状态码
:登录成功通常返回
200 OK,而失败可能是401 Unauthorized或200但响应体不同。可以按状态码排序,重点关注非401的请求。 - 响应长度 :这是最有效的过滤器之一。成功登录的响应页面通常与失败页面长度差异巨大(可能包含跳转、Session信息等)。在攻击结果表中,点击“Length”列排序,寻找长度与众不同的行。
-
状态码
:登录成功通常返回
-
高级技巧 - Grep Match :
- 在攻击配置的“Options”选项卡中,找到“Grep - Match”。
-
添加一些登录成功时页面会出现的唯一性关键词。例如:“登录成功”、“Welcome”、“退出登录”、“
Set-Cookie中有新的JSESSIONID”。也可以添加失败关键词如“用户名或密码错误”来反向过滤。 - 攻击完成后,结果表会多出几列,显示是否匹配这些关键词,一目了然。
-
使用Burp Suite Comparer进行差异对比 :
- 对于可疑的响应(长度接近但略有不同),可以选中两个响应,右键选择“Send to Comparer (Words)”。
- Comparer会高亮显示两个响应文本的差异,帮助你快速定位成功响应中多出来的“欢迎信息”或不同的跳转链接。
实操心得 :在真正的测试中,我强烈建议 分阶段、小规模 使用Cluster bomb。先用
valid_users.txt和top_100_pass.txt(100个用户*100密码=1万请求)进行快速试探。如果没有结果,再分析原因:是密码字典不对?还是存在账户锁定机制?或者是验证码?盲目扩大字典规模往往是最后的选择。
4. 高级技巧与疑难问题排查
掌握了基本流程,一些高级技巧和“坑”能让你事半功倍。
4.1 载荷处理(Payload Processing)的魔法
这是Intruder的灵魂功能之一,能让静态字典“活”起来。
-
常见操作
:
-
添加前缀/后缀
:为所有密码尝试添加
!、@123、2024等常见后缀。 - 大小写变换 :对字典中的每个单词进行首字母大写、全部大写、全部小写等变换。这对于密码是“CompanyName”这类情况很有效。
-
哈希处理
:如果目标系统前端对密码进行了MD5或SHA1加密,你可以直接让BurpSuite在发送前对载荷进行哈希。在
Payload Processing中添加“Hash”规则,选择算法。这样你的字典文件里存的是明文密码,Burp在发包时会自动将其转换为哈希值。
-
添加前缀/后缀
:为所有密码尝试添加
-
实战案例
:假设你怀疑密码规则是“公司缩写+出生年份”。你有一个
years.txt包含[1990,1991,...2005]。你可以设置Payload set为years.txt,然后添加处理规则:添加前缀ABC(公司缩写)。这样就动态生成了ABC1990,ABC1991等一系列密码,无需手动编辑字典。
4.2 应对反爆破机制
现代Web应用很少有毫无防护的登录接口。你必须能识别并绕过这些机制。
-
验证码(CAPTCHA) :
- 识别类型 :简单的数学计算、扭曲文字、滑动拼图等。
-
绕过思路
:
- 复用Session与Token :如果验证码在同一个会话中只验证一次,可以先用浏览器正常登录一次,获取有效的Session Cookie和可能的CSRF Token,然后在Intruder攻击中设置这些值为固定值,并保持单线程、低速率,可能可以绕过。
- 验证码识别接口缺陷 :观察验证码是否在响应中直接返回(如Base64图片),或者验证逻辑是否在前端。有时存在“验证码可重复使用”、“验证码与答案一并返回”的低级漏洞。
- 第三方打码平台 :对于复杂验证码,理论上可以集成打码API,但BurpSuite原生不支持,需要编写扩展(Extender),这属于更高阶的用法,且需注意法律和授权边界。 在授权测试中,通常遇到强验证码意味着此路不通,应转向其他攻击面。
-
账户锁定 :
- 现象 :连续错误尝试几次后,返回“账户已锁定”或需要等待一段时间。
-
应对策略
:
- 降低并发与速率 :在Intruder的“Resource Pool”中减少线程数,在“Request Engine”中增加请求间隔(如3秒一次)。
- 使用Pitchfork或Battering ram模式 :锁定机制通常是针对“用户名”的。使用Cluster bomb对一个用户尝试多个密码会快速触发锁定。而使用Pitchfork(一一对应)或Battering ram(所有参数同值)模式,本质上是“一次尝试一个用户的一个密码”,更不容易触发针对单一用户的连续失败计数。
-
代理池与IP轮换
:如果锁定是基于IP的,则需要配置BurpSuite使用上游代理池(如通过
Project options->Connections->Upstream Proxy Servers),但这通常需要外部资源支持。
4.3 性能优化与大规模攻击管理
当进行超大规模(百万级)组合爆破时,BurpSuite社区版或默认设置可能会遇到问题。
-
内存与磁盘
:BurpSuite会缓存所有请求和响应。对于百万级攻击,这可能导致内存溢出(OOM)或磁盘空间耗尽。
- 解决方案 :在Intruder的“Options”选项卡中,取消勾选“Store requests/responses”或仅存储“Summary and errors”。更根本的方法是 优化载荷集,减少不必要的组合 。
-
网络错误与重试
:长时间运行可能遇到网络波动。
- 解决方案 :在“Options” -> “Request Handling”中,可以配置重试次数和暂停条件。
-
保存与恢复攻击
:一个大型攻击可能运行数小时甚至数天。
-
技巧
:你可以随时暂停(Pause)攻击,BurpSuite会保存当前进度。你也可以将整个攻击配置(包括位置、载荷、选项)保存为
(.burp)文件,方便下次直接加载恢复。
-
技巧
:你可以随时暂停(Pause)攻击,BurpSuite会保存当前进度。你也可以将整个攻击配置(包括位置、载荷、选项)保存为
4.4 常见问题排查速查表
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| 攻击速度极慢 | 线程数设置过低;网络延迟高;目标服务器响应慢。 | 检查Resource Pool设置;在Proxy中检查请求响应时间;尝试单线程测试目标响应速度。 |
| 大量请求返回相同错误(如403/500) | 触发了WAF/IPS防御;请求格式错误;缺少必要Header或Token。 |
检查单个正常请求与攻击请求的原始数据差异;添加或修正缺失的Header(如
User-Agent
,
X-Forwarded-For
);检查是否需携带动态的CSRF Token。
|
| Cluster bomb模式请求数远少于预期 | 载荷集配置错误;某个载荷集为空或加载失败。 | 检查每个Payload set是否成功加载了字典文件,确认行数。请求数应为各集行数的乘积。 |
| 无法识别成功响应 | 成功与失败的响应长度、状态码非常接近。 |
使用“Grep - Extract”功能提取响应中特定字段(如返回的JSON中的
”success”:true
)进行比对;用Comparer进行详细差异对比。
|
| BurpSuite卡死或无响应 | 并发线程过高;内存不足;攻击结果数据量过大。 | 降低并发数;在“Options”中限制存储的数据;分批次进行小型攻击。 |
| Pitchfork模式结果错乱 | 多个载荷集的行数或顺序不对齐。 | 确保为每个位置配置的载荷集文件,其行数一致且顺序有明确的对应关系。用文本编辑器打开检查。 |
掌握Pitchfork和Cluster bomb,并配合精细化的载荷准备、流程控制和结果分析,你的密码爆破能力将从“碰运气”提升到“有策略的工程化测试”。这不仅是工具使用的熟练,更是测试思维严谨性的体现。记住,最有效的攻击永远是建立在最充分的信息收集之上。在点击“Start attack”之前,多花时间思考目标的可能逻辑和防御措施,往往能让你用最小的代价,最快地打开那扇门。

7423

被折叠的 条评论
为什么被折叠?



