基于ddddocr与Captcha-Killer构建高精度验证码自动化识别工具链

📅 2026/6/23 17:24:30
基于ddddocr与Captcha-Killer构建高精度验证码自动化识别工具链
1. 项目概述为什么我们需要一条“高精度”的验证码绕过工具链在安全测试特别是渗透测试的授权爆破环节验证码CAPTCHA是横亘在自动化攻击面前最常见的防线之一。传统的应对方式比如手动识别、使用通用OCR接口或者寻找逻辑漏洞要么效率低下要么成本高昂要么成功率不稳定。当面对一个需要大量尝试的登录口时一个稳定、高效且精准的验证码识别与绕过方案就成了决定测试深度与效率的关键。这个项目的核心就是构建一条集成在BurpSuite——这个安全从业者几乎人手一套的“瑞士军刀”里的自动化工具链。它不再是简单的“识别-替换”而是追求“高精度”和“自动化闭环”。ddddocr作为近年来在安全圈内口碑极佳的开源OCR库以其对各类扭曲、干扰、粘连字符验证码的高识别率而著称Captcha-Killer则是BurpSuite上一款老牌且强大的验证码识别插件负责在Burp的Intruder或Repeater模块中动态地识别并替换请求中的验证码字段。将两者结合意味着我们可以将ddddocr强大的识别引擎无缝嵌入到BurpSuite的自动化测试流程中。当Intruder模块发起爆破攻击时每一次请求的验证码都能被实时、自动地识别并填充从而实现无人值守的、高成功率的爆破测试。这不仅仅是工具的堆砌更是一种工作流的革新它把安全工程师从重复的“看图-输入”劳动中解放出来专注于更复杂的逻辑分析和漏洞挖掘。2. 核心组件深度解析ddddocr与Captcha-Killer是如何工作的2.1 ddddocr为何它能成为验证码识别的“新宠”ddddocr是一个基于深度学习的OCR Python库它的设计目标非常明确以极低的配置成本和极高的准确率解决各类常见的验证码识别问题。与一些需要复杂训练过程的AI方案不同ddddocr开箱即用这对于渗透测试这种讲求效率和即战力的场景来说是巨大的优势。它的核心技术原理可以简单理解为“特征提取”与“模式匹配”的升级版。传统的OCR可能依赖于字符分割和模板匹配对于字符扭曲、背景噪声、颜色变化的验证码束手无策。ddddocr底层通常采用卷积神经网络CNN等深度学习模型。这个模型在训练阶段“见过”海量的、各式各样的验证码图片从中学会了如何忽略干扰信息如斑点、曲线、颜色块并聚焦于字符本身的笔画、结构和轮廓特征。举个例子一个验证码字符“A”可能被画成倾斜的、带有波浪线的、或者部分被遮挡的。传统方法可能无法识别但经过训练的CNN模型能够捕捉到“A”这个字符最本质的拓扑结构——一个尖顶和两条斜线构成的近似三角形空间。ddddocr内置的模型已经具备了这种强大的泛化能力。在实际调用时你只需要将验证码图片的二进制数据或文件路径传给它的API它就能在毫秒级时间内返回识别结果。其官方宣称对数字、英文大小写混合的常见验证码识别率非常高这正是其成为安全测试利器的原因。注意ddddocr的强悍也带来了一些“甜蜜的烦恼”。由于其依赖项如onnxruntime,numpy的版本要求较为严格在安装时很容易出现版本冲突特别是numpy版本问题是新手踩坑的重灾区。后面我们会详细讲解如何平滑部署。2.2 Captcha-KillerBurpSuite中的验证码处理中枢如果说ddddocr是识别引擎那么Captcha-Killer就是连接引擎与BurpSuite攻击流程的“桥梁”和“控制器”。它本身不具备强大的识别能力但它提供了一个极其灵活的框架允许你接入任何外部识别接口包括本地Python脚本、在线OCR平台API等并将识别结果自动填回HTTP请求中。它的工作流程非常清晰捕获验证码在BurpSuite的Proxy历史或Repeater中找到包含验证码图片的HTTP响应通常是img标签的src指向的一个独立请求。发送至识别接口Captcha-Killer允许你配置一个“识别接口”。你可以将上一步捕获的验证码图片POST到这个接口。获取并回填结果识别接口也就是我们即将用ddddocr搭建的服务返回识别出的文本。Captcha-Killer会提取这个文本并按照你设定的规则如替换POST数据中的captcha参数自动更新即将发出的请求。联动Intruder进行爆破在Intruder模块中你可以将验证码参数标记为Payload并选择Payload类型为“Extension-generated”然后选择Captcha-Killer。这样Intruder在发起每一次攻击请求前都会自动触发上述“捕获-识别-回填”流程实现全自动化爆破。Captcha-Killer的强大之处在于其可扩展性。它不绑定任何特定的识别技术只要你的接口能接收图片并返回文本它就能工作。这为我们集成高性能的ddddocr提供了完美的舞台。3. 环境搭建与核心工具链部署实操3.1 Python环境与ddddocr的“无坑”安装指南这是整个工具链的基础也是最容易出问题的环节。我们目标是搭建一个独立的、干净的Python环境来运行ddddocr服务。第一步创建并激活虚拟环境强烈建议使用虚拟环境避免与系统或其他项目的Python包发生冲突。# 假设使用Python3 python -m venv ddddocr_env # 激活虚拟环境 # Windows: ddddocr_env\Scripts\activate # Linux/Mac: source ddddocr_env/bin/activate激活后命令行提示符前会出现(ddddocr_env)字样。第二步处理棘手的依赖安装ddddocr的安装命令很简单pip install ddddocr。但问题往往出在它的依赖上尤其是numpy和onnxruntime。核心矛盾某些旧版本的ddddocr可能依赖numpy2.0但onnxruntime又需要numpy2.0。这是一个典型的版本冲突。解决方案优先安装兼容的numpy版本再安装ddddocr。目前以主流版本为例可以按以下顺序操作# 先升级pip到最新版确保安装过程顺畅 pip install --upgrade pip # 安装一个较新且稳定的numpy版本通常1.2x系列与onnxruntime兼容性好 pip install numpy1.24.3 # 然后安装ddddocr它会自动安装适配的onnxruntime pip install ddddocr如果安装过程中仍然报错可以尝试先安装onnxruntimepip install onnxruntime然后再安装ddddocr。虚拟环境给了我们试错的资本如果实在不行可以删除环境重来。第三步验证安装创建一个简单的Python脚本test_ocr.py进行测试import ddddocr ocr ddddocr.DdddOcr() with open(sample_captcha.png, rb) as f: img_bytes f.read() result ocr.classification(img_bytes) print(f识别结果: {result})找一个简单的验证码图片命名为sample_captcha.png放在同目录运行脚本。如果成功输出识别结果说明ddddocr安装成功。3.2 构建一个高效的ddddocr HTTP识别服务ddddocr库本身只是一个本地函数要让Captcha-Killer调用我们需要将其包装成一个HTTP API服务。这里我们使用轻量级的Flask框架。安装Flaskpip install flask创建服务端脚本ocr_server.pyfrom flask import Flask, request, jsonify import ddddocr import base64 import logging # 配置日志方便出错时查看 logging.basicConfig(levellogging.INFO) app Flask(__name__) # 全局加载一次模型避免每次请求重复加载提升响应速度 ocr ddddocr.DdddOcr() app.route(/ocr, methods[POST]) def recognize_captcha(): 接收Captcha-Killer发送的验证码图片进行识别并返回结果。 期望的POST数据格式{image: base64编码的图片数据} try: data request.get_json() if not data or image not in data: return jsonify({error: No image data provided}), 400 # Captcha-Killer发送的是去掉了头部如data:image/png;base64,的纯base64 image_b64 data[image] # 将base64字符串解码为图片字节 image_bytes base64.b64decode(image_b64) # 调用ddddocr进行识别 result ocr.classification(image_bytes) # 返回Captcha-Killer期望的JSON格式 return jsonify({code: 200, message: success, data: result}) except Exception as e: logging.error(f识别过程中发生错误: {e}) return jsonify({code: 500, message: str(e), data: None}), 500 if __name__ __main__: # 运行服务host0.0.0.0允许同一网络内其他设备如运行Burp的主机访问 # 端口可自定义如8888 app.run(host0.0.0.0, port8888, debugFalse) # 生产环境务必设置debugFalse运行与测试服务python ocr_server.py看到输出类似* Running on http://0.0.0.0:8888即表示服务启动成功。你可以使用curl或Postman进行测试curl -X POST http://127.0.0.1:8888/ocr \ -H Content-Type: application/json \ -d {image: 你的验证码图片base64编码字符串}如果返回{code:200, message:success, data:abcd}这样的格式说明API工作正常。实操心得服务端脚本中将ddddocr.DdddOcr()实例化放在全局而不是每个请求内部这是一个关键的性能优化点。模型加载到内存需要时间和资源全局单例可以保证服务响应速度极快这对于高并发的爆破场景至关重要。同时务必处理好异常返回规范的JSON否则Captcha-Killer可能无法解析响应。3.3 BurpSuite与Captcha-Killer的配置与联动第一步BurpSuite基础配置确保你的BurpSuite已正确安装并配置了浏览器代理通常为127.0.0.1:8080。这是抓包和进行测试的前提。如果遇到TLS连接错误如热词中提到的failed to negotiate a TLS connection通常是因为目标服务器使用了较新的TLS协议或ALPN扩展而Burp的CA证书未被完全信任或者Java环境版本问题。确保将Burp生成的CA证书正确安装到系统的受信任根证书颁发机构并重启Burp和浏览器。第二步安装Captcha-Killer插件在BurpSuite的Extender选项卡中点击“Add”选择“Java”类型的插件然后加载你下载的Captcha-Killer.jar文件。安装成功后Burp顶部菜单栏会出现一个“Captcha-Killer”的标签页。第三步配置Captcha-Killer识别接口打开Captcha-Killer标签页。在“识别接口”区域将接口URL设置为你的ddddocr服务地址例如http://127.0.0.1:8888/ocr。请求方法选择POST。在“请求体”中选择JSON格式并填入我们服务端期望的格式{image:{base64}}。这里的{base64}是一个占位符插件会自动将捕获的图片转换为base64并替换它。在“结果提取”区域我们需要告诉插件如何从HTTP响应中提取识别出的文本。观察我们服务端返回的JSON{code:200, message:success, data:abcd}。我们需要提取data字段的值。因此提取方式选择“正则表达式”表达式可以填写data:(.*?)。这个正则会匹配双引号内data对应的值。点击“测试”按钮。在Burp的Proxy历史记录中找到一个包含验证码图片的HTTP响应通常是获取验证码的请求右键将其发送到Captcha-Killer。然后在Captcha-Killer界面点击“获取验证码”再点击“识别”。如果下方结果显示了你验证码的识别文本并且与图片一致说明整个接口配置成功第四步实战演练——联动Intruder进行自动化爆破抓取登录请求在浏览器中完成一次失败的登录尝试Burp会记录下这个包含用户名、密码、验证码的POST请求。发送到Intruder在Proxy历史中右键该登录请求选择“Send to Intruder”。设置攻击位置在Intruder的Positions标签页清除所有自动标记然后手动将用户名如username、密码如password和验证码如captcha参数值标记为Payload位置。关键点验证码参数captcha需要被标记。配置Payloads对于username和password你可以根据实际情况设置Payload集比如字典文件。对于captcha参数这是最关键的一步。在Payload类型下拉框中选择“Extension-generated”。然后在下面的“Payload Options”中选择你刚刚配置好的“Captcha-Killer”扩展。配置Captcha-Killer的触发切换到“Options”标签页找到“Request Engine”子选项。你需要设置一个“资源池”Resource Pool并限制线程数如1-2个因为验证码识别和请求需要一定时间过快会导致识别失败或请求混乱。更重要的是在“Grep-Extract”或相关设置中确保Captcha-Killer能正确捕获到每次请求前最新的验证码图片。通常这需要你在“Project options” - “Sessions”中配置一个宏Macro来自动请求获取验证码的接口并将图片响应传递给Captcha-Killer。这是高级用法但对于完整的自动化至关重要。开始攻击点击“Start attack”。此时Intruder会为每一组用户名/密码组合发起一次攻击。在每次发起请求前它会通过Captcha-Killer调用你的ddddocr服务获取一个新的、正确的验证码并填充到请求中从而实现全自动、高精度的爆破。4. 精度提升与高级调优策略4.1 针对复杂验证码的ddddocr调优默认的ddddocr.DdddOcr()已经很强但面对极端复杂的验证码如极度扭曲、严重粘连、背景复杂识别率可能会下降。ddddocr提供了一些初始化参数供我们微调use_gpu: 如果你的环境支持CUDA可以设置为True以利用GPU加速大幅提升识别速度对于高强度爆破很有意义。show_ad: 这是一个有趣的功能设置为False可以关闭库自带的广告一些开源库的生存之道但一般不影响功能。选择不同的模型ddddocr除了通用识别DdddOcr还提供了专门用于滑块验证码缺口识别的DdddOcr(detFalse)等。虽然本项目主要针对字符验证码但了解其多模型结构有助于应对更多场景。更高级的调优涉及预处理。虽然ddddocr内置了强大的抗干扰能力但有时在将图片发送给OCR之前我们自己先做一步预处理能起到奇效。你可以在服务端脚本的recognize_captcha函数中在调用ocr.classification()之前对image_bytes进行处理from PIL import Image import io # ... 获取image_bytes后 ... img Image.open(io.BytesIO(image_bytes)) # 示例预处理转换为灰度图、二值化、降噪 img img.convert(L) # 转灰度 # 可以添加更多PIL或OpenCV操作如滤波、阈值分割等 # ... # 将处理后的图片转换回字节 buffered io.BytesIO() img.save(buffered, formatPNG) processed_image_bytes buffered.getvalue() result ocr.classification(processed_image_bytes)常见的预处理操作包括二值化将图片转为黑白、去噪去除孤立的像素点、腐蚀膨胀处理粘连或断裂字符等。这需要对图像处理和目标验证码的特点有一定了解属于进阶技巧。4.2 Captcha-Killer工作流的优化与异常处理1. 宏Macro配置实现真·全自动前面提到要让Intruder在每次攻击前都能拿到最新的验证码需要配置Session Handling Rules中的宏。基本步骤是在Burp的“Project options” - “Sessions” - “Session Handling Rules”中新建一个规则。在规则作用域Scope中定义该规则适用于你的目标网站。添加一个动作Action“Run a macro”。新建一个宏录制“获取验证码图片”的请求通常是GET请求。在宏编辑器中你可以配置Burp从这次录制的响应中提取验证码图片通常通过CSS选择器或正则匹配img标签的src或者直接就是图片二进制响应。关键一步将这个宏与Captcha-Killer关联。在Captcha-Killer插件设置中通常有选项可以指定“验证码来源”为某个配置好的宏。这样每次Intruder请求前Burp会自动执行宏获取新验证码并传递给Captcha-Killer进行识别。2. 处理识别失败与重试机制即使ddddocr精度很高也有识别失败的可能。Captcha-Killer本身的重试逻辑可能有限。我们需要在服务端和攻击策略两个层面增加鲁棒性。服务端增强在ocr_server.py的识别函数中可以加入置信度判断。虽然ddddocr的classification方法默认不返回置信度但你可以通过捕获异常或对返回结果进行简单校验如长度是否为4-6位是否只包含预期字符集来做一个初步过滤。如果校验失败可以返回一个特定的错误码Captcha-Killer可以配置当收到此错误码时触发重试需要插件支持或通过Burp宏配合。BurpSuite策略在Intruder的“Options” - “Grep - Match”中可以设置匹配成功登录的响应特征如登录成功、跳转至主页等。同时在“Redirections”中选择“Process cookies in redirections”等确保会话保持。对于识别失败的请求由于其会导致登录失败响应特征不符Intruder会将其标记出来。你可以通过分析失败请求来调整你的字典或识别策略。3. 性能与并发控制验证码识别是计算密集型任务。即使使用GPU单个ddddocr实例的处理能力也有上限。在Intruder中发起高并发爆破时可能会压垮你的本地OCR服务导致请求超时或识别错误率飙升。限流务必在Intruder的Resource Pool中设置较低的线程数如1-5个。验证码爆破不是密码爆破不需要极高的每秒请求数RPS稳定和准确更重要。服务端队列对于更专业的部署可以考虑在Flask服务前加一个消息队列如Redis将识别任务异步化避免HTTP请求阻塞。但这属于架构优化对于大部分单机测试场景限流已足够。负载均衡如果测试需求极大可以部署多个ddddocr服务实例并使用Nginx等做负载均衡将Captcha-Killer的请求分发到不同实例。5. 常见问题排查与实战避坑指南在实际搭建和使用过程中你几乎一定会遇到下面这些问题。这里我整理了从环境到实战的完整排错链条。5.1 环境与部署类问题问题1安装ddddocr时出现numpy版本冲突或onnxruntime相关错误。排查思路这是最常见的问题。首先确认你的Python版本建议3.8-3.10然后严格按照前面“无坑安装指南”的顺序操作。使用虚拟环境是隔离问题的关键。解决方案创建全新的虚拟环境。先尝试pip install numpy1.24.3。再尝试pip install ddddocr。如果还不行尝试pip install onnxruntime然后pip install ddddocr。查看ddddocr官方GitHub的Issues页面搜索类似错误可能有针对特定操作系统或Python版本的解决方案。问题2Flask服务启动后Captcha-Killer测试时连接被拒绝或超时。排查思路网络连通性问题。解决方案检查Flask服务是否真的在运行netstat -an | grep 8888。检查Flask启动命令中的host参数。如果Burp和OCR服务在同一台机器用127.0.0.1如果在不同机器需用0.0.0.0并确保防火墙放行了对应端口如8888。在浏览器或用curl直接访问http://服务IP:8888/ocr用POST方法测试看服务本身是否正常。检查Captcha-Killer中配置的URL是否正确特别是端口号。问题3Captcha-Killer测试时能收到响应但提示“结果提取失败”。排查思路接口返回格式与插件提取规则不匹配。解决方案仔细对比你的Flask服务返回的JSON字符串和Captcha-Killer中“结果提取”配置的正则表达式。确保JSON格式完全一致包括空格和引号。使用在线的正则测试工具验证你的表达式是否能正确匹配出data字段的值。确保Flask服务在异常时也返回了规范的JSON格式而不是Python的异常栈信息。5.2 识别与爆破过程类问题问题4识别率低很多验证码识别错误。排查思路原因可能是验证码类型超出ddddocr通用模型能力或者图片预处理不到位。解决方案样本分析收集一批识别错误和成功的验证码图片观察它们的区别。是字符扭曲太厉害有复杂背景干扰还是字体特殊启用ddddocr的详细输出有些版本的ddddocr可以开启调试模式查看中间识别过程但这需要查阅其特定API。引入预处理如前文所述在服务端增加图像预处理步骤如二值化、去噪、对比度增强等往往能显著提升对特定类型验证码的识别率。考虑定制训练如果目标验证码非常独特且固定可以考虑用ddddocr或其它深度学习框架如PaddleOCR收集样本进行微调训练。但这需要一定的机器学习知识和数据准备属于高阶方案。问题5Intruder爆破时验证码没有自动更新每次用的都是同一个。排查思路Captcha-Killer没有成功在每次请求前触发获取新验证码的流程。解决方案检查宏配置这是最可能的原因。确保你的Session Handling Rule中的宏正确录制了“获取验证码”的请求并且正确地从响应中提取了图片数据。检查规则作用域确保Session Handling Rule的作用域Scope包含了你的目标登录URL。手动测试宏在“Sessions”设置中可以手动测试你配置的宏看它是否能成功执行并拿到新的验证码图片。检查Captcha-Killer来源设置在Captcha-Killer插件中确认“验证码来源”选择的是你配置的宏而不是“From Repeater”或“From Proxy”。问题6爆破速度很慢或者大量请求失败、超时。排查思路并发过高资源成为瓶颈。解决方案降低Intruder线程数这是最直接有效的方法。将Resource Pool的线程数降到1或2观察是否稳定。优化Flask服务确保Flask运行在生产模式debugFalse可以考虑使用gevent或gunicorn等WSGI服务器提升并发处理能力。检查网络与目标服务器目标网站可能对频繁请求有速率限制或封禁策略。适当增加请求间隔在Intruder的Options中设置。验证码服务性能监控运行OCR服务的机器CPU/内存使用率。如果持续满载说明识别任务过重需要考虑前面提到的负载均衡方案。5.3 安全与合规性提醒重要提示本文所述的所有技术、工具和方法仅限用于授权安全测试、教育学习与研究以及对自己拥有完全管理权限的系统进行测试。未经授权对任何第三方系统进行渗透测试或攻击是非法行为违反相关法律法规可能导致严重的法律后果。使用这些技术时请务必遵守你所在地区的法律法规并严格在获得明确授权的范围内进行操作。安全技术的价值在于防御和提升而非破坏。