Mitmproxy ist ein HTTP-Proxyserver zum Durchsuchen und Manipulieren von HTTP-Anforderungen in der Art von Man in the Middle Attack. Durch die Installation des von mitmproxy generierten Zertifikats auf dem Terminal kann die HTTPS-Kommunikation auf dieselbe Weise behandelt werden.
Einzelheiten zur Installation von Mitmproxy usw. finden Sie in den folgenden Artikeln.
Anfragen können von mitmproxy durch Schreiben eines Python-Skripts manipuliert werden. Dieses Mal werden wir das Verfahren unter der Annahme der folgenden Fälle erklären.
Möglicherweise kann das Problem gelöst werden, indem der Aufbau und die Verteilung für die Entwicklungsumgebung aus dem Funktionszweig heraus automatisiert werden. Es kann jedoch vorkommen, dass eine solche Umgebung nicht bereit ist. Selbst wenn es eine solche Umgebung gibt und Sie beim mehrmaligen Wechseln zwischen mehreren Umgebungen überprüfen möchten, ist es möglicherweise einfacher, die Anforderung zu manipulieren, als mehrere Apps neu zu starten. ..
Weitere Informationen finden Sie unter Abfangen oder Manipulieren der SSL-Kommunikation des tatsächlichen iOS-Geräts durch einen Proxy.
Dieses Mal möchte ich "Ich möchte das Anforderungsziel der in der Anwendung erstellten Web-API in die Entwicklungsumgebung ändern". In diesem Fall müssen Sie zwei Dinge tun:
Das folgende Python-Programm führt dies aus. Ändern Sie den Hostnamen usw. nach Bedarf.
replace_host.py
def request(context, flow):
#Ursprünglicher Hostname(Produktionsumfeld)
original = "example.com"
#Hostname nach dem Austausch(Entwicklungsumgebung)
replace = "dev.example.com"
if original in flow.request.host:
if original in flow.request.headers["Host"]:
#Namen des Zielhosts anfordern
flow.request.host = replace
#Host im HTTP-Anforderungsheader
flow.request.headers["Host"] = [replace]
Der Anforderungsheader kann auf andere Weise als Host manipuliert werden.
Es ist wichtig zu beachten, dass flow.request.headers
den Headernamen als Schlüssel verwendet und der Wert ein * String-Array * enthält.
Im HTTP-Header können mehrere Werte mit demselben Schlüssel festgelegt werden.
(Set-Cookie etc.)
Starten Sie beim Laden des vorbereiteten Python-Skripts.
$ mitmproxy -p 8080 -s replace_host.py
Jetzt müssen Sie nur noch Ihre App mit diesem Proxy debuggen.
Im vorherigen Programm wurden Manipulationen unter der Bedingung durchgeführt, dass "nur Anforderungen an einen bestimmten Host gestellt werden". Wenn Sie außerdem die Bedingung "in einem bestimmten Pfad" hinzufügen, ist dies wie folgt.
replace_host.py
def request(context, flow):
#Ursprünglicher Hostname(Produktionsumfeld)
original = "example.com"
#Hostname nach dem Austausch(Entwicklungsumgebung)
replace = "dev.example.com"
#Pfad zum Manipulieren
target_path = '/api/foo'
if original in flow.request.host:
if original in flow.request.headers["Host"]:
#Nur in einem bestimmten Pfad
if flow.request.path == target_path:
#Namen des Zielhosts anfordern
flow.request.host = replace
#Host im HTTP-Anforderungsheader
flow.request.headers["Host"] = [replace]
Dies kann erreicht werden, indem der Wert von "flow.request.path" überprüft wird.
Hier wird die genaue Übereinstimmung mit ==
überprüft, aber verschiedene Anwendungen, z. B. das Targeting aller Elemente in einem bestimmten Verzeichnis mit einem regulären Ausdruck, sind möglich.
Ich dachte, es wäre praktisch, wenn die offizielle Dokumentation von Mitmproxy eine Sammlung von Rezepten hier hätte.
Recommended Posts