mitmproxy和burpsuite联动(前后端加解密)

前言

最近工作中一直在使用mitmproxyburpsuite进行自动化加解密,因此记一下笔记。

环境部署

python3

python尽量选择高版本,不然安装后运行mitmproxy会提示windows无法使用mitmproxy

image

mitmproxy安装

通过指定清华源进行下载部署

1
pip3 install mitmproxy -i https://pypi.tuna.tsinghua.edu.cn/simple

安装过程应该是无报错,出现报错需要升级python的版本
image

image

运行mitmproxy

image

证书安装

文件资源管理器直接访问这个目录

1
C:\Users\%USERNAME%\.mitmproxy\

image

双击mitmproxy-ca.p12进行安装

image

安装过程中,直接都是下一步,密码不填写,证书颁发机构选择受信任的根证书颁发机构

然后就安装成功了

如果想检查证书

浏览器直接访问

1
chrome://certificate-manager/localcerts/platformcerts

可以看见证书是安装进去了

image

mitmproxy脚本编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# encoding=utf-8
from mitmproxy import ctx
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Util.Padding import unpad
import base64

# 加解密处理
# 设置AES密钥和初始向量
key = b"XXXXX"
Key = key.decode('utf-8')
iv = b"XXXXX"

#AES加密函数
def aes_encrypt(data):
print('执行了加密')
cipher = AES.new(key, AES.MODE_ECB) # 使用 ECB 模式
padded_data = pad(data.encode('utf-8'), AES.block_size, style='pkcs7')
encrypted_data = cipher.encrypt(padded_data)
return base64.b64encode(encrypted_data).decode('utf-8')

#AES解密函数
def aes_decrypt(data):
print('执行了解密')
cipher = AES.new(key, AES.MODE_ECB) # 使用 ECB 模式
encrypted_data = base64.b64decode(data)
decrypted_padded_data = cipher.decrypt(encrypted_data)
decrypted_data = unpad(decrypted_padded_data, AES.block_size, style='pkcs7')
return decrypted_data.decode('utf-8')

class ReplayBreakdown:
def __init__(self):
pass
def request(self, flow):
if "www.example.com" == flow.request.host:
# 请求数据处理
data = flow.request.get_text()
if data:
encoded_data = base64.b64encode(data.encode()).decode() # 先 encode 成 bytes,再 base64 编码成字符串
ecrypt_data = aes_encrypt(encoded_data) # 加密后也应是字符串或 bytes
# 修改请求体
new_body = b'info='+ecrypt_data.encode()
flow.request.content = new_body

def response(self, flow):
# 检查是否需要解密,例如检查URL或其他条件
if "www.example" == flow.request.host:
print(flow.response.content)
decrypt_data = aes_decrypt(flow.response.content)
print(decrypt_data)
# 打印解密后的数据
flow.response.content = base64.b64decode(decrypt_data) # 确保是字节格式
addons = [ReplayBreakdown()]

脚本运行

1
mitmproxy --listen-port 8086 -s test1.py

burpsuite设置

image

测试

没运行脚本前,请求和响应均是加密状态。

image

添加代理后,已经能将响应数据进行解密。

image

image

注意点

  1. python得高版本
  2. 如果加密后的请求数据中请求的内容类型(content-type)是raw类型,即使加密前的数据是json格式,那也要设置成raw,不然会发送失败。即burpsuite请求里面的数据和content-type不一定得一致。

image

Author: jdr
Link: https://jdr2021.github.io/2025/05/10/mitmproxy和burpsuite联动(前后端加解密)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.