-
Notifications
You must be signed in to change notification settings - Fork 1
/
fitm.py
85 lines (72 loc) · 2.94 KB
/
fitm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import json
import os
from http import cookiejar
from mitmproxy import http
from mitmproxy.net.http import cookies
def domain_match(a: str, b: str) -> bool:
if cookiejar.domain_match(a, b): # type: ignore
return True
elif cookiejar.domain_match(a, b.strip(".")): # type: ignore
return True
return False
class FITM:
def __init__(self):
self.cookies = []
self.cookies_file = "/cookies/cookies.json"
self.load_cookies()
def response(self, flow: http.HTTPFlow) -> None:
if "set-cookie" in flow.response.headers:
for key, (value, attrs) in flow.response.cookies.items(multi=True):
domain = flow.request.host
port = flow.request.port
path = "/"
if "domain" in attrs:
domain = attrs["domain"]
if "path" in attrs:
path = attrs["path"]
if domain_match(flow.request.host, domain):
new_cookies = [
c for c in self.cookies
if not (
c['domain'] == domain and
c['port'] == port and
c['path'] == path and
c['key'] == key
)
]
self.cookies = new_cookies
if not cookies.is_expired(attrs):
self.cookies.append({
'domain': domain,
'port': port,
'path': path,
'key': key,
'value': value,
})
self.save_cookies()
flow.response.cookies = []
def request(self, flow: http.HTTPFlow) -> None:
if flow.request.pretty_url == "http://fitm.local/mitmproxy-ca-cert.pem":
with open("/.mitmproxy/mitmproxy-ca-cert.pem", "rb") as f:
cert = f.read()
flow.response = http.Response.make(200,cert,{"Content-Type": "application/x-x509-ca-cert"})
return
cookie_list: List[Tuple[str, str]] = []
for cookie in self.cookies:
if flow.request.path.startswith(cookie["path"]) and domain_match(flow.request.host, cookie["domain"]):
cookie_list.extend([ [cookie["key"], cookie["value"]] ])
if cookie_list:
flow.request.headers["cookie"] = cookies.format_cookie_header(cookie_list)
def save_cookies(self):
cookies_dir = os.path.dirname(self.cookies_file)
if not os.path.exists(cookies_dir):
os.makedirs(cookies_dir)
with open(self.cookies_file, "w") as f:
json.dump(self.cookies, f)
def load_cookies(self):
if os.path.exists(self.cookies_file):
with open(self.cookies_file, "r") as f:
self.cookies = json.load(f)
addons = [
FITM(),
]