mitmproxy ist ein kostenloses und quelloffenes interaktives Konsolentool, eine Weboberfläche und eine Python-Bibliothek, die zum Abfangen, Überprüfen, Modifizieren und Wiederholen von HTTP/S-Verkehr entwickelt wurde. Es dient als leistungsstarker Man-in-the-Middle-Proxy für Entwickler, Sicherheitsforscher und QA-Ingenieure, die mit Webanwendungen, APIs und mobilem Datenverkehr arbeiten.
Überblick über mitmproxy
mitmproxy fungiert als Proxy-Server, der zwischen einem Client und einem Zielserver positioniert ist. Der gesamte HTTP- und HTTPS-Verkehr, der durch den Proxy fließt, kann in Echtzeit angezeigt, gefiltert und manipuliert werden. Seine Kernfunktionalität ermöglicht eine detaillierte Überprüfung von Anfrage- und Antwort-Headern, -Bodies und anderen Attributen. Die Tool-Suite umfasst:
- mitmproxy: Eine interaktive Terminaloberfläche für die Echtzeit-Verkehrsanalyse.
- mitmweb: Eine browserbasierte grafische Benutzeroberfläche, die ähnliche Funktionen wie
mitmproxybietet, aber über einen Webbrowser zugänglich ist. - mitmdump: Ein Befehlszeilentool zur programmatischen Modifikation und Protokollierung von Verkehr, geeignet für Skripting und Automatisierung.
Hauptmerkmale
SSL/TLS-Abfangen
mitmproxy generiert seine eigenen SSL/TLS-Zertifikate im laufenden Betrieb, wodurch es verschlüsselten HTTPS-Verkehr entschlüsseln und überprüfen kann. Dies erfordert, dass der Client dem mitmproxy CA-Zertifikat vertraut.
Interaktive Oberfläche
Sowohl mitmproxy als auch mitmweb bieten interaktive Umgebungen zur Anzeige und Verwaltung von Traffic-Flows. Benutzer können Flows filtern, Inhalte durchsuchen, Anfragen/Antworten bearbeiten und bestimmte Flows für eine spätere Analyse markieren.
Verkehrsmodifikation
Anfragen und Antworten können im laufenden Betrieb über die interaktive Oberfläche oder über Python-Skripte geändert werden. Dies ermöglicht das Testen von Grenzbereichen, das Einfügen von Headern, das Ändern von Daten oder das Simulieren verschiedener Serverantworten.
Replay-Funktionalität
mitmproxy unterstützt das Wiederholen aufgezeichneter Client-Anfragen an einen Server oder das Wiederholen von Server-Antworten an einen Client. Dies ist nützlich, um bestimmte Szenarien zu testen, ohne Client-Aktionen erneut auszuführen, oder um Serververhalten zu simulieren.
Skripting und Automatisierung
mitmdump bietet eine Python-API zur Entwicklung benutzerdefinierter Skripte. Diese Skripte können den Verkehr basierend auf definierter Logik programmatisch überprüfen, modifizieren, umleiten oder verwerfen, was automatisierte Tests und komplexe Verkehrsmanipulationen erleichtert.
Transparenter Proxy-Modus
mitmproxy kann im transparenten Proxy-Modus betrieben werden, bei dem Clients keine explizite Proxy-Konfiguration benötigen. Der Netzwerkverkehr wird auf der Netzwerkschicht, oft über Routerregeln oder Firewall-Konfigurationen, zu mitmproxy umgeleitet.
Installation
mitmproxy kann mit pip installiert werden:
pip install mitmproxy
Für bestimmte Betriebssysteme sind vorkompilierte Binärdateien von der offiziellen mitmproxy-Website verfügbar, oder es kann über Paketmanager wie Homebrew unter macOS installiert werden.
Grundlegende Nutzung
mitmproxy starten
Um die interaktive Konsolenoberfläche zu starten:
mitmproxy
Um die Weboberfläche zu starten:
mitmweb
Standardmäßig lauscht mitmproxy auf localhost:8080.
Client-Konfiguration
Clients müssen so konfiguriert werden, dass sie mitmproxy als ihren HTTP/S-Proxy verwenden.
Browser-Beispiel (Firefox):
1. Firefox-Einstellungen öffnen.
2. Zu den Netzwerk-Einstellungen oder Proxy-Einstellungen navigieren.
3. "Manuelle Proxy-Konfiguration" auswählen.
4. HTTP-Proxy auf 127.0.0.1 und Port auf 8080 setzen.
5. SSL-Proxy auf 127.0.0.1 und Port auf 8080 setzen.
6. Sicherstellen, dass "Diesen Proxy-Server für alle Protokolle verwenden" aktiviert ist oder andere Protokolle ähnlich konfigurieren.
Betriebssystem (macOS):
1. Zu Systemeinstellungen > Netzwerk > WLAN > Details gehen.
2. "Proxies" auswählen.
3. "Web-Proxy (HTTP)" und "Sicherer Web-Proxy (HTTPS)" aktivieren.
4. Server auf 127.0.0.1 und Port auf 8080 für beide setzen.
SSL/TLS-Zertifikat Installation
Um HTTPS-Verkehr zu entschlüsseln, müssen Clients dem mitmproxy CA-Zertifikat vertrauen.
1. Während mitmproxy läuft, navigieren Sie mit einem konfigurierten Client-Browser zu http://mitm.it.
2. Laden Sie das entsprechende CA-Zertifikat für das Betriebssystem oder den Browser des Clients herunter und installieren Sie es.
3. Für Systeme wie Android oder iOS sind spezifische Installationsschritte erforderlich, die oft das Herunterladen des Zertifikats und das manuelle Vertrauen in den Sicherheitseinstellungen beinhalten.
Erweiterte Nutzung
Anfragen und Antworten modifizieren
Über die mitmproxy- oder mitmweb-Oberfläche:
1. Einen Flow auswählen.
2. e (edit) drücken, um die Anfrage oder Antwort zu modifizieren.
3. Die zu bearbeitende Komponente auswählen (z.B. Header, Body, URL).
4. Änderungen vornehmen und q drücken, um zu speichern und den Flow fortzusetzen.
Skripting mit mitmdump
Python-Skripte können an mitmdump übergeben werden, um die Verkehrsmanipulation zu automatisieren.
Beispiel: Modifizieren eines Anfrage-Headers
modify_header.py:
from mitmproxy import http
def request(flow: http.HTTPFlow):
if "example.com" in flow.request.pretty_host:
flow.request.headers["X-Modified-By"] = "mitmproxy-script"
print(f"Modified header for {flow.request.url}")
Ausführen mit mitmdump:
mitmdump -s modify_header.py
Dieses Skript fügt Anfragen, die auf example.com abzielen, einen benutzerdefinierten Header X-Modified-By hinzu.
Beispiel: Modifizieren eines Antwort-Bodies
modify_response.py:
from mitmproxy import http
def response(flow: http.HTTPFlow):
if "api.example.com/data" in flow.request.url and flow.response.content:
# Assuming the response is JSON
data = flow.response.json()
data["status"] = "modified_by_mitmproxy"
flow.response.set_json(data)
print(f"Modified response body for {flow.request.url}")
Ausführen mit mitmdump:
mitmdump -s modify_response.py
Dieses Skript fängt Antworten von api.example.com/data ab, parst sie als JSON, modifiziert ein Feld und sendet das modifizierte JSON zurück an den Client.
Flows wiederholen
mitmproxy ermöglicht das Wiederholen von aufgezeichneten HTTP-Flows.
Client-Anfrage wiederholen:
1. In mitmproxy oder mitmweb einen Flow auswählen.
2. r drücken, um die Client-Anfrage an den Server zu wiederholen. Dies sendet die exakte Anfrage ohne Client-Interaktion erneut.
Server-Antwort wiederholen:
1. Einen Flow auswählen.
2. R (Shift+r) drücken, um die Server-Antwort an den Client zu wiederholen. Dies sendet die aufgezeichnete Server-Antwort an den Client zurück, wobei die tatsächliche Server-Interaktion umgangen wird. Nützlich zum Testen des Client-Verhaltens mit spezifischen Server-Antworten.
Anwendungsfälle
- API-Entwicklung und Debugging: Überprüfung von Anfragen und Antworten, um das API-Verhalten zu verstehen, Datenformate zu validieren und Integrationsprobleme zu debuggen.
- Sicherheitstests: Identifizierung von Schwachstellen durch Manipulation von Anfragen (z.B. Einschleusen von SQL-, XSS-Payloads), Testen von Authentifizierungsmechanismen und Analyse von verschlüsseltem Verkehr.
- Analyse mobiler Anwendungen: Abfangen und Analysieren des Verkehrs von mobilen Anwendungen, um deren Backend-Kommunikation, Datenverarbeitung und potenzielle Sicherheitslücken zu verstehen.
- Reverse Engineering: Dekonstruktion proprietärer Protokolle oder Verständnis, wie Anwendungen mit Remote-Servern interagieren, durch Beobachtung ihrer Netzwerkkommunikation.
- Automatisierte Tests: Verwendung von
mitmdump-Skripten zur Simulation spezifischer Netzwerkbedingungen, zum Mocken von API-Antworten oder zur Durchführung automatisierter Überprüfungen des Anwendungsverhaltens.
mitmproxy vs. andere Proxy-Tools
Obwohl mehrere Tools HTTP/S-Abfangen anbieten, unterscheidet sich mitmproxy durch seine Open-Source-Natur, leistungsstarke Skriptfähigkeit und flexible Schnittstellen.
| Merkmal | mitmproxy | Burp Suite Community Edition | Fiddler (Windows) |
|---|---|---|---|
| Lizenz | Open Source (MIT) | Proprietär (Kostenlose/Bezahlte Stufen) | Proprietär (Kostenlose/Bezahlte Stufen) |
| Skriptfähigkeit | Python API (mitmdump) |
Begrenzt (Erweiterungen über Java/Python/Ruby) | FiddlerScript (JScript.NET), .NET-Erweiterungen |
| Oberfläche | Konsole (mitmproxy), Web-UI (mitmweb) |
Desktop-GUI | Desktop-GUI |
| SSL/TLS | Volles Abfangen | Volles Abfangen | Volles Abfangen |
| Verkehrsmod. | Ja | Ja | Ja |
| Wiederholung | Ja (Client/Server) | Ja (Repeater) | Ja (Composer) |
| Transparenter P. | Ja | Ja | Ja |
| Zielgruppe | Entwickler, Sicherheitsforscher, Automatisierung | Penetrationstester, Web-App-Sicherheit | Entwickler, Tester, Web-App-Sicherheit |
| Plattform | Cross-Plattform (Linux, macOS, Windows) | Cross-Plattform (Java-basiert) | Windows, macOS (über Fiddler Everywhere) |
Dieser Vergleich hebt die Stärken von mitmproxy in Bezug auf Automatisierung und Open-Source-Flexibilität hervor, was es zu einer robusten Wahl für technische Benutzer macht, die eine tiefe Kontrolle über ihre Traffic-Analyse-Workflows benötigen.