Burp Suite captcha-killer插件实战:自动化破解带验证码登录接口
1. 项目概述当验证码遇上自动化在Web安全测试尤其是渗透测试的授权范围内一个经典的场景就是登录接口的暴力破解。但现代应用为了安全几乎无一例外地加上了验证码这道防线。传统的Intruder模块在这里就卡壳了因为它无法处理每次请求都需要变化的验证码参数。这就是我们今天要深入探讨的captcha-killer插件存在的意义。它不是一个独立的验证码识别工具而是一座桥梁将Burp Suite强大的自动化攻击引擎Intruder与后端灵活的验证码识别服务可以是任何OCR接口、打码平台或自定义脚本连接起来实现了对带验证码防护接口的自动化测试。captcha-killer 0.1.2版本是一个在安全圈内流传甚广的插件它解决了测试人员手动刷新、识别、填入验证码的痛点将“爆破”流程重新变得自动化。简单来说它的工作流是Burp Suite拦截到登录请求 - captcha-killer插件自动向配置好的识别接口发送验证码图片请求 - 获取识别结果 - 将结果自动填充回原始请求的对应参数中 - 最后由Intruder完成密码字典的遍历。整个过程测试者只需要配置好一次后续的“识别-替换-重放”全部由工具链自动完成。这篇文章我将以一个拥有多年实战经验的测试者角度为你拆解captcha-killer 0.1.2从环境搭建、插件配置、到实战爆破的全流程。我会重点分享那些官方文档里不会写的细节、配置过程中容易踩的坑以及如何根据不同的验证码类型调整策略。无论你是刚开始接触Web安全测试的新手还是想优化自己自动化流程的老手这篇“保姆级”解析都能给你带来可直接复现的参考价值。2. 核心工具链搭建与环境准备工欲善其事必先利其器。使用captcha-killer你需要搭建一个由三部分组成的工具链Burp Suite主体、captcha-killer插件本身以及一个后端验证码识别服务。每一环的稳定都至关重要。2.1 Burp Suite与captcha-killer插件安装首先确保你有一个可用的Burp Suite Professional版本或社区版。captcha-killer是一个Java编写的插件以Jar包形式分发。你需要从可靠的来源如GitHub仓库下载captcha-killer-0.1.2.jar文件。在Burp Suite中安装路径是Extender-Extensions-Add- 在Extension type下拉菜单中选择Java- 然后浏览并选中你下载的Jar包文件。注意Burp Suite的版本兼容性是需要留意的第一个坑。较新版本的Burp Suite如2024.x可能对旧版Java插件存在兼容性问题。如果加载失败可以尝试在Burp的启动参数中调整Java兼容性设置或者寻找社区维护的修改版如captcha-killer-modified。我个人的经验是对于这类核心工具链插件在测试环境或虚拟机中固定一个稳定的Burp Suite版本例如2022.3或2023.9是一个省心的选择。加载成功后你会在Burp的标签页中看到一个新的Captcha Killer选项卡。点开它界面相对简洁主要包含验证码请求的显示区、识别结果区以及关键的配置面板。2.2 验证码识别后端服务部署这是整个流程的技术核心也是灵活性最大的部分。captcha-killer插件本身不识别验证码它只负责将验证码图片通过HTTP请求获取转发给你配置的识别接口并接收返回的文本结果。因此你需要自建或使用一个识别服务。方案一使用本地Python脚本ddddocr方案这是目前最流行且免费的开源方案基于深度学习库ddddocr。你需要一个Python环境建议3.7-3.9避开3.10可能存在的兼容性问题。准备识别脚本你需要一个能启动HTTP服务的Python脚本。网络上常见的captcha-killer-modified项目会提供一个api.py脚本。其核心逻辑是接收一个POST请求请求体中包含验证码图片的Base64编码数据然后调用ddddocr库进行识别并将结果以JSON格式返回如{code: 200, message: xxxx}。安装依赖在命令行执行pip install ddddocr aiohttp。ddddocr是识别核心aiohttp用于构建异步HTTP服务器提升并发处理能力。运行服务在脚本目录下执行python api.py。脚本通常会监听本地的8888端口。此时你的识别服务接口地址就是http://127.0.0.1:8888。实操心得这个脚本默认可能只针对4位数字字母验证码优化。如果你的目标验证码是6位、包含中文或复杂干扰线你需要修改脚本中的识别逻辑。例如在ddddocr初始化时传入参数show_adFalse可以关闭广告检测这是一个常见误区它其实是用于检测特定类型广告的并非广告更重要的是调整classification或detect方法的参数。这部分需要一定的Python和OCR知识也是从“能用”到“好用”的关键。方案二使用商业打码平台API对于难以用开源库识别的复杂验证码如滑块、点选、空间推理等可以接入打码平台。这些平台提供HTTP API你只需要按照其文档要求构造一个发送图片和接收识别结果的请求模板即可。优点是识别率高、种类全缺点是会产生费用。在captcha-killer中你需要根据平台的API文档精心构造Request template。方案三自定义识别接口如果你有更特定的需求比如识别内部系统自定义的验证码可以用任何你熟悉的语言Python、Java、Go等编写一个识别服务只要保证其HTTP接口的输入输出格式能被captcha-killer适配即可。这提供了最大的灵活性。2.3 环境连通性测试部署好识别服务后首要任务是测试整个链路的连通性。打开Burp Suite的浏览器代理访问一个带有验证码的测试页面例如DVWA、Pikachu靶场。拦截浏览器获取验证码图片的HTTP请求通常是一个GET请求到类似/captcha.php的地址。将这个请求包Raw格式整个请求发送到captcha-killer插件在Burp的Proxy - Intercept或History中找到该请求右键 -Send to Captcha Killer。此时请求内容会出现在插件的请求框中。获取验证码点击插件界面的获取按钮。如果配置正确右侧的图片预览区域应该能显示出验证码图片。如果这里失败通常是请求包本身有问题如需要特定Cookie或Header或者网络不通。你需要检查原始请求是否完整特别是Host、Cookie等头部信息。配置识别接口在识别接口URL中填入你的后端服务地址如http://127.0.0.1:8888。配置请求模板这是最关键的一步。点击请求模板你需要根据后端服务要求的格式重写发送给识别接口的请求。例如对于上述的ddddocr脚本它期望一个JSON body里面包含图片的Base64数据。你需要在模板中用占位符IMG_RAW/IMG_RAW或IMG_B64/IMG_B64来代表从原始验证码请求中提取的图片数据。一个典型的模板如下POST / HTTP/1.1 Host: 127.0.0.1:8888 Content-Type: application/json {image: IMG_B64/IMG_B64}配置响应解析在结果提取部分你需要告诉插件如何从识别接口的返回包中提取出验证码文本。如果接口返回{code: 200, message: 5g7y}那么你可以使用正则表达式或JSON路径来提取。例如使用正则表达式message:\s*(\w)。配置好后点击识别按钮下方的结果框应该就能显示出识别出的验证码文本了。走到这一步意味着你的captcha-killer插件已经能够独立完成“获取图片-发送识别-解析结果”的单个循环。这是后续自动化爆破的基础。3. 插件核心配置与爆破流程详解当验证码识别链路打通后我们就可以将其融入到Burp Suite Intruder的自动化攻击流程中。这个过程需要精细的配置一步错可能导致整个攻击失败。3.1 爆破场景分析与参数定位我们以最常见的“用户名固定密码字典爆破且每次请求需携带新验证码”的场景为例。假设登录请求如下POST /login.php HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded usernameadminpassword§123456§vcode§abcd§这里password和vcode是变量。vcode的值需要每次请求前动态获取并识别。首先你需要确定验证码的获取请求。通常是一个独立的GET请求比如GET /captcha.php?r0.123456789。关键点在于这个获取验证码的请求往往与登录请求共享会话状态通过Cookie中的Session ID关联。这意味着在爆破过程中每次发起登录尝试前都必须先使用同一个会话去获取一个新的验证码然后用这个新验证码去组合登录请求。3.2 Intruder与captcha-killer的联动配置这是整个教程最核心的部分我将分步骤拆解步骤1发送登录请求到Intruder在Burp Suite中拦截或从历史记录中找到目标登录请求右键 -Send to Intruder。步骤2设置攻击类型与攻击点在Intruder的Positions标签页攻击类型选择Pitchfork草叉模式这是必须的。因为我们需要同步遍历两个不同的Payload集合密码字典Payload set 1和验证码Payload set 2。Pitchfork模式会将两个集合的项一一对应组合。清除默认标记点击Clear §。标记变量在请求体中将password的值标记为Payload 1如password§123456§将vcode的值标记为Payload 2如vcode§abcd§。注意username如果不是变量就不要标记。步骤3配置Payload集合切换到Payloads标签页Payload set 1这是你的密码字典。选择Simple list然后加载你的密码文本文件。Payload set 2这是动态验证码的来源。这里必须选择Extension-generated。在下拉菜单中选择captcha-killer。这意味着Intruder在发起每一次请求时都会向captcha-killer插件请求一个新的验证码值来填充vcode参数。步骤4激活并配置captcha-killer插件回到Captcha Killer标签页确保界面上的是否使用复选框被勾选。这表示插件已处于待命状态准备响应Intruder的验证码生成请求。现在需要进行流程绑定在插件界面找到验证码数据包区域。将之前我们测试成功的那个“获取验证码图片的HTTP请求”GET /captcha.php的原始数据完整地粘贴或通过Send to Captcha Killer加载进来。确保识别接口URL和请求模板配置正确并且点击识别能正常返回结果。至关重要的一步Cookie同步。在插件界面通常有一个Cookie from request的按钮或选项。点击它它会自动从你加载的“验证码数据包”中提取Cookie。你必须确保这个Cookie与后续Intruder发起登录请求时使用的Cookie是一致的。因为服务器需要通过Cookie来关联“发出的验证码”和“验证的验证码”。一种稳妥的做法是在Intruder的Resource Pool设置中将线程(Number of threads)设置为1并勾选Use the same cookie for all requests在Intruder的Options标签页-Request Headers部分可以添加或确保Cookie头存在。这样可以避免因并发导致的会话混乱。步骤5设置资源池与线程在Intruder的Resource Pool标签页创建一个新的资源池并将Number of threads设置为1。这是另一个关键点。因为如果使用多线程并发线程A获取的验证码可能会被线程B的登录请求使用而服务器端会话中存储的验证码是线程A的这会导致验证码不匹配而失败。单线程虽然慢但保证了请求的串行和会话一致性。3.3 启动攻击与结果分析所有配置完成后回到Intruder的Start attack按钮点击开始。你会看到攻击窗口弹出Intruder开始工作。观察攻击过程对于每一次攻击尝试Intruder会先“悄无声息”地触发captcha-killer插件的工作流程插件使用配置的Cookie去请求一个新的验证码图片发送到识别接口得到文本结果。然后Intruder将这个识别结果作为Payload set 2与你密码字典中的当前项Payload set 1组合构造出完整的登录请求并发送。在攻击结果表格中你会看到Payload1是密码Payload2是动态生成的验证码。你需要根据HTTP状态码、响应长度、返回内容等信息来判断哪些请求可能成功了例如状态码302重定向到登录后首页或返回了“登录成功”的JSON标志。Burp Intruder的过滤器Filter功能可以帮助你快速定位这些异常响应。4. 实战进阶疑难排查与优化策略按照上述流程操作理论上可以完成爆破。但实战环境千变万化下面是我总结的常见问题与进阶技巧。4.1 常见失败原因与排查清单问题现象可能原因排查步骤插件点击获取无图片1. 验证码请求包不完整缺少必要Header如Cookie、Referer。2. 目标服务器验证码接口有额外校验如时间戳、Token。3. 网络不通或目标服务不可用。1. 在Burp Repeater中重放原始验证码请求确认能正常返回图片。2. 对比Repeater中成功的请求与发送到插件的请求确保完全一致。3. 检查插件中加载的请求包Raw格式是否完整特别是前几行的请求行和头部。点击识别无结果或报错1. 识别接口URL错误或服务未启动。2. 请求模板格式错误不符合识别接口要求。3. 结果提取正则表达式/JSON路径配置错误。4. 验证码类型太复杂识别率低。1. 用浏览器或Postman直接测试识别接口确认其正常工作。2. 在插件中使用手动请求功能如果有测试模板查看原始请求和响应。3. 检查响应提取规则确保能匹配到返回数据中的正确字段。对于JSON使用$.message这类JSONPath通常更可靠。4. 尝试更换识别引擎如用打码平台或优化本地识别脚本参数。Intruder攻击全部返回验证码错误1.会话不同步这是最常见的原因。Intruder请求的Cookie与插件获取验证码的Cookie不一致。2.验证码一次性使用服务器在验证一次后立即使当前验证码失效而Intruder可能因重试等原因重复使用。3.验证码参数名不匹配登录请求中的验证码参数名如vcode,captcha与服务器预期不符。1.确保Cookie同步在插件和Intruder的请求头中强制使用相同的Cookie字符串。可以在Intruder的Options-Request Headers中添加Cookie: sessionidxxx。2.严格单线程确保资源池线程数为1。3. 在Repeater中手动模拟“获取验证码-立即登录”流程确认参数名和流程无误。识别率低下导致爆破效率差1. 验证码有强干扰扭曲、粘连、背景噪声。2. 开源识别库如ddddocr未针对该类型优化。3. 图片预处理不足。1. 考虑使用付费打码平台它们针对复杂验证码的识别模型更强大。2. 修改本地识别脚本加入图片预处理步骤如二值化、去噪、灰度处理、字符分割等。这需要一定的图像处理知识。3. 在captcha-killer的请求模板中可以尝试先对Base64图片数据进行解码、处理、再编码然后发送。但这通常需要在中间加一层代理处理服务。4.2 性能优化与稳定性提升技巧识别服务优化如果你的本地ddddocr脚本处理速度慢可以考虑将其部署在性能更好的机器上或者使用异步框架如aiohttp, FastAPI重写以提高并发处理能力。虽然Intruder是单线程请求但识别服务本身可以并行处理多个识别任务如果未来扩展其他用途。请求重放与去重在真正的测试中网络波动或服务端偶尔无响应可能导致个别请求失败。可以在Intruder攻击完成后筛选出状态码为5xx或超时的请求将其单独保存然后修改captcha-killer的配置使用一个新的会话Cookie对这些失败请求进行重试。验证码缓存策略谨慎使用对于一些简单的、非一次性验证码虽然少见可以尝试在本地脚本中实现简单的缓存。即对相同的图片Base64哈希值直接返回缓存的结果避免重复识别。但这需要你非常确定目标系统的验证码不是一次性的。结合其他Burp插件可以结合Logger插件详细记录每一次请求和响应的全过程便于事后分析哪一步出了问题。也可以使用Turbo Intruder虽然它更复杂来尝试实现更高效的自定义并发逻辑但会话管理会变得极具挑战。4.3 应对更复杂的验证码机制滑块验证码captcha-killer本身难以处理。需要更专门的工具链通常包括1. 获取背景图和缺口图2. 使用图像识别算法计算缺口位置3. 模拟滑块拖动轨迹。这个过程可能需要编写自定义的Python脚本并通过一个中间API服务与Burp交互。captcha-killer在这里的角色可能仅限于传递图片和接收计算出的滑动距离。点选验证码识别出需要点击的文字或物体后需要返回的是坐标信息如x1,y1|x2,y2。这需要你的识别后端能够输出坐标并且登录接口可能接受坐标序列作为验证参数。你需要修改请求模板和结果提取规则来处理坐标数据。短信/邮箱验证码这通常不属于图形验证码范畴captcha-killer不适用。这类爆破需要关注的是验证码的时效性、重放攻击和次数限制。测试重点在于逻辑漏洞而非自动化识别。最后我必须强调所有技术都应在合法授权的范围内使用。自动化安全测试工具是一把双刃剑captcha-killer这样的插件极大地提升了安全测试人员评估验证码机制强度的效率但同样它也可能被滥用。理解其原理和流程有助于我们更好地设计出能够抵御此类自动化攻击的验证码系统这才是安全领域知识分享与进步的真正意义。在实际项目中使用时请务必确保你拥有对目标系统进行测试的明确授权。整个配置过程看似繁琐但一旦跑通你就会发现它为我们打开了一扇自动化测试的新大门尤其是面对那些自以为有验证码就高枕无忧的登录接口时。