mitm_relay SSL拦截指南:如何轻松中间人 IMAP、SMTP、XMPP 等 STARTTLS 加密通道
【免费下载链接】mitm_relayHackish way to intercept and modify non-HTTP protocols through Burp & others.项目地址: https://gitcode.com/gh_mirrors/mi/mitm_relay
mitm_relay 是一款开源的 SSL 拦截中间人工具,借助 Burp Suite 等现成的流量代理,就能轻松对 IMAP、SMTP、XMPP、IRC 等非 HTTP 协议进行 STARTTLS 加密通道的拦截与篡改,TCP/UDP 均支持,特别适合厚客户端(Thick Client)安全评估场景,免去了为冷门协议搭建专用环境的麻烦。
什么是 mitm_relay?🤔
主流的抓包/代理工具大多只擅长 HTTP 世界。而邮件、即时通讯、数据库、甚至 SSH 这类"古怪"协议,往往让安全测试者头疼。mitm_relay 的思路非常巧妙(作者称之为 "hackish"):
- 借鸡生蛋:把每一段客户端请求和服务器响应,打包进一个 HTTP POST 请求体里,经由你现有的拦截代理(如 Burp Proxy)转发给一个本地"回声"Web 服务器再原样取回;
- 协议无关:因此 Burp 里看到的 HTTP 头无意义,但代理的拦截、查看、Match and Replace 修改规则对原始协议数据完全生效;
- 完全异步:服务器连续分片发送响应也不会出错;
- 支持 SSL/STARTTLS:自动检测 TLS 握手(
\x16\x03魔数)并在中间插入 TLS 包装,因此 IMAP、SMTP、XMPP、IRC 的 STARTTLS 升级通道可以被解密。
在代理中,客户端发来的数据会出现在 URL 含CLIENT_REQUEST的请求里,服务器回的数据则出现在SERVER_RESPONSE请求中。💡
注意:Burp 的 Repeater、Intruder、Scanner 在此场景下没有意义——它们实际打到的只是那个"回声"服务器。
快速安装与运行
克隆项目并查看帮助:
git clone https://gitcode.com/gh_mirrors/mi/mitm_relay cd mitm_relay python3 mitm_relay.py --help核心参数一览(源码见 mitm_relay.py):
| 参数 | 作用 |
|---|---|
-r <relay> | 定义中继,格式[udp:\|tcp:]本地端口:目标主机:目标端口,可重复指定多个 |
-p <proxy> | 转发到哪个代理(如127.0.0.1:8080);省略则进入纯监控模式,流量只打印到控制台 |
-c / -k | SSL/STARTTLS 拦截所需的服务器证书与私钥文件 |
-cc / -ck | 连接真实服务器时使用的客户端证书与私钥 |
-s <script> | 自定义 Python 脚本(handle_request/handle_response),在转发到代理前修改流量 |
-t | Socket 接收超时,默认 120 秒 |
SSL 拦截配置:三步搞定 STARTTLS 通道 🔐
第一步:生成证书
项目自带 gen_certs.sh 脚本,一键生成自签名证书(10 年有效期):
sh gen_certs.sh脚本会在cert/目录下生成server.pem与private.key,默认 CN 为*.acmecorp.com。⚠️关键细节:很多客户端会校验证书 CommonName!请务必将 CN 改为客户端实际连接的服务器域名(可从真实服务器证书中获取),否则 STARTTLS 拦截会失败。
如果客户端执行严格的证书校验,可以把 Burp 的 CA 导入到客户端信任库,再用该 CA 签发一张可信服务器证书(完整命令见 README.md 的 Certificates 章节),前提是客户端未做证书绑定(Certificate Pinning)。
第二步:让客户端把流量发给你
最简单的方式:查清客户端要解析的 DNS 地址,在 hosts 文件中把它指向运行 mitm_relay 的机器,并让 mitm_relay监听与目标服务器相同的端口。若客户端写死了 IP 地址,可在宿主机用 iptables DNAT 规则把流量重定向到中继端口(README 中有完整示例)。
第三步:启动中间人
以拦截 IMAP(143 端口)的 STARTTLS 会话为例:
python3 mitm_relay.py -r 143:mail.example.com:143 \ -p 127.0.0.1:8080 \ -c cert/server.pem -k cert/private.key同样方式替换端口即可拦截 SMTP(25/587)、XMPP(5222/5223)等。UDP 协议只需加上前缀,如-r udp:53:dns.example.com:53(注意 UDP 场景建议绑定局域网 IP 而非 127.0.0.1)。
启动后,每次客户端与服务器之间的 TLS 握手都会自动被工具"拆开"重新封装,明文数据随即可在 Burp 中逐条查看和篡改。✅
实战技巧:用 Python 脚本自动改包 ✍️
除了手动在 Burp 里点拦截,还可以用-s参数挂一个 Python 脚本,在流量进入代理之前就完成修改。示例脚本 sample_script.py 演示了两个钩子:
def handle_request(client_request): # 客户端 -> 服务器 的流量 modified = client_request.replace(b'original', b'modified') return modified def handle_response(server_response): # 服务器 -> 客户端 的流量 return server_response官方 README 中给了一个经典用法——关闭 Gmail IMAP 会话的压缩,把COMPRESS=DEFLATE替换为COMPRESS=NONE,从而在 Burp 里看到明文的邮箱交互内容:
python3 mitm_relay.py -r 143:imap.gmail.com:143 -p 127.0.0.1:8080 \ -c cert/server.pem -k cert/private.key -s disable_compress.py脚本的典型应用场景:
- 修改协议中记录"字段长度"的头部(改了消息体就要同步改长度字段,否则会话会损坏);
- 对协议特定部分做模糊测试(Fuzzing);
- 反序列化对象、做修改、再重新序列化;
- 纯监控:把用户名、密码等敏感字段记录到文件。
只看不改:监控模式 📡
不指定-p代理时,mitm_relay 退化为纯监控模式:所有流量以彩色高亮打印到控制台(ASCII 直接解码,二进制则输出 hexdump),客户端/服务器 IP、时间戳、数据长度一目了然,适合快速摸清一个陌生协议的行为。
注意事项 ⚠️
- 没有提供
-c/-k证书时,TLS 握手会被检测到但无法解密,工具会提示你先用gen_certs.sh生成证书; - 修改会改变消息长度的协议字段(如 MySQL)必须同时更新长度头,否则连接会中断;
- 工具完全同步转发,不改变原有会话时序;
- 合规提醒:仅在你拥有或获得书面授权的系统上使用,未经授权的中间人拦截是违法行为。
小结
mitm_relay 用一个"把协议数据伪装成 HTTP 请求体"的巧思,让你零配置地把 Burp 的能力扩展到任意 TCP/UDP 协议上。配合 STARTTLS 证书支持,IMAP、SMTP、XMPP 这类加密邮件/IM 通道也能被轻松"中间人",是厚客户端安全评估工具箱里一把锋利的瑞士军刀。🔧
【免费下载链接】mitm_relayHackish way to intercept and modify non-HTTP protocols through Burp & others.项目地址: https://gitcode.com/gh_mirrors/mi/mitm_relay
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考