mitmproxy 是一款支持 HTTP (S) 的中间人代理工具。mitmproxy 提供了一个控制台接口用于动态拦截和编辑 HTTP 数据包。不同于 Fiddler2,burpsuite 等类似功能工具,mitmproxy 可在终端下运行。mitmproxy 使用 Python 开发,是辅助 web 开发 & 测试,移动端调试,渗透测试的工具。
mitmdump 是 mitmproxy 的命令行版本,功能与其相同。
安装 mitmproxy
先要在 Mac 中安装 pip(Python 包管理工具,主要是用于安装 PyPI 上的软件包,可以替代 easy_install 工具。) , 打开 Termal 终端,输入如下命令:
$ sudo easy_install pip Searching for pip Reading https://pypi.python.org/simple/pip/ ...安装 mitmproxy
$ sudo pip install mitmproxy --ignore-installed six
使用
使用方法目前自己也完全参考以上文章,因为目前也处于学习使用阶段,所以写一大堆和别人类似的东西或者不如别人详细完善的东西出来完全是浪费时间,Blog 这个东西只是辅助手段,并不能放在首要目标上。
以下 vim 命令可通过?获得
This view:
| A | 接收所有被拦截的流 | 
|---|---|
| a | 只接收该被拦截的流 | 
| b | 保存 request/response 体 | 
| C | 导出流到剪切板 | 
| d | 删除流 | 
| D | 重复流 | 
| e | 切换事件日志 | 
| E | 导出流到文件 | 
| f | 过滤视图 | 
| F | 切换 follow 流列表 | 
| L | 加载保存的流 | 
| m | 切换流标记 | 
| M | 切换标记的流视图 | 
| n | 创建一个新的 request | 
| r | 重复 request | 
| S | 服务器重复 request | 
| U | 取消标记所有被标记的流 | 
| V | 还原更改的请求 | 
| w | 保存流 | 
| W | 把流 stream 入文件 | 
| X | 杀死和删除流,即使它正被拦截 | 
| z | 清楚流或事件日志 | 
| tab | 选项卡在事件日志和流列表之间切换 | 
| enter | 查看流 | 
| l | 运行脚本 | 
Movement
| j,k | 下移,上移 | 
|---|---|
| h,l | 左移,右移(在某些文本中) | 
| g,G | 移至开头,结尾 | 
| space | 翻页 | 
| page up/down | 翻页 | 
| ctrl+b /ctrl+f | 翻页 | 
| 方向键 | 上下左右移动 | 
Global keys
| i | 设置拦截模式 | 
|---|---|
| o | 选项 | 
| q | 后退,返回 | 
| Q | 退出而不需要确认提示 | 
| R | 从文件中重复运行 requests/responses | 
Filter expressions:(过滤表达式)
| ~a | 匹配 response:CSS,JavaScript,Flash,image | 
|---|---|
| ~b regex | Body | 
| ~bq regex | request 请求体 | 
| ~bs regex | response 响应体 | 
| ~c int | HTTP response code | 
| ~d regex | Domain 域 | 
| ~dst regex | 匹配目标地址 | 
| ~e | 匹配错误 | 
| ~h regex | Header | 
| ~hq regex | Request header | 
| ~hs regex | Response header | 
| ~http | 匹配 http 流 | 
| ~m regex | Method | 
| ~marked | 匹配标记的流 | 
| ~q | 匹配 request 而不需要 response | 
| ~s | 匹配 response | 
| ~src regex | 匹配源地址 | 
| ~t regex | Content-type header | 
| ~tcp | 匹配 TCP 流 | 
| ~tq regex | Request Content-type header | 
| ~ts regex | Response Content-type header | 
| ~u regex | URL | 
| ! | 非 | 
| & | 与 | 
| l | 或 | 
| (…) | 集合 | 
- 正则表达式是 Python 风格的。
 - 正则表达式可以被指定为带引号的字符串。
 - Header 匹配 (
h,hq,~hs) 是针对 “name:value” 形式的字符串。 - 没有运算符的表达式与 URL 的正则表达式匹配
 - 默认的二进制运算符是 &
 
Examples:
| google.com | URL 包含 “google.com” | 
|---|---|
| ~q ~b test | Request 请求体中包含 “test” | 
| !(~q & ~t “text/html”) | 除了 Request 请求中带有 “text/html” 的内容类型 | 
参考文章
- 推荐给开发人员的 6 个实用命令行工具(阅读难度:★)
 - 使用 mitmproxy 进行移动端的 HTTP 抓包(阅读难度:★★)
 - mitmproxy 实践教程之调试 Android 上 HTTP 流量(阅读难度:★★)
 - 和 Charles 同样强大的 iOS 免费抓包工具 mitmproxy(阅读难度:★★★)
 - mitmproxy 套件使用攻略(阅读难度:★★★★)