Package: good-mitm
Good Man in the Middle利用MITM技术实现请求和返回的重写、重定向、阻断等操作功能基于 TLS ClientHello 的自动证书签署支持选择性 MITM基于 YAML 格式的规则描述语言：重写/阻断/重定向灵活的规则匹配器域名前缀/后缀/全匹配正则匹配多筛选器规则灵活的文本内容改写抹除/替换正则替换灵活的字典类型内容改写HTTP Header 改写Cookie 改写支持单条规则多个行为支持 JavaScript 脚本规则 (编程介入)支持透明代理透明代理 HTTPS 和 HTTP 复用单端口支持自动安装 CA 证书到系统信任区使用方法证书准备由于MITM技术的需要，需要你生成并信任自己的根证书生成根证书出于安全考虑，请不要随意信任任何陌生人提供的根证书，你需要自己生成属于自己的根证书和私钥经验丰富的用户可以自行使用OpenSSL进行相关操作，考虑到没有相关经验的用户，可以使用以下命令直接生成相关内容，生成的证书和私钥将存储在ca目录下good-mitm.exegenca在浏览器使用了Good-MITM提供的代理后，通过访问http://cert.mitm.plus可以直接下载证书，这在给其他设备提供服务时非常有用信任证书你可以将根证书添加到操作系统或者浏览器的信任区中，根据你的需要自行选择代理启动Good-MITM，指定使用的规则文件或目录good-mitm.exerun-rrules在浏览器或操作系统中使用Good-MITM提供的http代理：http://127.0.0.1:34567透明代理Seehttps://docs.mitmproxy.org/stable/howto-transparent/for docs.sudosysctl-wnet.ipv4.ip_forward=1sudosysctl-wnet.ipv6.conf.all.forwarding=1sudosysctl-wnet.ipv4.conf.all.send_redirects=0sudouseradd--create-homemitm
sudo-umitm-Hbash-c'good-mitm run -r rules/log.yaml -b 0.0.0.0:34567'sudoiptables-tnat-AOUTPUT-ptcp-mowner!--uid-ownermitm--dport80-jREDIRECT--to-port34567sudoiptables-tnat-AOUTPUT-ptcp-mowner!--uid-ownermitm--dport443-jREDIRECT--to-port34567sudoip6tables-tnat-AOUTPUT-ptcp-mowner!--uid-ownermitm--dport80-jREDIRECT--to-port34567sudoip6tables-tnat-AOUTPUT-ptcp-mowner!--uid-ownermitm--dport443-jREDIRECT--to-port34567Rule 规则Rule用来操控 Good-MITM一条合格的规则需要包含以下内容:规则名：用来区分不同的规则，便与维护筛选器：用于从众多请求和返回中筛选出需要处理的内容动作：用于执行想要的行为，包括重定向、阻断、修改等必要时指定需要MITM的域名-name:"屏蔽Yutube追踪"mitm:"*.youtube.com"filter:url-regex:'^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'action:reject同时一条合格的规则需要符合以下要求:专注：一条规则只用来做一件事简单：使用简单的方法来处理，便与维护高效：尽量使用高效的方法，比如使用域名后缀和域名前缀来替换域名正则表达式Filter 筛选器Filter用来筛选需要处理的请求和返回候选项Filter目前包含以下类型：AllDomain(String)DomainKeyword(String)DomainPrefix(String)DomainSuffix(String)UrlRegex(fancy_regex::Regex)注意当前版本中，domain相关类型匹配的是host，通常情况下不会影响结果在网站使用非常规端口时，规则需要注明端口后续版本将会对此行为进行优化All 全部指定筛选器为all时将会命中全部请求和返回，通常用来执行日志记录行为-name:"log"filter:allaction:-log-req-log-resDomain 域名domain对域名进行全量匹配-name:"redirect"filter:domain:'none.zu1k.com'action:redirect:"https://zu1k.com/"DomainKeyword 域名关键词domain-keyword对域名进行关键词匹配-name:"rejectCSDN"filter:domain-keyword:'csdn'action:rejectDomainPrefix 域名前缀domain-prefix对域名进行前缀匹配-name:"adprefix"filter:domain-prefix:'ads'// example:"ads.xxxxx.com"action:rejectDomainSuffix 域名后缀domain-suffix对域名进行后缀匹配-name:"redirect"filter:domain-suffix:'google.com.cn'action:redirect:"https://google.com"UrlRegex Url正则url-regex对整个url进行正则匹配-name:"youtube追踪"mitm:"*.youtube.com"filter:url-regex:'^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'action:reject多个筛选器filters字段支持单个筛选器和多个筛选器，多个筛选器之间的关系为或-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具有相同动作的多个规则可聚合为一个规则以便于维护Action 动作Action用来对请求或者返回进行操作候选项Action目前包含以下选项：RejectRedirect(String)ModifyRequest(Modify)ModifyResponse(Modify)LogResLogReqReject 拒绝reject类型直接返回502，用来拒绝某些请求，可以用来拒绝追踪和广告-name:"rejectCSDN"filter:domain-keyword:'csdn'action:rejectRedirect 重定向redirect类型直接返回302重定向-name:"youtube-1"filter:url-regex:'(^https?:\/\/(?!redirector)[\w-]+\.googlevideo\.com\/(?!dclk_video_ads).+)(ctier=L)(&.+)'action:redirect:"$1$4"ModifyRequest 修改请求modify-request用来修改请求，具体修改规则见修改器ModifyResponse 修改返回modify-response用来修改返回，具体修改规则见修改器Log 记录日志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"修改器修改器用来执行修改操作，包括修改请求和修改返回候选项根据需要修改的内容的位置，修改器分为以下几类：Header(MapModify)Cookie(MapModify)Body(TextModify)TextModify 文本修改器TextModify主要对文本就行修改，目前支持两种方式：直接设置文本内容普通替换或者正则替换直接设置对于plain类型直接设置，内容将被直接重置为指定文本-name:"modifyresponsebodyplain"filter:domain:'126.com'action:modify-response:body:"Hello126.com,fromGood-MITM"替换替换支持简单替换和正则替换两种简单替换-name:"modifyresponsebodyreplace"filter:domain-suffix:'163.com'action:modify-response:body:origin:"网易首页"new:"Good-MITM首页"正则替换-name:"modifyresponsebodyregexreplace"filter:domain-suffix:'zu1k.com'action:-modify-response:body:re:'(\d{4})'new:'maybe$1'MapModify 字典修改器MapModify字典修改器主要针对字典类型的位置进行修改，例如header和cookieskey代表字典的键，必须指定value是TextModify类型，按照上文方法书写如果指定remove为true，则会删除该键值对-name:"modifyresponseheader"filter:domain:'126.com'action:-modify-response:header:key:datevalue:origin:"2022"new:"1999"-modify-response:header:key:new-header-itemvalue:Good-MITM-modify-response:header:key:serverremove:trueHeader 修改见MapModify部分方法Cookie 修改与 Header 修改方法一致如果指定remove为true还会同时对应的移除set-cookie项Body修改见TextModify部分LicenseGood-MITM©zu1k, Released under theMITLicense.