某次众测的加解密对抗

前言

起源于某次众测中,遇到请求包响应包全密文的情况,最终实现burp中加解密。

用到的工具有

  • sekiro(rpc转发)
  • flask(autodecoder自定义接口)
  • autodecoder(burp插件转发)

debug部分

开局搜索框,随意输入字符。

从burp查看后端请求,发现请求包响应包均为密文

猜测应该是前端进行了加密操作,接着尝试debug出加密逻辑。

先从启动器中寻找接口触发的函数,这里通过定位getData函数

然后通过F10跳过函数,最终到加密处如下

发现加密函数为Object(r["b"]),通过控制台打印它,双击即可跟进函数

具体定义如下。

观察be35包,当调用b的时候,返回了s,及AES加密。当调用a的时候,返回了o,及AES解密。分析这个AES的加解密,key和iv均不为硬编码,这也是后续RPC的最难点。

对于RPC来说,这一步需要我们将加解密函数添加到全局,也就是

window.enc=Object(r["b"]) //加密
window.dec=Object(r["a"]) //解密

添加完之后,还有key和iv需要解决。

这里当时临时解决办法是通过debug当时的key和iv,通过硬编码的形式来进行加解密。

js注入部分

首先需要在sekiro中新建group,不然匿名分组会慢很多。

由于这里使用的是sekiro的浏览器js环境,可参考官方文档,注入浏览器js代码

这里由于我进行的本地rpc,需要将wss协议更换为ws

var client = new SekiroClient("ws://localhost:端口号/business/register?group=分组名&clientId=" + Math.random());

在完成cleint创建后,还需要具体注册加解密的Action

下面是针对debug的函数做出的加解密方法注册。

client.registerAction("aes_enc", function (request, resolve, reject) {//加密resolve(enc(request["enc_par"],request["key"],request["iv"]); 
});client.registerAction("aes_dec", function (request, resolve, reject) {//解密resolve(enc(request["dec_par"],request["key"],request["iv"]); 
});

其中 enc 调用的是debug时注册的全局加密函数,request["xxx"]为调用 sekiro http接口的参数名,其他用法可参考使用文档。

burp上游代理部分

这里使用的autodecoder这款burp插件的接口加解密来作为上游代理,这里通过python的flask框架来编写二层接口加解密。以下是加密接口实现,解密同理。

@app.route('/aes_encode', methods=["POST"])
def encrypt():param = request.form.get('dataBody')  # 获取  post 参数data = {"group": "分组名","sekiro_token": "xxxxx", #在sekiro的管理页面"action": "aes_enc", #注册的action名字"enc_par": param,"bind_client": "设备名","key": key,"iv": iv}res = requests.post(url, data)enc = json.loads(res.text)['data']return enc

需要注意的是bind_client参数为设备ID,这个参数需要加上,不然会导致多设备转发出错,参考官方文档。

bind_client参数位置如下。

做完这些部分之后,即可在burp的拦截、重放功能中对密文解密。

key和iv随机问题解决

由于当时临时解决办法为,将key和iv通过debug出来后,硬编码赋值给上游代理的flask,但后续刷新页面,key和iv却发生了变化。于是重新debug出key和iv的生成逻辑。

debug回到之前的加密处

带着之前的思路,加密处为

Object(r["b"])(e.data, b.dfg, b.cvb)

其中key、iv对应的b.dfg、b.cvb。而对象b的定义如下

也就是由 Object(h["o"])("randomRequest", !0) 生成。同样通过控制台跟进Object(h["o"])

来到 f(t,e) 函数,如下

具体代码如下

function f(e, t) {e = "bqzt_" + e;var a = "sessionStorage";if (/mqqbrowser/i.test(window.navigator.userAgent) && (a = "localStorage"),window[a]) {var i = window[a][e] || "";return t && i && (i = JSON.parse(i)),i}console.log("当前浏览器不支持sessionStorage")}

分析这段代码,发现是正则匹配是否是QQ浏览器的user-agent来判断存储位置,如果正则匹配满足 /mqqbrowser/i ,则存储e到localStorage,如果不满足,则e存储到sessionStorage

而这里的f(e,t)函数中,e是什么呢,这里我们直接查看sessionStorage,也就是会话储存,发现e就是AES加解密的key和iv。

debug到这一步,问题解决的关键就在于sessionStoragelocalStorage

当页面刷新时sessionStorage会发生变化,导致key和iv发生变化,我们设置的硬编码就失效了。而localStorage并不会随着页面刷新而重置,它存储于浏览器当前状态。

所以我们只需要将user-agent更换为QQ浏览器即可将bqzt_randomRequest存储进localStorage
这里解释一下为什么改为localStorage就能动态获取key和iv,因为在js注入后,存储的也是sessionStorage,刷新就会消失。而存储为localStorage之后,只要保持jsrpc注入的页面和具体渗透测试的页面处于同一浏览器即可。

最后一步,我们需要修改注册的action,将key和iv分别利用 localStorage 来获取。具体代码如下:

client.registerAction("aes_enc", function (request, resolve, reject) {resolve(enc(request["enc_par"],JSON.parse(localStorage.getItem("bqzt_randomRequest")).dfg,JSON.parse(localStorage.getItem("bqzt_randomRequest")).cvb));
});

到这问题基本解决了,autoDecoder中效果图如下。

后续笔者也成功通过此加解密技巧,成功挖掘出高危漏洞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse--18--argMin() 和argMax()函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 argMin() 和argMax()函数业务场景使用案例1.准备表和数据:业务场景一:查看salary 最高和最小的user业务场景二:根据更新时间获取…

【fastapi】搭建第一个fastapi后端项目

本篇文章介绍一下fastapi后端项目的搭建。其实没有什么好说的,按照官方教程来即可:https://fastapi.tiangolo.com/zh/ 安装依赖 这也是我觉得python项目的槽点之一。所有依赖都安装在本地,一旦在别人电脑上编写项目就又要安装一遍。很扯淡。…

最优算法100例之45-不用循环乘法求1-n的和

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句。不能用循…

【opencv】示例-neural_network.cpp 使用机器学习模块创建并训练一个简单的多层感知机(神经网络)模型...

#include <opencv2/ml/ml.hpp> // 引入OpenCV的机器学习模块using namespace std; // 使用标准命名空间 using namespace cv; // 使用OpenCV命名空间 using namespace cv::ml; // 使用OpenCV机器学习命名空间int main() {//创建随机训练数据Mat_<float> data(100, …

字符和字符串操作函数总结

索引 一 . 字符操作函数1. 字符分类函数2. 字符转换函数 二 . 字符串操作函数长度不受限制的字符串操作函数1. strcpy函数的使用和模拟实现2. strcat函数的使用和模拟实现3. strcmp函数的使用和模拟实现 长度受限制的字符串操作函数1. strncpy函数的使用2. strncat函数的使用3.…

RT-Thread 启动流程源码详解

RT-Thread 启动流程 一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺 序是:系统先从启动文件开始运行,然后进入 RT-Thread 的…

vi编辑器

目录 一、文本编辑器vi命令 1.作用&#xff1a; 2.vi和vim 二、vi编辑器的三种模式 三、输入模式 四、命令模式 五、末行模式 一、文本编辑器vi命令 1.作用&#xff1a; 创建或修改文本文件 维护Linux系统中的各种配置文件 2.vi和vim vi:类UNIX操作系统的默认文本编辑器…

标准更新丨美国发布玩具安全标准ASTM F963-23

2023年10月13日&#xff0c;美国材料试验协会 (ASTM)发布了玩具安全标准ASTM F963-23。新版标准主要修订了声响、电池可触及性、膨胀材料和弹射玩具的技术要求&#xff0c;另外&#xff0c;澄清和调整了邻苯二甲酸酯、玩具基材重金属的豁免以及溯源标签的要求&#xff0c;使其保…

基于Python的豆瓣电影、豆瓣电影评分可视化、豆瓣电影评分预测系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

从零开始写一个RTSP服务器(一)RTSP协议讲解

目录 前言一、什么是RTSP协议&#xff1f;二、RTSP协议详解2.1 RTSP数据格式2.2 RTSP请求的常用方法2.3 RTSP交互过程2.4 sdp格式 三、RTP协议3.1 RTP包格式3.2 RTP OVER TCP 四、RTCP 前言 为什么要写这个系列&#xff1f; 因为我自己在学习rtsp协议想自己从零写一个rtsp服务…

【opencv】示例-npr_demo.cpp 非真实感渲染:边缘保留平滑、细节增强、铅笔素描/彩色铅笔绘图和风格化处理...

Edge Preserve Smoothing- Using Normalized convolution Filter Edge Preserve Smoothing-Using Recursive Filter Detail Enhancement Pencil sketch/Color Pencil Drawing Stylization /* * npr_demo.cpp * * 作者: * Siddharth Kherada <siddharthkherada27[at]gmail[do…

JavaScript代码挑战

让我们回到朱莉娅和凯特关于狗的研究。这次&#xff0c;他们想把狗的年龄转换成人的年龄&#xff0c;并计算出研究中狗的平均年龄。 创建一个函数 “calcAverageHumanAge”&#xff0c;该函数接受一个狗的年龄数组&#xff08;‘age’&#xff09;&#xff0c;并按顺序执行以下…

KDTree索引(K近邻搜索,半径R内近邻搜索)——PCL

K近邻搜索&#xff08;K Nearest Neighbors&#xff09; K近邻搜索是一种基于点数量的搜索方法&#xff0c;它会找到指定点附近最接近的K个邻居点。K近邻搜索中的K值是一个参数&#xff0c;您需要指定要搜索的邻居数量。该方法适用于需要查找固定数量邻居点的情况&#xff0c;…

Redis队列与Stream

Redis队列与Stream、Redis 6多线程详解 Redis队列与StreamStream总述常用操作命令生产端消费端单消费者消费组消息消费 Redis队列几种实现的总结基于List的 LPUSHBRPOP 的实现基于Sorted-Set的实现PUB/SUB&#xff0c;订阅/发布模式基于Stream类型的实现与Java的集成消息队列问…

Django模型入门

Django模型入门 为了能够学会使用Django模型&#xff0c;本节通过构建一个实际的Django模型来帮助读者尽快入门。 3.2.1 定义模型 既然Django模型实现了ORM功能&#xff0c;那么它就是对数据库实例的描述和实现。下面&#xff0c;我们通过一个简单的实例进行讲解。 如果需…

C语言-详解内存函数

文章目录 1.memcpy使用和模拟实现1.1 memcpy函数的使用规则1.2 memcpy函数的使用1.2 模拟实现memcpy函数 2.memmove 函数的使用和模拟实现2.1 memmove 函数使用规则2.2 memmove函数的使用2.3 模拟实现memmove函数2.3.1 从后往前移2.3.2 从前往后移 2.4 算法实现2.4.1 从前往后移…

机器学习之特征选择(Feature Selection)

1 引言 特征提取和特征选择作为机器学习的重点内容&#xff0c;可以将原始数据转换为更能代表预测模型的潜在问题和特征的过程&#xff0c;可以通过挑选最相关的特征&#xff0c;提取特征和创造特征来实现。要想学习特征选择必然要了解什么是特征提取和特征创造&#xff0c;得…

算法100例(持续更新)

算法100道经典例子&#xff0c;按算法与数据结构分类 1、祖玛游戏2、找下一个更大的值3、换根树状dp4、一笔画完所有边5、树状数组&#xff0c;数字1e9映射到下标1e56、最长回文子序列7、超级洗衣机&#xff0c;正负值传递次数8、Dijkstra9、背包问题&#xff0c;01背包和完全背…

React Hooks 全解: 常用 Hooks 及使用场景详解

React Hooks 是 React 16.8 版本引入的一项重要特性,它极大地简化和优化了函数组件的开发过程。 React 中常用的 10 个 Hooks,包括 useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef、useLayoutEffect、useImperativeHandle 和 useDebugValue。这些…

计算机网络——实现smtp和pop3邮件客户端

实验目的 运用各种编程语言实现基于 smtp 协议的 Email 客户端软件。 实验内容 1. 选择合适的编程语言编程实现基于 smtp 协议的 Email 客户端软件。 2. 安装 Email 服务器或选择已有的 Email 服务器&#xff0c;验证自己的 Email 客户端软件是否能进行正常的 Email 收发功…