3个不稳定版本

0.2.0 2022年9月13日
0.1.1 2022年9月13日
0.1.0 2022年9月12日

#34 in #重定向

MIT许可协议

54KB
1K SLoC

好的中间人

GitHub stars GitHub forks Release GitHub issues Build GitHub license Docs

中文版

基于规则的中间人引擎。支持在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。

一个有效的规则应包含以下组件

  • 名称:用于区分不同的规则,以便更容易维护。
  • 过滤器:用于从一组请求响应中选择要处理的内容。
  • 动作:用于执行所需的动作,包括重定向拒绝修改等。
  • 可选地,指定需要MITM的域名。
- name: "Block YouTube tracking"
  mitm: "*.youtube.com"
  filter:
    url-regex: '^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'
  action: reject

此外,一个有效的规则还应满足以下要求

  • 重点:每个规则应设计为执行单一任务。
  • 简单性:使用直接的方法进行处理以确保易于维护。
  • 效率:尽可能使用高效的方法,例如使用域名后缀和前缀代替复杂的正则表达式进行域名匹配。

过滤器

过滤器用于选择需要处理的请求和响应。

可用选项

目前,过滤器包括以下类型

  • 全部
  • 域名(String)
  • 域名关键词(String)
  • 域名前缀(String)
  • 域名后缀(String)
  • UrlRegex(fancy_regex::Regex)

注意
在当前版本中,与域名相关的类型与host字段匹配,通常不会影响结果。如果网站使用非标准端口,规则需要指定端口。此行为将在未来版本中优化。

全部

当指定过滤器为全部时,它将匹配所有请求和响应。这通常用于执行记录操作。

- name: "log"
  filter: all
  action:
    - log-req
    - log-res
域名

域名与域名进行完全匹配。

- name: "redirect"
  filter:
    domain: 'none.zu1k.com'
  action:
    redirect: "https://zu1k.com/"
域名关键词

域名关键词与域名进行关键词匹配。

- name: "reject CSDN"
  filter:
    domain-keyword: 'csdn'
  action: reject
域名前缀

域名前缀与域名进行前缀匹配。

- name: "ad prefix"
  filter:
    domain-prefix: 'ads' // example: "ads.xxxxx.com"
  action: reject
域名后缀

域名后缀与域名进行后缀匹配。

- 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

多个过滤器

filters字段支持单个过滤器或多重过滤器,多重过滤器之间的关系是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

可以将具有相同动作的多个规则聚合为单个规则,以便更容易维护。

动作

动作用于对请求或响应执行操作。

可用选项

目前,动作包括以下选项

  • 拒绝
  • 重定向(String)
  • 修改请求(Modify)
  • 修改响应(Modify)
  • 记录响应
  • 记录请求
拒绝

拒绝类型直接返回502状态码,用于拒绝某些请求。它可以用来阻止跟踪和广告。

- name: "reject CSDN"
  filter:
    domain-keyword: 'csdn'
  action: reject
重定向

重定向类型直接返回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 是用于修改字典类型位置的修饰符,例如 headercookies

其中的 key 代表字典中的键,必须指定。

valueTextModify 类型,并遵循上述提到的方法。

如果将 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 部分中的方法。

与头部修改方法相同。

如果将 remove 设置为 true,则也会删除相应的 set-cookie 项。

正文修改

参考 TextModify 部分中的方法。

许可证

Good-MITM © zu1k,在 MIT 许可下发布。

依赖项

~27–45MB
~789K SLoC