0x01 前言
老话说的好“工欲善其事,必先利其器”,对于不管是在日常工作、打比赛还是挖SRC,搞安全的师傅们估计都离不开 Burp suite 这个“神器”,可以说开完电脑的下一步就是打开BP也不为过。由于我前一段时间尝试上手有着号称“网络安全单兵作战工具”的 Yakit ,经过一段时间的使用,个人觉得 Yakit 的某些方面其实是已经超越了BP,例如java反序列化Payload可以通过Fuzztag渲染后直接使用等。对于目前的我来说,Yakit已经是逐渐替代BP成为我的主力工具,但是在使用的过程中也有碰到一些小问题,今天就想和师傅们来分享其中的 “如何使用Yakit进行验证码识别爆破”。
在进入主题正文前我想抛出一个问题给师傅们:
“碰到有验证码的登录框你会如何使用Yakit爆破?”
如果是把Yakit当主力工具的师傅,可以带着问题思考一下,然后来看下面的内容。
0x02 过程
估计以BP当主力工具的师傅们对于带图形验证码的登录框爆破,常规操作的话都是使用 captcha-killer-modified 插件 + codereg.py脚本(离线)/ 打码平台(在线)来进行爆破。但是我在使用Yakit的过程中,发现如果碰到了带图形验证码的登录框想要爆破,在Yakit自带的插件商店中,无法搜索出相关的辅助插件。
那这样的话对于这种情况,我偏要说“我就是只想用Yakit去爆破”,这时候该怎么办?不要着急,我们先来分析一下BP使用 captcha-killer-modified 插件是如何去识别验证码的。
这里我们通过 本地搭建环境,使用BP通过 captcha-killer-modified 插件来进行验证码识别爆破演示:
首先我们先把识别处理的codereg.py脚本先运行起来
打开BP在captcha-killer-modified插件中选择ddddocr模板库
可以看到在默认情况下,captcha-killer-modified插件选择ddddocr模板库的验证码识别处理请求的就是我们前面起的识别处理接口。
接着我们抓取一个验证码接口发送至captcha-killer-modified插件并点击“获取”按钮,可以看到成功通过接口获取验证码信息
点击“识别”按钮,可以看到最右边显示验证码已经成功被识别处理了
接着我们把验证码接口发送至Repeater模块中,通过3次重发测试请求验证码接口,发现每次返回的都是一张不同的图片
我们返回captcha-killer-modified插件,通过查看Requst template与Requst raw的识别处理请求
至此通过上面使用captcha-killer-modified 插件来进行验证码识别分析,我们已经得知逻辑图如下:
看完逻辑图,我们已经清楚知道了整个流程,那么我们就进入主题,Yakit要如何实现这个流程?这里我们就引用出“热加载”这个功能。什么是热加载?在官方的热加载文档介绍中写着:“在Yakit 的Web Fuzzer中,热加载是一种高级技术,让 Yak 成为 Web Fuzzer 和用户自定义代码中的桥梁,它允许我们编写一段 Yak 函数,在 Web Fuzzer 过程中使用,从而实现自定义 fuzztag 或更多功能”。
既然如此,那么我们通过运用热加载来实现这个流程不就是很简单的事情了吗?这里提前和大家说个小知识点,如果我们需要使用加载来辅助完成这个流程,我们需要使用热加载中的“魔术方法”,为什么呢?在查阅官方文档时,可以看到清楚的写着“beforeRequest 允许发送数据包前再做一次处理”,按照Yakit团队的师傅原话来说就是“通常情况下热加载函数是希望不重复调用的,即一次任务只使用一次,但是为了应对需要重复调用的情况,我们加了beforeRequest 这个魔术方法,这个方法的使用的与其他不同,不使用fuzztag插入调用,声明之后会自己调用用于修改数据包”(谨记:魔术方法是修改数据包的作用的,不再会渲染fuzztag)
那么“beforeRequest 这个魔术方法,这个方法的使用的与其他不同,不使用fuzztag插入调用,声明之后会自己调用用于修改数据包”是什么意思呢?我们打开Yakit,在Web Fuzzer中点开热加载,可以看到正常情况下,正常情况下我们如果需要调用热加载,是需要使用标签调用才会触发,但是对于 beforeRequest 这个特殊的方法来说,是不需要使用标签调用。具体怎么触发调用,请师傅们详细看后面演示的截图。
下图为官方文档的说明:
接下来可以看到其实beforeRequest方法已经预置好了,那么我们只需要把我们的代码写到beforeRequest方法里的作用域内即可使用。
那我们要如何实现呢?首先我们按照前面BP的流程逻辑来规划一下在Yakit中要如何实现,逻辑图如下:
清楚知道要怎么实现后,那么我们就在热加载的beforeRequest方法中编写代码。这里我使用的是Yaklang语言中的HTTP库,身边的师傅都说这个是老库,建议使用POC库,但是对于我来说,作为思路的演示,只要能实现就行了,当然师傅们如有需要,也可以自己查阅官方开发接口文档,使用POC库从新编写。
每次使用按照需求稍微修改验证码接口信息即可,热加载代码如下:
beforeRequest = func(req) {
/*
// 我们可以提供一些基础用法,比如说单纯就是替换一个时间戳~
req = str.ReplaceAll(req, "TIMESTAMP_INT64", sprint(time.Now().Unix()))
*/
// 定义验证码接口信息
method = "GET"
url = "https://xxxxxx.com/verifyCode"
params = "/"
cookie = "PHPSESSID=xxxxxx"
// 请求验证码接口
reqOne = http.NewRequest(
method,
url,
http.params(params),
http.cookie(cookie),
http.fakeua(),
http.proxy("http://127.0.0.1:7890")
)~
rspOne = http.Do(reqOne)~
encodeBody = codec.EncodeBase64(rspOne.Body)
// 定义识别处理接口信息
methodTow = "POST"
urlTow = "http://127.0.0.1:8888/reg"
paramTow = encodeBody
// 识别处理验证码
reqTow = http.NewRequest(
methodTow,
urlTow,
http.postparams(paramTow),
http.fakeua(),
http.header("Authorization", "Basic f0ngauth"),
http.header("Accept-Encoding", "gzip, deflate"),
http.header("Content-Type", "application/x-www-form-urlencoded"),
http.header("Accept-Encoding", "gzip, deflate"),
http.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
)~
rspTow = http.Do(reqTow)~
req = str.ReplaceAll(req, "_verify_", string(http.GetAllBody(rspTow)))
return []byte(req)
}
前面说过 beforeRequest 这个特殊的方法是不需要使用标签调用的热加载的,那么我们要怎么触发呢?官方文档看一下我们在beforeRequest方法中使用的str.ReplaceAll函数就知道了
如果还是有疑问的话,建议多看几遍上面两图与热加载代码,思考一下
接下来通过 本地搭建的环境,使用Yakit通过热加载来进行验证码识别爆破演示:
同样,我们首先把识别处理的codereg.py脚本先运行起来
抓取验证码接口发送至Web Fuzzer
然后我们设置好热加载验证码接口信息
我们抓取一个登录包,尝试登录爆破账号,查看是否验证码已经实现自动识别验证(这里我们先不管类似于防CSRF每次刷新的hash值,主要测试验证码是否自动验证识别成功)
经过上面的实验,可以清楚的看到我们已经成功通过热加载来实现验证码识别爆破,如果师傅们想识别一些比较难的验证码,或者想提高识别精准度,可以稍微修改热加载代码使用打码平台,这里就不做推荐。
0x03 结语
其实这篇文章只是一个引喻,热加载是一个很强大的功能;“工欲善其事,必先利其器”,或许你能灵活使用的话,会使你有意想不到的结果~ 最后,可能文笔不好,如有错误,请各位师傅多多指导。
原文始发于微信公众号(知攻善防实验室):【必看】Yakit的热加载验证码识别
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论