mitmproxy抓包工具的使用
mitmproxy 是一个支持 HTTP/HTTPS 协议的抓包程序,和 Fiddler、Charles 有类似的功能,只不过它以控制台的形式操作。
mitmproxy 还有两个关联组件。一个是 mitmdump,这是 mitmproxy 的命令行接口,利用它我们可以对接 Python 脚本,用 Python 实现监听后的处理。另一个是 mitmweb,这是一个 Web 程序,通过它我们可以清楚地观察到 mitmproxy 捕获的请求。
本节来了解一下 mitmproxy 的用法。
mitmproxy 的功能
mitmproxy 有如下几项功能:
-
拦截 HTTP/HTTPS 的请求和响应;
-
保存并分析 HTTP 会话;
-
模拟客户端发起请求,模拟服务端返回响应;
-
利用反向代理将流量转发给指定服务器;
-
支持 Mac 系统和 Linux 系统上的透明代理;
-
利用 Python 实时处理 HTTP 请求和响应。
整体来看,mitmproxy 相当于一个命令行版本的 Charles,同样可以捕获与修改请求内容和响应内容。其实,相比 Charles,mitmproxy 最有优势的是它的关联组件 mitmdump,mitmdump 可以使用 Python 脚本实时处理请求和响应,功能非常强大。
本节我们先了解 mitmproxy 的基本功能,12.3 节再来介绍 mitmdump 对接 Python 的实现。
准备工作
和 Charles 一样,mitmproxy 运行之后会默认在当前电脑的 8080 端口开启一个代理服务,这个服务实际上是一个 HTTP/HTTPS 的代理。
请确保已经正确安装好了 mitmproxy,并且让手机和 mitmproxy 所在的电脑处于同一个局域网下。
然后配置好 mitmproxyCA,具体的安装和配置方法见 https://setup.scrape.center/mitmproxy 。
抓包原理
让手机和电脑处在同一个局域网下,将手机代理设置为 mitmproxy 的代理服务的地址。这样手机在访问互联网的时候,数据包就会先流经 mitmproxy,再由 mitmproxy 把这些数据包转发给真正的服务器; 同样,服务器返回的数据包也会先到达 mitmproxy,再由 mitmproxy 转发给手机。整个过程中的 mitmproxy 相当于中间人,能够抓取所有请求和响应。
这个过程还可以对接 mitmdump,直接用 Python 脚本处理抓取的请求和响应的具体内容。例如得到响应之后,直接解析其内容,然后存入数据库。
基本使用
首先需要运行 mitmproxy,命令如下:
mitmproxy
运行之后当前电脑的 8080 端口上会运行一个代理服务。mitmproxy 的页面如图 12-17 所示,右下角是当前正在监听的端口。
接下来将手机和电脑连接在同一局域网下,将代理设置为当前代理。先查看当前电脑的 IP 地址,在 Windows 上查看的命令如下:
ipconfig
在 Linux 和 Mac 上查看的命令如下:
ifconfig
输出结果如图 12-18 所示。
图 12-18 查看当前电脑的IP地址
当前电脑的 IP 地址形式一般是 10.*.*.*、172.16.*.* 和 192.168.*.*,例如图 12-18 中的 192.168.31.102。设置 mitmproxy 的代理时,设置为此地址即可。
设置成功后,在手机浏览器上访问任意网页或者打开任意 App 时,mitmproxy 页面上都会呈现出这个过程中的所有请求,例如在手机浏览器上打开百度,期间产生的请求如图 12-19 所示。
图12-19 打开百度产生的所有请求
这也相当于我们之前在浏览器开发者工具中监听得到的内容。图 12-19 中左下角显示的 1/31 代表一共产生了 31 个请求,箭头当前所指的请求是第 1 个。每个请求的开头都有一个 GET 或 POST,这是请求方法,后面紧接的内容是请求 URL,URL 之后是请求对应的响应状态码,其后是响应内容的类型(例如 text/html 代表网页文档、image/jpeg 代表图片),再后面是响应体的大小和响应时间。总之,当前页面呈现了所有请求和响应的概览,我们可以通过这个页面观察所有的请求。
如果想查看某个请求的详情,可以通过上下键切换,选中这个请求后按下回车键,进入请求的详情页面,如图 12-20 所示。
图 12-20 请求的详情页面
从图 12-20 中,可以看到请求头的详细信息,例如 Host、Cookie 等。图的上方有 Request、Response 和 Detail 三个选项,当前是打开了 Request 选项。按下 Tab 键切换至 Response 选项卡,查看请求对应的响应详情,如图 12-21 所示。
图 12-21 响应的详情页面
开始的内容是响应头的信息,下拉之后可以看到响应体的信息。针对当前请求,响应体就是网页的源代码。此时再按 Tab 键,切换到最后一个选项卡 Detail,即可看到当前请求的详细信息,如服务器的 IP 和端口、HTTP 协议版本、客户端的 IP 和端口等,如图 12-22 所示。
mitmproxy 还提供了命令行式的编辑功能,使我们可以重新编辑请求。按下E键即可进入编辑页面,这时它会询问要编辑哪部分内容,选项有 cookies、query、url 等,如图 12-23 所示。
图 12-22 当前请求的详细信息
图 12-23 编辑请求
按下要编辑内容对应的索引键即可进入编辑页面,例如按下数字 6 键,进入编辑请求 URL 的参数 QueryStrings 的页面,如图 12-24 所示。我们可以按下 D 键删除当前的 QueryStrings,然后按下 A 键新增一行,输入新的 Key 和 Value
图 12-24 编辑 QueryStrings 的页面
这里我们分别输入 wd 和 NBA。之后按下 Esc 键和 Q 键返回请求的详情页面,可以看到请求 URL 里多了一个 wd=NBA 的参数,如图 12-25 所示。
接着按下 E 键和数字 4 键,进入编辑 Path 的页面,如图 12-26 所示。和上面流程一样,按下 D 键和 A 键修改 Path 的内容。
这里我们将 Path 修改为 S。之后按下 Esc 键和 Q 键返回请求的详情页面,可以看到请求 URL 变成了 https://m.baidu.com/s?wd=NBA ,访问这个页面,结果如图 12-27 所示,这和用百度搜索关键词 NBA 的返回结果一样。
图12-25 更新了修改后的请求页面
图12-26 编辑 Path 的页面 图12-27 访问修改后的 URL 的结果
接下来,按下 R 键重新发送修改后的请求,可以看到请求旁边多了一个回旋箭头,如图 12-28 所示。
图12-28 重新发送修改后的请求
响应结果如图 12-29 所示,观察响应体,可以看到图 12-27 所示页面的源代码
图12-29 响应结果
总结
本节介绍了 mitmproxy 的简单用法,其基本功能和 Charles 是类似的,只是不像 Charles 那样有方便操作的 UI 界面,不过快捷键使用熟练后,也是非常方便的。
利用 mitmproxy,我们可以观察手机上的所有请求,以及对请求进行修改并重新发送。Fiddler、Charles 也有这个功能,而且它们的 UI 界面操作起来更加方便。那么 mitmproxy 的优势何在? 其实,mitmproxy 的强大之处体现在它的关联组件 mitmdump 上,有了 mitmdump,我们便可以直接对接 Python 脚本对请求和响应做处理。12.3 节我们就来学习 mitmdump 的用法。