前端加密对抗——CDP远程调用Debug断点函数python代码实现

news2024/12/22 16:17:28

文章目录

  • 前端加密对抗——CDP远程调用Debug断点函数python代码实现
    • 实现请求断点处函数
    • mitmproxy实现加解密

前端加密对抗——CDP远程调用Debug断点函数python代码实现

前几天看了看tools推送的前端加密的文章:前端加密对抗Part2-通过CDP远程调用Debug断点函数
觉得这个方法很方便,以前经常遇到开发自己改了加密代码导致同样是AES等加密算法,加密出来不一样,但是用CDP的话就能解决这个问题。上面那篇也没有具体实现的源码,于是自己研究了下,基本实现了,暂时没找到全流程加解密的站,找到了再把返回包解密的代码补上。

测试网址:某网站的登录接口。
首先设置中开启Protocol Monitor
图片.png添加协议监视器
图片.png

实现请求断点处函数

正常抓登录包,密码是加密的
图片.png在这里插入图片描述
找到加解密函数,打断点后控制台可以直接调用。
图片.png使用cdp调用加解密函数:
代码

import json
import requests
import websocket


def websocket_conn():
    # websocket_conn 连接
    resp = requests.get('http://127.0.0.1:9222/json')
    assert resp.status_code == 200
    ws_url = resp.json()[0].get('webSocketDebuggerUrl')
    return websocket.create_connection(ws_url)


def execute_cdp(conn: websocket, command: dict):
    # 执行  dp
    conn.send(json.dumps(command))
    # 接受websocket的响应,并将字符串转换为 dict()
    return json.loads(conn.recv())


def main():
    conn = websocket_conn()
    # js = "console.log('hello world')" # 控制台打印 hello world
    command = {
        'method': 'Debugger.evaluateOnCallFrame',  # 处理 传进去的 expression
        'id': int(), # id需要传一个整型,否则会报错
        'params': {
            'callFrameId': callFrameId,
            'expression': expression,
            'objectGroup': 'console',
            'includeCommandLineAPI': True,
        }
    }
    resp = execute_cdp(conn, command)
    print(resp["result"]["result"]['value'])


if __name__ == '__main__':
    callFrameId = "5889892333005756436.1.0"
    expression = 'Object(b[\"b\"])(\"123456\")'
    main()

运行发现调用加密函数加密成功!
图片.png

mitmproxy实现加解密

这里分为en_proxy.py和de_proxy.py两个文件
流程为:

浏览器数据包——>de_proxy.py(解密请求包)
——>burp(此时burp为解密的请求包)
——>en_proxy.py(burp再通过User options将请求包发给en_proxy加密,加密后发给服务器)
——>服务端(服务端返回加密的数据)
——>en_proxy.py(en_proxy还负责解密服务端发过来的数据)

首先实现de_proxy.py

from mitmproxy import http, ctx
import json
from tool.cdp3 import *


class DecryptPassword:
    # 解密请求包
    def request(self, flow: http.HTTPFlow) -> None:
        if flow.request.method == 'POST' and 'application/json' in flow.request.headers['Content-Type']:
            # 解析请求体中的JSON数据
            req_data = json.loads(flow.request.text)
            # 判断是否包含password参数
            if 'password' in req_data.keys():
                # 进行解密操作
                data = req_data['password']
                callFrameId = "5889892333005756436.1.0"
                de_expression = f'Object(b[\"a\"])(\"{data}\")'
                # 对参数进行解密
                decrypted_password = EZ_CDP(callFrameId, de_expression).encrypted()
                print(decrypted_password)
                # 修改JSON数据中的password参数值
                req_data['password'] = decrypted_password
                # 将修改后的JSON数据转换成字符串形式
                # 更新请求体中的数据
                flow.request.text = json.dumps(req_data)


addons = [
    DecryptPassword()
]

命令行执行

mitmproxy --mode upstream:http://127.0.0.1:8080 -s de_proxy.py --listen-port 8989 --ssl-insecure

--mode upstream:http://127.0.0.1:8080:设置二级代理,解密请求包后发给burp

此时,burp收到的请求包是解密的
查看经de_proxy.py处理的数据包:

在这里插入图片描述
此时,密码是解密的图片.pngburp也是收到解密包

在这里插入图片描述


BURP User options设置Upstream Proxy Serversen_proxy.py的地址,我这里是127.0.0.1:8990
图片.pngen_proxy.py实现,将burp发过来的请求包再加密发给服务端,这里其实还负责将服务端发过来的数据解密,但是由于这个网址这里只加密了密码,返回包没加密就没加这个功能,添加个response函数使用解密函数再解密一下返回包即可。

from mitmproxy import http, ctx
import json
from tool.cdp3 import *


class EncryptPassword:
    # 解密请求包
    def request(self, flow: http.HTTPFlow) -> None:
        if flow.request.method == 'POST' and 'application/json' in flow.request.headers['Content-Type']:
            # 解析请求体中的JSON数据
            req_data = json.loads(flow.request.text)
            # 判断是否包含password参数
            if 'password' in req_data.keys():
                # 进行加密操作
                data = req_data['password']
                callFrameId = "5889892333005756436.1.0"
                de_expression = f'Object(b[\"b\"])(\"{data}\")'
                # 对参数进行解密
                decrypted_password = EZ_CDP(callFrameId, de_expression).encrypted()
                print(decrypted_password)
                # 修改JSON数据中的password参数值
                req_data['password'] = decrypted_password
                # 将修改后的JSON数据转换成字符串形式
                # 更新请求体中的数据
                flow.request.text = json.dumps(req_data)


addons = [
    EncryptPassword()
]

命令行执行

mitmproxy -s en_proxy.py --listen-port 8990 --ssl-insecure

查看该数据包,可以发现发送给服务器的数据包加密了
图片.png此时发登录包
图片.png请求数据是解密的,返回内容也没问题。
在这里插入图片描述

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

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

相关文章

NR 5G 系统消息MIB和SIB详解

系统信息分类 系统信息与各个信道的映射图示: 在5G高层中,系统信息可以分为三类: 最少系统信息(Minimum System Information,MSI): MSI包括MIB和RMSIMIB的RRC消息 MasterInformationBlockMI…

DTU902 工控机 边缘计算网关

边缘计算网关(Edge Computing Gateway)是一种连接边缘设备和云端服务器的中间件设备,它可以处理和存储大量的数据,提高数据处理和传输的效率。边缘计算网关可以将数据预处理和过滤,减少数据传输到云端的负荷&#xff0…

2023 最新版IntelliJ IDEA 2023.1创建Java Web前(vue3)后端(spring-boot3)分离 项目详细步骤(图文详解)

文章目录 🚩 接上篇🏳‍🌈 项目构建所需的相关工具JavaIDEAmavenNodeJSVueVisual Studio Code 🌌 后端项目创建详细步骤🛫 1、开始创建新项目🛫 2、输入项目名称、选择项目存储位置、项目管理工具&#xff…

HTTP 教程1

HTTP 协议一般指 HTTP(超文本传输协议)。 超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为…

CPO技术重塑光模块:行业变革与突破

随着OpenAI的ChatGPT重磅面世,在短短时间内,内容生成式人工智能消费级应用掀起一波新的科技浪潮。ChatGPT用户数也在短短两个月内破亿,成为史上活跃用户破亿速度最快的软件。 可以预料的是,未来算力和数据需求将迎来爆发式的增长,且传统可插拔光模块技术…

3.2 动态规划算法的基本要素

博主简介:一个爱打游戏的计算机专业学生博主主页: 夏驰和徐策所属专栏:算法设计与分析 学习目标: 如果我要学习动态规划算法的基本要素,我会采取以下步骤: 1. 理解概念:首先,我会研…

【程序】基于matlab使用脉冲压缩估计范围和多普勒

一、前言 本例显示了脉冲压缩的效果,其中发射的脉冲被调制并与接收的信号相关联。雷达和声纳系统使用脉冲压缩,通过缩短回波持续时间来提高信噪比(SNR)和距离分辨率。此示例还演示了多普勒处理,其中目标的径向速度由目…

Windows10系统下YOLOv5配置(Tesla P40 24GB、CUDA10.2)

操作系统:Windows10 显卡:Tesla P40 24GB CUDA版本:10.2 YOLOv5版本:4.0 一、下载 CUDA&cuDNN 下载相应版本的CUDA按默认一路安装到底 下载相应版本的cuDNN,解压,将bin中、include中、lib中文件…

CV | ⑩分钟实现视频人脸情绪生成(论文+代码)

本博客主要讲解了Emotionally Enhanced Talking Face Generation(情感增强的谈话人脸生成)论文概括与项目实现,以及代码理解。 Emotionally Enhanced Talking Face Generation Paper :https://arxiv.org/pdf/2303.11548.pdf Code: GitHub - s…

java民俗传统文化宣传分享网站springboot+vue

本传统文化网站有管理员和用户两个角色,管理员有,个人中心,用户管理,文章类型管理,文章信息管理,投票信息管理,留言板管理,系统管理。用户有个人中心,我的收藏&#xff0…

C++数据结构:二叉树之三(二叉搜索树扩展)

文章目录 前言一、搜索父节点二、搜索子节点三、搜索前驱后继节点四、计算二叉树的高度五、测试总结 前言 我们接着写二叉树,在前文链接:《二叉树之二》中,我们生成了如下的有序二叉树,并且实现了插入、删除和四种遍历方法。今天…

搭建 LNMP平台

搭建LNMP平台 一. 安装Nginx服务1.1 安装依赖包1.2 创建运行用户1.3 编译安装1.4 优化路径1.5 添加 Nginx 系统服务 二. 安装mysql服务2.1 安装Mysql环境依赖包2.2 创建运行用户2.3 编译安装2.4 修改mysql 配置文件2.5 更改mysql安装目录和配置文件的属主属组2.6 设置路径环境变…

C进阶:数据在内存中的存储(2)

六一儿童节快乐哇各位过期的小朋友们 引入: 在上一篇博文中,相信大家对于数据类型以及整数在内存中的存储有了一定了解,那么,浮点数是怎么在内存中存储的呢?下面来看一下我的讲解。 浮点数家族: 包括&#…

Python四则运算“计算器”——整数口算练习“小程序”

设定练习题目数量、最大取值整数数,即时判定,答对鼓励答错打印正确结果。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简…

python 1B 之路径

1. 绝对路径: os.path.abspath("") 翻译过来就是通过操作系统找到路径-绝对路径,os是operation system, abspath 是absolute path 比如现在运行的文件在service文件夹中,运行后: 2. 上层目录: 方…

快来,一起复习一下JDK动态代理和CGLib动态代理的区别

背景 工作也有四年了,基础的东西许久不看有些遗忘。一起来复习一下吧 JDK动态代理和CGLib的区别 JDK动态代理主要是针对类实现了某个接口,AOP则会使用JDK动态代理。它基于反射的机制实现,生成一个实现同样接口的一个代理类,然后…

MongoDB 学习

文章目录 前言1、MongoDB 的优势是什么2、部署2.1、Windows 系统中的安装启动2.2、Shell连接(mongo命令)2.3、Compass-图形化界面客户端2.4、Linux系统中的安装启动和连接 3、基本常用命令3.1、选择和创建数据库3.2、数据库删除3.3、集合操作3.3.1、集合…

HEVC预测编码介绍

介绍 ● 一幅图像内邻近像素之间有着较强的空间相关性,相邻图像之间也有很强的时间相关性; ● 预测编码(Prediction Coding)是指利用已编码的一个或几个样本值,根据某种模型或者方法,对当前的样本值进行预…

LeetCode572. 另一棵树的子树

题目 leetcode572. 另一棵树的子树 思路 递归解决。 ①递归的大问题化小----判断c是否为a子树可以转换为判断c是否为a左子树的子树或者c是否为a右子树的子树。 ②递归的结束条件-----如果两颗树相同,返回true;两棵树为空,返回true&#xff…

【十三】设计模式~~~行为型模式~~~中介者模式(Java)

中介者模式-Mediator Pattern【学习难度:★★★☆☆,使用频率:★★☆☆☆】 2.1. 模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题:系统结构复杂&#…