Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

mitmproxy拦截代理——PC版HttpCanary

2022/05/23 爬虫
Word count: 2,358 | Reading time: 9min

HttpCanary

HttpCanary是Android系统下功能最强大的网络分析工具(IOS的是Thro),支持TCP/UDP/HTTP/HTTPS/WebSocket等多种协议,可以视为Android平台下的Fiddler和Charles。

★强大的调试功能

  • 断点指定请求,支持修改数据再提交。
  • 注入器支持,创建自定义规则修改返回数据包(★静态注入)。
  • 支持对网络请求重发、编辑重发、批量重发等操作。
  • 配置黑名单或者白名单,自由指定目标抓包。
  • 支持数据包屏蔽,比如屏蔽客户端发向服务器的指定数据包。

mitmproxy

顾名思义,mitmproxy 就是用于 MITM 的 proxy,MITM 即中间人攻击(Man-in-the-middle attack)。用于中间人攻击的代理首先会像正常的代理一样转发请求,保障服务端客户端的通信,其次,会适时的查、记录其截获的数据,或篡改数据,引发服务端或客户端特定的行为。不同于 fiddler 或 wireshark 等抓包工具,mitmproxy 不仅可以截获请求帮助开发者查看、分析,更可以通过自定义脚本进行二次开发。

注:mitmproxy最大的特点跟httpCanary一样,其拥有修改响应的能力,实现如下功能::“截获对浏览器对该 url 的请求,将返回内容置空,并将真实的返回内容存到某个数据库,出现异常时发出邮件通知”,这些都

但 mitmproxy 并不会真的对无辜的人发起中间人攻击,由于 mitmproxy 工作在 HTTP 层,而当前 HTTPS 的普及让客户端拥有了检测并规避中间人攻击的能力,所以要让 mitmproxy 能够正常工作,必须要让客户端(APP 或浏览器)主动信任 mitmproxy 的 SSL 证书,或忽略证书异常,★这也就意味着 APP 或浏览器是属于开发者本人的★——显而易见,这不是在做黑产,而是在做开发或测试。

特性

  • 拦截HTTP和HTTPS请求和响应并即时修改它们
  • 保存完整的HTTP对话以供以之后重发和分析
  • 重发HTTP对话的客户端
  • 重发先前记录的服务的HTTP响应
  • 反向代理模式将流量转发到指定的服务器
  • 在macOS和Linux上实现透明代理模式
  • 使用Python对HTTP流量进行脚本化修改
  • 实时生成用于拦截的SSL / TLS证书

安装

“安装 mitmproxy”这句话是有歧义的,既可以指①“安装 mitmproxy 工具”,也可以指②“安装 python 的 mitmproxy 包”,注意后者是包含前者的。即安装 python 的 mitmproxy 包除了会得到 mitmproxy 工具外,还会得到开发定制脚本所需要的包依赖,其安装过程并不复杂。

如果只是拿 mitmproxy 做一个替代 fiddler 的工具,没有什么定制化的需求(修改响应等功能),那完全只需要“安装 mitmproxy 工具”即可,去 mitmproxy 官网 上下载一个 installer 便可开箱即用,不需要提前准备好 python 开发环境。但显然,这不是这里要讨论的,我们需要的是“安装 python 的 mitmproxy 包”。

安装命令:pip install mitmproxy

完成后,系统将拥有 mitmproxy(windows中不支持)、mitmdumpmitmweb 三个命令,可以拿 mitmdump 测试一下安装是否成功,执行:

1
mitmdump --version

应当可以看到类似于这样的输出:

1
2
3
4
Mitmproxy: 4.0.1
Python: 3.6.5
OpenSSL: OpenSSL 1.1.0h 27 Mar 2018
Platform: Windows-10-10.0.16299-SP0

运行

要启动 mitmproxy 用 mitmproxymitmdumpmitmweb 这三个命令中的任意一个即可,这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同。

  • mitmproxy 命令启动后,会提供一个命令行界面,用户可以实时看到发生的请求,并通过命令过滤请求,查看请求数据。
  • mitmweb 命令启动后,会提供一个 web 界面,用户可以实时看到发生的请求,并通过 GUI 交互来过滤请求,查看请求数据。
  • mitmdump 命令启动后——没有界面,程序默默运行,所以 mitmdump 无法提供过滤请求、查看数据的功能,只能结合自定义脚本,默默工作。

由于 mitmproxy 命令的交互操作稍显繁杂且不支持 windows 系统,而我们主要的使用方式又是载入自定义脚本,并不需要交互,所以原则上说只需要 mitmdump 即可,但考虑到有交互界面可以更方便排查错误,所以这里以 mitmweb 命令为例。实际使用中可以根据情况选择任何一个命令。

mitmweb

mitmproxy 绑定了 *:8080 作为代理端口,并提供了一个 web 交互界面在 127.0.0.1:8081

现在可以测试一下代理,让 Chrome 以 mitmproxy 为代理并忽略证书错误。为了不影响平时正常使用,我们不去改 Chrome 的配置,而是通过命令行带参数起一个 Chrome。如果你不使用 Chrome 而是其他浏览器,也可以搜一下对应的启动参数是什么,应该不会有什么坑。此外示例仅以 windows 系统为例,因为使用 linux 或 mac 开发的同学应该更熟悉命令行的使用才对,应当能自行推导出在各自环境中对应的操作。

接下来关闭所有 Chrome 窗口,否则命令行启动时的附加参数将失效。打开 cmd,执行:

1
2
# 前面那一长串是 Chrome 的的安装路径,应当根据系统实际情况修改,后面两参数设置了代理地址并强制忽略掉证书错误。
$ "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=127.0.0.1:8080 --ignore-certificate-errors

▲推荐先使用mitmdump

1
2
3
$ mitmdump 
Proxy server listening at http://*:8080
# 然后windows设置 -> 代理 -> 127.0.0.1 8080 -> 保存

但是如果没安装https证书的话,是抓取不了https数据的,因此需要安装证书。

证书安装

PC

官网介绍About Certificates

使用mitmdump之后下面的文件就会被创建,位于C:\Users\mrli\.mitmproxy

Filename Contents
mitmproxy-ca.pem The certificate and the private key in PEM format.
mitmproxy-ca-cert.pem The certificate in PEM format. Use this to distribute on most non-Windows platforms.
mitmproxy-ca-cert.p12 The certificate in PKCS12 format. For use on Windows.
mitmproxy-ca-cert.cer Same file as .pem, but with an extension expected by some Android devices.

双击mitmproxy-ca-cert.p12安装,“本地计算机”->下一页->下一页->将所有的证书都放入下列存储(受信任的根证书颁布机构)然后下一页,即可完整证书安装

手机

WIFI中设置代理,ip需要在电脑上通过ipconfig查看,而port参数跟上面一样,通过mitmdump可以看到侦听的端口具体为多少,默认为8080。

证书安装:进入网址mitm.it,根据OS选择安装证书

详情见: mitmproxy抓包工具!!! 从安装到简单使用

★脚本

接下来开始开发自定义脚本,这才是 mitmproxy 真正强大的地方(可以在python代码中直接处理数据包)。

总共有两种写法:

  1. 定义一些接受指定参数的函数

编写一个 py 文件供 mitmproxy 加载,文件中定义了若干函数,这些函数实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的函数,形如:

1
2
3
4
5
6
7
8
9
10
import mitmproxy.http
from mitmproxy import ctx

num = 0


def request(flow: mitmproxy.http.HTTPFlow):
global num
num = num + 1
ctx.log.info("We've seen %d flows" % num)

第二个是,编写一个 py 文件供 mitmproxy 加载,文件定义了变量 addons,addons 是个数组,每个元素是一个类实例,这些类有若干方法,这些方法实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的方法。这些类,称为一个个 addon,比如一个叫 Counter 的 addon(插件):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import mitmproxy.http
from mitmproxy import ctx


class Counter:
def __init__(self):
self.num = 0
# 重写指定方法
def request(self, flow: mitmproxy.http.HTTPFlow):
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)


addons = [
Counter()
]

⭐️这里强烈建议使用第二种套路,直觉上就会感觉第二种套路更为先进,使用会更方便也更容易管理和拓展。况且这也是官方内置的一些 addon 的实现方式。

我们将上面第二种套路的示例代码存为 addons.py,再重新启动 mitmproxy:

1
mitmweb -s addons.py

当浏览器使用代理进行访问时,就应该能看到控制台里有类似这样的日志:

1
2
3
4
5
Web server listening at http://127.0.0.1:8081/
Loading script addons.py
Proxy server listening at http://*:8080
We've seen 1 flows
……

这就说明自定义脚本生效了。

总结:自定义脚本可以实现拦截请求,从而对请求头、请求、响应头、响应头进行修改的效果——当人操作时,就能在拦截请求进行处理的时候进行数据处理。所以可以mitmproxy+appnium或者selenium实现模拟点击+抓数据包的方式。

事件

上述当 request 时间发生时,计数器加一,并打印日志。这里对应的是 request 事件,那么mitmproxy中一共有哪些事件呢?

参考:使用 mitmproxy + python 做拦截代理

Author: Mrli

Link: https://nymrli.top/2022/04/29/mitmproxy拦截代理——PC版HttpCanary/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
2022年5月劳动节爬虫项目记录
NextPost >
使用Python转义实现前端加密算法-记录笔记
CATALOG
  1. 1. HttpCanary
  2. 2. mitmproxy
    1. 2.1. 安装
    2. 2.2. 运行
      1. 2.2.1. mitmweb
    3. 2.3. 证书安装
      1. 2.3.1. PC
      2. 2.3.2. 手机
    4. 2.4. ★脚本
    5. 2.5. 事件