Mitmproxy代理配置及接口加解密详细教程
官方网站:Event Hooks & API (mitmproxy.org)
本节目录展示:
文章目录
客户端下载
方式一
https://mitmproxy.org/downloads/
方式二
安装 mitmproxy
pip install mitmproxy
mitmproxy
提供了三个命令,启动模式不同:
mitmproxy
提供一个命令行界面(该命令不支持windows)。
mitmdump
提供一个简单的终端输出。
mitmweb
提供一个浏览器界面。
mitmproxy -p 指定的端口号
mitmdump -p 指定的端口号
mitmweb -p 指定的端口号
常用参数
![](/qrcode.jpg)
-h 帮助信息
-p 修改监听端口
-s 加载 python 脚本
安装证书
注意:需要先开启代理连接后进行安装
需要配置代理进行安装,或者直接进入安装mitmproxy目录拿证书进行安装。
在连接mitmproxy之后,手机或设备需要设置代理,输入 http://mitm.it/ 安装证书
http://mitm.it/
mitmproxy代理ios设备
启动服务
指定8899端口启动服务
mitmdump -p 8899
ios设备配置代理
确保你的计算机和 iOS 设备连接到同一个局域网。
1、获取计算机IP
-
ipconfig (Windows) ifconfig (Mac/Linux)
2、ios设备配置代理,在 iOS 设备上打开设置(Settings)应用程序。
3、点击 Wi-Fi,并找到你所连接的 Wi-Fi 网络。点击网络名称旁边的 “i” 图标以查看网络详细信息。
4、在网络详细信息页面中,向下滚动并找到 “HTTP 代理”(HTTP Proxy)选项。选择 “手动”(Manual)。
5、在 “服务器”(Server)字段中输入 mitmproxy 运行计算机的 IP 地址,并在 “端口”(Port)字段中输入 mitmproxy 的监听端口,默认为 8080。
6、保存设置,并关闭设置应用程序。
7、浏览器输入http://mitm.it/
进行证书的安装。
8、前往设置 证书的信任设置: 设置 -> 通用-> VPN与设备管理 -> mitmproxy,点击进行安装
9、安装成功
10、信任证书,通用 -> 关于本机 -> 下拉到 证书信任设置 -> 找到mitmproxy点击开关信任。
现在,你的 iOS 设备将经过 mitmproxy,并且可以在 mitmproxy 上拦截和修改所有的网络请求和响应。你可以在 mitmproxy 的界面中查看和操作这些请求和响应。
安卓一般在安全-加密与凭据-用户,有时候还有去更多WLAN设置里面安装证书
报错
Client TLS handshake failed. Client and mitmproxy cannot agree on a TLS version to use. You may need to adjust mitmproxy’s tls_version_client_min option.
使用如下命令即可,忽略就行。目前没啥影响。
mitmdump -p 8899 --set tls_version_client_min=SSL3
使用web抓取
mitmweb -p 8899
代码过滤处理
示列代码 mitmproxt_demo01.py
# -*- coding: utf-8 -*-
'''
@Time : 2023/8/7 18:16
@Email : [email protected]
@公众号 : 梦无矶的测试开发之路
@File : mitmproxy示列.py
'''
__author__ = "梦无矶小仔"
import mitmproxy
from mitmproxy import ctx,http
class Counter:
def __init__(self):
pass
# 所有发出的请求数据包都会被这个方法所处理
def request(self, flow: mitmproxy.http.HTTPFlow):
# 获取请求对象
request = flow.request
# 实例化输出类
info = ctx.log.info
# 打印请求的url
info(request.url)
# 打印请求方法
info(request.method)
# 打印host头
info(request.host)
# 打印请求端口
info(str(request.port))
# 打印所有请求头部
info(str(request.headers))
# 打印cookie头
info(str(request.cookies))
print("请求的参数data----------------------")
info(str(request.data))
print("请求的参数data----------------------")
# 所有服务器响应的数据包都会被这个方法处理
def response(self, flow: mitmproxy.http.HTTPFlow):
# 获取响应对象
response = flow.response
# 实例化输出类
info = ctx.log.info
# 打印响应码
info(str(response.status_code))
# 打印所有头部
info(str(response.headers))
# 打印cookie头部
info(str(response.cookies))
# 打印响应报文内容
info(str(response.text))
addons = [
Counter()
]
通过脚本启动
mitmweb -p 8899 -s .\mitmproxy_demo01.py
加解密
python 在 Windows下使用AES时要安装的是pycryptodome 模块
pip install pycryptodome
python 在 Linux下使用AES时要安装的是pycrypto模块
pip install pycrypto
字符替换
aaa = '151691566822749_NEW_RDA_LOADOKaRgN'
这会SOH
对应的是ACCIC码1
# 所以可以这样进行替换
repl_aaa = aaa.replace(chr(1), " ")
字符串转二进制
string = "Hello World"
binary = " ".join(format(ord(char), '08b') for char in string)
print(binary)
运行这段代码,它将输出 01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100
,这就是 “Hello World” 的二进制表示。
在这个示例中,format(ord(char), '08b')
将每个字符转换为 8 位的二进制字符串,然后使用 join()
函数以空格分隔每个字符的二进制表示,最终得到一个包含整个字符串二进制表示的字符串。
字符串转字节
在 Python 中,可以使用字符串的 encode()
方法将字符串转换为字节(bytes)类型的数据。你可以指定一个字符编码来确定字节表示中的字符编码方式。
下面是一个示例代码,演示如何将字符串转换为字节:
string = "Hello World"
bytes_data = string.encode('utf-8')
print(bytes_data)
运行这段代码,它将输出 b'Hello World'
,这就是字符串 “Hello World” 的字节表示。
在这个示例中,encode()
方法将字符串使用 UTF-8 编码方式转换为字节类型的数据。默认情况下,Python 使用 UTF-8 作为字符编码方式。你可以根据具体的需求选择其他字符编码方式,例如 “utf-16”、“latin-1” 等。
需要注意的是,字节类型的数据表示为以 b
开头的字符串,表示它是字节数据而不是普通的字符串。
实际演示
aaa = '151691566822749_NEW_RDA_LOADOKaRgNxBJEpvYo1FdZQu9d85ExmqB97SpGUPvMmSYZXIauvSu9IgrpJSK5PAs4DMMNONB2daybYwrdCjCWKUOPUb1KTPyiHYfo9EVg5jMXkDMT7xebOYk0x0loFWsSEKguYmVe5U2jAc5EDPn8nIBLTxGXSeL/S6ZbXJhEszrI1FJ/CYxjZfQKVQhMENxsN8O/yhK2AgXQe4CDQT3+sxlLCFw5XcG4IGoD8kyyHbpulwjOQW98orOf2DBZkHjxFqjFo6G/7SVZ3wr0ER05uAopJpc8XBJSTfhNAzKT2JwatMG7beFxUzrBeuNJp7MHKJUUYjfUNeqhGF1dKaya1HdOxfUoWuCMUV0XMroNItipbLj0ZX5ZfftN/eskoZjDvYDvU0Oyt6xC7RZVIOLbyOlmWQ8Pl7NHzqFeVUqViVyGIaA8HsivAw+lStBo+W6qDCbkgAAg6Z+8fsiSjgDSgpLJSwBqO75HzRUDRHhHc9/Wqqdeq2pE6PnlrJ6XWrXooBwg0bbecb50d88e230df396fb6a53532280;'
binary = aaa.encode('utf-8')
print(binary)
输出
b'1\x015\x011691566822749\x01_NEW_RDA_LOADOK\x01aRgNxBJEpvYo1FdZQu9d85ExmqB97SpGUPvMmSYZXIauvSu9IgrpJSK5PAs4DMMNONB2daybYwrdCjCWKUOPUb1KTPyiHYfo9EVg5jMXkDMT7xebOYk0x0loFWsSEKguYmVe5U2jAc5EDPn8nIBLTxGXSeL/S6ZbXJhEszrI1FJ/CYxjZfQKVQhMENxsN8O/yhK2AgXQe4CDQT3+sxlLCFw5XcG4IGoD8kyyHbpulwjOQW98orOf2DBZkHjxFqjFo6G/7SVZ3wr0ER05uAopJpc8XBJSTfhNAzKT2JwatMG7beFxUzrBeuNJp7MHKJUUYjfUNeqhGF1dKaya1HdOxfUoWuCMUV0XMroNItipbLj0ZX5ZfftN/eskoZjDvYDvU0Oyt6xC7RZVIOLbyOlmWQ8Pl7NHzqFeVUqViVyGIaA8HsivAw+lStBo+W6qDCbkgAAg6Z+8fsiSjgDSgpLJSwBqO75HzRUDRHhHc9/Wqqdeq2pE6PnlrJ6XWrXooBwg\x01\x010bbecb50d88e230df396fb6a53532280\x01;'
这里看起来没什么,但是实际的加解密都要通过这个手段去进行一系列的操作,可以说这一步是基操。
解密代码
涉及相关机密,无法展示,这一块接口方面如果是加密,会有对应的secret秘钥。
这一块如果你做接口了需要进行解密,你可以找对应的开发给你提供秘钥。
这个秘钥就像我们django的settings.py文件中的SECRET_KEY字段。