3个版本
0.0.4 | 2022年9月13日 |
---|---|
0.0.3 | 2022年9月12日 |
0.0.2 | 2022年9月12日 |
#8 in #信任
6KB
129 行
好人中间人
中文版
基于规则的中间人引擎。在HTTP(S)请求和响应上重写、重定向和拒绝,支持JavaScript。
功能
- 根据TLS客户端Hello SNI扩展自动签名证书
- 支持对特定域的选性中间人
- 基于YAML格式的规则描述语言:重写、拒绝、重定向
- 灵活的规则匹配能力
- 域名前缀/后缀/精确匹配
- 正则表达式匹配
- 多个过滤规则
- 灵活的文本内容重写
- 删除/替换
- 正则表达式替换
- 基于字典的灵活内容重写
- HTTP头部重写
- Cookie重写
- 每条规则支持多个操作
- 灵活的规则匹配能力
- JavaScript脚本规则支持(程序性干预)
- 透明代理支持
- 支持单个端口上的HTTPS和HTTP多路复用
- 将CA证书安装到系统信任区域
使用方法
证书准备
由于MITM技术的需求,您需要生成并信任自己的根证书。
生成根证书
出于安全原因,请不要盲目信任陌生人提供的任何根证书。您需要生成自己的根证书和私钥。
有经验的用户可以使用OpenSSL执行必要的操作。但是,对于没有该领域经验的用户,您可以使用以下命令生成所需的内容。生成的证书和私钥将存储在ca
目录中。
good-mitm.exe genca
在您的浏览器中使用Good-MITM提供的代理后,您可以通过访问http://cert.mitm.plus直接下载证书。这特别适用于为其他设备提供服务时。
信任证书
根据您的需求,您可以将根证书添加到操作系统的信任区域或浏览器的信任区域。
代理
启动Good-MITM并指定要使用的规则文件或目录。
good-mitm.exe run -r rules
在您的浏览器或操作系统中使用Good-MITM提供的HTTP代理: http://127.0.0.1:34567
。
透明代理
有关文档,请参阅https://docs.mitmproxy.org/stable/howto-transparent/。
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo sysctl -w net.ipv4.conf.all.send_redirects=0
sudo useradd --create-home mitm
sudo -u mitm -H bash -c 'good-mitm run -r rules/log.yaml -b 0.0.0.0:34567'
sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitm --dport 80 -j REDIRECT --to-port 34567
sudo iptables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitm --dport 443 -j REDIRECT --to-port 34567
sudo ip6tables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitm --dport 80 -j REDIRECT --to-port 34567
sudo ip6tables -t nat -A OUTPUT -p tcp -m owner ! --uid-owner mitm --dport 443 -j REDIRECT --to-port 34567
规则
规则
用于操作Good-MITM。
一个有效的规则应包括以下组件
- name: "Block YouTube tracking"
mitm: "*.youtube.com"
filter:
url-regex: '^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'
action: reject
此外,一个有效的规则还应满足以下要求
- 关注点:每个规则应设计为执行单一任务。
- 简洁性:使用简单的方法进行处理,以确保易于维护。
- 效率:尽可能使用高效的方法,例如使用域名后缀和前缀而不是复杂的正则表达式进行域名匹配。
过滤器
过滤器
用于选择需要处理的请求和响应。
可用选项
目前,过滤器
包括以下类型
- 全部
- 域名(字符串)
- 域名关键字(字符串)
- 域名前缀(字符串)
- 域名后缀(字符串)
- UrlRegex(fancy_regex::Regex)
注意
在当前版本中,与域名
相关的类型与host
字段匹配,这通常不会影响结果。如果网站使用非标准端口,规则需要指定端口。此行为将在未来的版本中优化。
全部
当将过滤器指定为全部
时,它将匹配所有请求和响应。这通常用于执行日志记录操作。
- name: "log"
filter: all
action:
- log-req
- log-res
域名
domain
对域名执行完全匹配。
- name: "redirect"
filter:
domain: 'none.zu1k.com'
action:
redirect: "https://zu1k.com/"
域名关键字
domain-keyword
对域名执行关键字匹配。
- name: "reject CSDN"
filter:
domain-keyword: 'csdn'
action: reject
域名前缀
domain-prefix
对域名执行前缀匹配。
- name: "ad prefix"
filter:
domain-prefix: 'ads' // example: "ads.xxxxx.com"
action: reject
域名后缀
domain-suffix
对域名执行后缀匹配。
- name: "redirect"
filter:
domain-suffix: 'google.com.cn'
action:
redirect: "https://google.com"
UrlRegex URL
url-regex
对整个URL执行正则表达式匹配。
- name: "youtube tracking"
mitm: "*.youtube.com"
filter:
url-regex: '^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'
action: reject
多个过滤器
过滤器字段支持单个过滤器或多个过滤器,多个过滤器之间的关系为OR
。
- name: "youtube-2"
mitm:
- "*.youtube.com"
- "*.googlevideo.com"
filters:
- url-regex: '^https?:\/\/[\w-]+\.googlevideo\.com\/(?!(dclk_video_ads|videoplayback\?)).+(&oad|ctier)'
- url-regex: '^https?:\/\/(www|s)\.youtube\.com\/api\/stats\/ads'
- url-regex: '^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'
- url-regex: '^https?:\/\/\s.youtube.com/api/stats/qoe?.*adformat='
action: reject
可以将具有相同动作的多个规则聚合为单个规则,以便于维护。
操作
操作
用于对请求或响应执行操作。
可用选项
目前,操作
包括以下选项
- 拒绝
- 重定向(字符串)
- 修改请求(修改)
- 修改响应(修改)
- 记录响应
- 记录请求
拒绝
reject
类型直接返回502
状态码,用于拒绝某些请求。它可以用于阻止跟踪和广告。
- name: "reject CSDN"
filter:
domain-keyword: 'csdn'
action: reject
重定向
redirect
类型直接返回302
状态码用于重定向。
- name: "youtube-1"
filter:
url-regex: '(^https?:\/\/(?!redirector)[\w-]+\.googlevideo\.com\/(?!dclk_video_ads).+)(ctier=L)(&.+)'
action:
redirect: "$1$4"
修改请求
modify-request
用于修改请求。有关具体的修改规则,请参阅修改部分。
修改响应
modify-response
用于修改响应。有关具体的修改规则,请参阅修改部分。
日志
log-req
用于记录请求,而log-res
用于记录响应。
多个操作
actions
字段支持单个操作和多操作。当需要执行多个操作时,应使用数组。
- name: "youtube-1"
filter:
url-regex: '(^https?:\/\/(?!redirector)[\w-]+\.googlevideo\.com\/(?!dclk_video_ads).+)(ctier=L)(&.+)'
actions:
- log-req:
- redirect: "$1$4"
修改
修改用于执行修改操作,包括修改请求和修改响应。
可用选项
根据要修改的内容位置,修改器可以分为以下几类
- 头部(MapModify)
- Cookie(MapModify)
- 正文(TextModify)
TextModify
TextModify
主要用于修改文本。目前,它支持两种方法
- 直接设置文本内容。
- 简单的替换或正则表达式替换。
直接设置文本
对于纯文本类型,内容将被直接设置为指定的文本。
- name: "modify response body plain"
filter:
domain: '126.com'
action:
modify-response:
body: "Hello 126.com, from Good-MITM"
替换
替换支持简单替换和正则表达式替换。
简单替换
- name: "modify response body replace"
filter:
domain-suffix: '163.com'
action:
modify-response:
body:
origin: "NetEase homepage"
new: "Good-MITM homepage"
正则表达式替换。
- name: "modify response body regex replace"
filter:
domain-suffix: 'zu1k.com'
action:
- modify-response:
body:
re: '(\d{4})'
new: 'maybe $1'
MapModify
MapModify
是一种用于修改字典类型位置的修改器,例如header
和cookies
。
key
表示字典中的键,必须指定。
value
的类型为TextModify
,并遵循上述方法。
如果将remove
设置为true
,则将删除键值对。
- name: "modify response header"
filter:
domain: '126.com'
action:
- modify-response:
header:
key: date
value:
origin: "2022"
new: "1999"
- modify-response:
header:
key: new-header-item
value: Good-MITM
- modify-response:
header:
key: server
remove: true
头部修改
请参阅MapModify
部分中的方法。
Cookie修改
与头部修改方法相同。
如果将remove
设置为true
,则也会删除相应的set-cookie
项。
正文修改
请参阅TextModify
部分中的方法。
许可证
依赖项
~11–51MB
~872K SLoC