Mitmproxy使用

简单介绍
Mitmproxy,一个结合python的CLI抓包工具,基于MITM形式,类似于BurpSuite。但是,与BurpSuite、Yakit、Charless等工具不同,mitmproxy更偏向于结合python,原生开发一些抓包过程中的插件脚本(addon),自由度更加高,适合用来做一些定制化、批量化的测试,这也是mitmproxy最核心、最强大的地方(python语法简单,容易开发;和burpsuite不同,mitmproxy无需关心额外的API,使得插件更加容易开发)。
- 拦截HTTP和HTTPS请求和响应并即时修改它们
- 保存完整的HTTP对话以供以之后重发和分析
- 重发HTTP对话的客户端
- 重发先前记录的服务的HTTP响应
- 反向代理模式将流量转发到指定的服务器
- 在macOS和Linux上实现透明代理模式
- 使用Python对HTTP流量进行脚本化修改
- 实时生成用于拦截的SSL / TLS证书
- And much, much more…
更加详细的介绍可以参考官方文档:Mitmproxy Introduction
快速开始
下载安装
使用pip安装mitmproxy库以及二进制文件
1
pip install mitmproxy
安装完成之后会得到三个可执行的二进制文件:
mitmproxy、mitmweb、mitmdump- mitmproxy:最常用的一个工具,在终端命令行中以UI的形式进行展示数据包
- mitmweb:启动一个web服务,以web界面的形式展示数据包,类似于burpsuite、yakit等工具
- mitmdump:类似于tcpdump,用来保存数据包到文件中
验证是否成功
1
2pip list|grep mitm
mitmproxy --version
mitmproxy
1 | [10:13:40 shaoxinSEC@WIN11 (master)]# mitmproxy --help |
1 | [10:20:02 shaoxinSEC@WIN11 (master)]# mitmproxy --options |
1 | 监听所有IP的8088端口,加上-s参数可指定addon脚本(如果不指定,mitmproxy默认监听http://localhost:8080) |
插件
插件(addon)是mitmproxy最强大、最核心的部分,编写回调函数,用来处理不同类型的hook事件(用得较多的一般是http类型中的request事件和response事件)。官方推荐按照下面的方式开发插件,即一个插件就是一个类,在类里面编写回调函数。
1 | """ |
hook事件
| hook事件 | 回调函数 |
|---|---|
| Lifecycle Events 生命周期事件(mitmproxy本身的运行相关) | def load(loader: mitmproxy.addonmanager.Loader): def running(): def configure(updated: set[str]): def done(): |
| Connection Events 网络连接相关事件 | def client_connected(client: mitmproxy.connection.Client): def client_disconnected(client: mitmproxy.connection.Client): def server_connect(data: mitmproxy.proxy.server_hooks.ServerConnectionHookData): def server_connected(data: mitmproxy.proxy.server_hooks.ServerConnectionHookData): def server_disconnected(data: mitmproxy.proxy.server_hooks.ServerConnectionHookData): def server_connect_error(data: mitmproxy.proxy.server_hooks.ServerConnectionHookData): |
| HTTP Events HTTP相关事件 | def requestheaders(flow: mitmproxy.http.HTTPFlow): def request(flow: mitmproxy.http.HTTPFlow): def responseheaders(flow: mitmproxy.http.HTTPFlow): def response(flow: mitmproxy.http.HTTPFlow): def error(flow: mitmproxy.http.HTTPFlow): def http_connect(flow: mitmproxy.http.HTTPFlow): def http_connect_upstream(flow: mitmproxy.http.HTTPFlow): def http_connected(flow: mitmproxy.http.HTTPFlow): def http_connect_error(flow: mitmproxy.http.HTTPFlow): |
| DNS Events DNS相关事件 | def dns_request(flow: mitmproxy.dns.DNSFlow): def dns_response(flow: mitmproxy.dns.DNSFlow): def dns_error(flow: mitmproxy.dns.DNSFlow): |
| TCP Events TCP相关事件 | def tcp_start(flow: mitmproxy.tcp.TCPFlow): def tcp_message(flow: mitmproxy.tcp.TCPFlow): def tcp_end(flow: mitmproxy.tcp.TCPFlow): def tcp_error(flow: mitmproxy.tcp.TCPFlow): |
| UDP Events UDP相关事件 | def udp_start(flow: mitmproxy.udp.UDPFlow): def udp_message(flow: mitmproxy.udp.UDPFlow): def udp_end(flow: mitmproxy.udp.UDPFlow): def udp_error(flow: mitmproxy.udp.UDPFlow): |
| QUIC Events QUIC相关事件 | def quic_start_client(data: mitmproxy.proxy.layers.quic._hooks.QuicTlsData): def quic_start_server(data: mitmproxy.proxy.layers.quic._hooks.QuicTlsData): |
| TLS Events TLS相关事件 | def tls_clienthello(data: mitmproxy.tls.ClientHelloData): def tls_start_client(data: mitmproxy.tls.TlsData): def tls_start_server(data: mitmproxy.tls.TlsData): def tls_established_client(data: mitmproxy.tls.TlsData): def tls_established_server(data: mitmproxy.tls.TlsData): def tls_failed_client(data: mitmproxy.tls.TlsData): def tls_failed_server(data: mitmproxy.tls.TlsData): |
| WebSocket Events WebSocket事件 | def websocket_start(flow: mitmproxy.http.HTTPFlow): def websocket_message(flow: mitmproxy.http.HTTPFlow): def websocket_end(flow: mitmproxy.http.HTTPFlow): |
| SOCKS5 Events SOCKS5事件 | def socks5_auth(data: mitmproxy.proxy.layers.modes.Socks5AuthData): |
| Advanced Lifecycle Events 高级生命周期事件 | def next_layer(data: mitmproxy.proxy.layer.NextLayer): def update(flows: Sequence[mitmproxy.flow.Flow]): def add_log(entry: mitmproxy.log.LogEntry): |
API
- mitmproxy.addonmanager
- mitmproxy.certs
- mitmproxy.connection
- mitmproxy.contentviews
- mitmproxy.coretypes.multidict
- mitmproxy.dns
- mitmproxy.flow
- mitmproxy.http
- mitmproxy.net.server_spec
- mitmproxy.proxy.context
- mitmproxy.proxy.mode_specs
- mitmproxy.proxy.server_hooks
- mitmproxy.tcp
- mitmproxy.tls
- mitmproxy.udp
- mitmproxy.websocket
常用插件
url_extractor
1 | import re |
request_replayer
1 | import hashlib |
参考文章
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 少欣安全!