|
|
hace 2 años | |
|---|---|---|
| .github | hace 2 años | |
| build | hace 3 años | |
| crates | hace 2 años | |
| docs | hace 2 años | |
| rules | hace 2 años | |
| src | hace 3 años | |
| .gitignore | hace 2 años | |
| Cargo.lock | hace 2 años | |
| Cargo.toml | hace 2 años | |
| Dockerfile | hace 3 años | |
| LICENSE | hace 2 años | |
| Makefile | hace 3 años | |
| README.md | hace 2 años | |
| README_zh.md | hace 2 años | |
| pyproject.toml | hace 2 años | |
| rust-toolchain | hace 2 años | |
| rustfmt.toml | hace 4 años |
Rule-based MITM engine. Rewriting, redirecting and rejecting on HTTP(S) requests and responses, supports JavaScript.
Due to the requirement of the MITM technique, you need to generate and trust your own root certificate.
For security reasons, please do not blindly trust any root certificate provided by strangers. You need to generate your own root certificate and private key.
Experienced users can use OpenSSL to perform the necessary operations. However, for users without experience in this area, you can use the following command to generate the required content. The generated certificate and private key will be stored in the ca directory.
good-mitm.exe genca
After using the proxy provided by Good-MITM in your browser, you can directly download the certificate by visiting http://cert.mitm.plus. This is particularly useful when providing services to other devices.
You can add the root certificate to the trust zone of your operating system or browser, depending on your needs.
Start Good-MITM and specify the rule file or directory to use.
good-mitm.exe run -r rules
Use the HTTP proxy provided by Good-MITM in your browser or operating system: http://127.0.0.1:34567.
See https://docs.mitmproxy.org/stable/howto-transparent/ for docs.
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
Rule is used to manipulate Good-MITM.
A valid rule should include the following components:
Name:Used to differentiate different rules for easier maintenance.Filter:Used to select the content to be processed from a set of requests and responses.Action:Used to perform desired actions, including redirect, reject, modification, etc.Optionally, specify the domain name that requires MITM.
- name: "Block YouTube tracking"
mitm: "*.youtube.com"
filter:
url-regex: '^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'
action: reject
Additionally, a valid rule should meet the following requirements:
Filteris used to select the requests and responses that need to be processed.
Currently, Filter includes the following types:
Note
In the current version, thedomainrelated types match thehostfield, which usually does not affect the results. If a website is using a non-standard port, the rule needs to specify the port. This behavior will be optimized in future versions.
When specifying the filter as all, it will match all requests and responses. This is typically used for performing logging actions.
- name: "log"
filter: all
action:
- log-req
- log-res
domain performs a full match against the domain name.
- name: "redirect"
filter:
domain: 'none.zu1k.com'
action:
redirect: "https://zu1k.com/"
domain-keyword performs a keyword match against the domain name.
- name: "reject CSDN"
filter:
domain-keyword: 'csdn'
action: reject
domain-prefix performs a prefix match against the domain name.
- name: "ad prefix"
filter:
domain-prefix: 'ads' // example: "ads.xxxxx.com"
action: reject
domain-suffix performs a suffix match against the domain name.
- name: "redirect"
filter:
domain-suffix: 'google.com.cn'
action:
redirect: "https://google.com"
url-regex performs a regular expression match against the entire URL.
- name: "youtube tracking"
mitm: "*.youtube.com"
filter:
url-regex: '^https?:\/\/(www|s)\.youtube\.com\/(pagead|ptracking)'
action: reject
The filters field supports both single filters and multiple filters, with the relationship between multiple filters being 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
Multiple rules with the same action can be aggregated into a single rule for easier maintenance.
Action is used to perform operations on requests or responses.
Currently, Action includes the following options:
The reject type directly returns 502 status code, which is used to reject certain requests. It can be used to block tracking and ads.
- name: "reject CSDN"
filter:
domain-keyword: 'csdn'
action: reject
The redirect type directly returns 302 status code for redirection.
- name: "youtube-1"
filter:
url-regex: '(^https?:\/\/(?!redirector)[\w-]+\.googlevideo\.com\/(?!dclk_video_ads).+)(ctier=L)(&.+)'
action:
redirect: "$1$4"
modify-request is used to modify the request. For specific modification rules, refer to the Modify section.
modify-response is used to modify the response. For specific modification rules, refer to the Modify section.
log-req is used to log the request, and log-res is used to log the response.
The actions field supports both single actions and multiple actions. When multiple actions need to be performed, an array should be used.
- name: "youtube-1"
filter:
url-regex: '(^https?:\/\/(?!redirector)[\w-]+\.googlevideo\.com\/(?!dclk_video_ads).+)(ctier=L)(&.+)'
actions:
- log-req:
- redirect: "$1$4"
Modify are used to perform modification operations, including modifying requests and modifying responses.
Based on the location of the content to be modified, the modifiers can be categorized as follows:
TextModify is mainly used for modifying text. Currently, it supports two methods:
For the plain type, the content will be directly set to the specified text.
- name: "modify response body plain"
filter:
domain: '126.com'
action:
modify-response:
body: "Hello 126.com, from Good-MITM"
Replacement supports both simple replacement and regular expression replacement.
Simple Replacement
- name: "modify response body replace"
filter:
domain-suffix: '163.com'
action:
modify-response:
body:
origin: "NetEase homepage"
new: "Good-MITM homepage"
Regular expression replacement.
- name: "modify response body regex replace"
filter:
domain-suffix: 'zu1k.com'
action:
- modify-response:
body:
re: '(\d{4})'
new: 'maybe $1'
MapModify is a modifier used to modify dictionary-type locations, such as header and cookies.
The key represents the key in the dictionary and must be specified.
The value is of type TextModify and follows the methods mentioned above.
If remove is set to true, the key-value pair will be removed.
- 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
Refer to the methods in the MapModify section.
Same as the Header modification method.
If remove is set to true, the corresponding set-cookie item will also be removed.
Refer to the methods in the TextModify section.