Unternehmen, die in ihrer Infrastruktur Web-dienste für die Außenwelt bereitstellen, sehen sich vielfältigen Bedrohungen ausgesetzt. Mit mitmproxy steht Administratoren ein Werkzeug für die interaktive Traffic-Analyse zur Verfügung. Die Entwickler des Open-Source-Tools bezeichnen es als Schweizer Taschenmesser für das Debugging, das Testen sowie für Datenschutzanalysen und Penetrationstests von HTTP(S)-Verbindungen. IT-Administrator zeigt, wie es Ihren Sicherheitswerkzeugkasten sinnvoll erweitert.
Bei dem Begriff Proxy denken die meisten wohl automatisch an einen klassischen Proxy-Server, der als Gateway das lokale mit dem globalen Netzwerk verbindet und als Intermediär die lokalen Clients vor externem Zugriff verbirgt – also Tools wie nginx, Squid oder WinGate. Angesichts des Namens von mitmproxy [1] ließe sich auch hier vermuten, dass es sich um ein solches Werkzeug handelt. Doch mitmproxy verfolgt einen anderen Ansatz: Es ist auf die Analyse des HTTP(S)-Traffics spezialisiert. Ähnlich wie Wireshark ist die Software eher mit einem Sniffer vergleichbar, der den Datenverkehr zwischen HTTP-Client und -Server aufzeichnet und die Analyse ermöglicht.
Gleichwohl deutet "mitm" auf seine eigentliche Funktionalität hin: mitmproxy fungiert als Man-in-the-Middle-Proxy (MITM), der den HTTP- und HTTPS- Datenverkehr abfängt und modifiziert. Dabei können Sie die HTTP-Konversation für die spätere Analyse aufzeichnen. Allerdings beschränkt sich das Tool auf den protokollspezifischen Datenaustausch. Im Unterschied zu Wireshark und anderen Sniffern werden sonstige Daten nicht protokolliert.
mitmproxy kann auch als Reverse-Proxy agieren und den Datenverkehr an einen spezifischen Server weiterleiten. Ebenso ist die skriptbasierte Manipulation des HTTP-Traffics eine Option; hierfür greifen Sie zu einfachen Python-Skripten. Über das Python-API ist zudem das Zusammenspiel mit Drittanwendungen zur automatischen Manipulation oder zur Visualisierung möglich. mitmproxy kann zudem SSL-/TLS-Zertifikate zum Abfangen generieren.
Bei dem Begriff Proxy denken die meisten wohl automatisch an einen klassischen Proxy-Server, der als Gateway das lokale mit dem globalen Netzwerk verbindet und als Intermediär die lokalen Clients vor externem Zugriff verbirgt – also Tools wie nginx, Squid oder WinGate. Angesichts des Namens von mitmproxy [1] ließe sich auch hier vermuten, dass es sich um ein solches Werkzeug handelt. Doch mitmproxy verfolgt einen anderen Ansatz: Es ist auf die Analyse des HTTP(S)-Traffics spezialisiert. Ähnlich wie Wireshark ist die Software eher mit einem Sniffer vergleichbar, der den Datenverkehr zwischen HTTP-Client und -Server aufzeichnet und die Analyse ermöglicht.
Gleichwohl deutet "mitm" auf seine eigentliche Funktionalität hin: mitmproxy fungiert als Man-in-the-Middle-Proxy (MITM), der den HTTP- und HTTPS- Datenverkehr abfängt und modifiziert. Dabei können Sie die HTTP-Konversation für die spätere Analyse aufzeichnen. Allerdings beschränkt sich das Tool auf den protokollspezifischen Datenaustausch. Im Unterschied zu Wireshark und anderen Sniffern werden sonstige Daten nicht protokolliert.
mitmproxy kann auch als Reverse-Proxy agieren und den Datenverkehr an einen spezifischen Server weiterleiten. Ebenso ist die skriptbasierte Manipulation des HTTP-Traffics eine Option; hierfür greifen Sie zu einfachen Python-Skripten. Über das Python-API ist zudem das Zusammenspiel mit Drittanwendungen zur automatischen Manipulation oder zur Visualisierung möglich. mitmproxy kann zudem SSL-/TLS-Zertifikate zum Abfangen generieren.
Grundprinzip von mitmproxy
Ein grundlegendes Verständnis für die Funktionsweise von mitmproxy ist unerlässlich, um effektiv mit der Umgebung zu arbeiten. Dazu betrachten wir den HTTPS-geschützten Zugriff eines Clients auf einen Webserver. Der Client nutzt dazu folgenden HTTP-Befehl:
CONNECT server.de:443 HTTP/1.1
Ein klassischer Proxy-Server kann den SSL-/TLS-verschlüsselten Datenverkehr nicht manipulieren, sondern reicht die Anfrage lediglich an das Zielsystem weiter; er macht damit seinem Namen als Bevollmächtigter alle Ehre. Beim Einsatz des HTTPS-Proxys wird mitmproxy zwischen Client und Server platziert. Dabei folgt das Tool dem klassischen Man-in-the-Middle-Ansatz: Er gibt sich dem Client gegenüber als Server und dem Server gegenüber als Client aus. Dabei entschlüsselt mitmproxy den Datenverkehr von beiden Seiten.
Die Herausforderung für mitmproxy besteht darin, dass das System der Zertifizierungsstelle genau diesen Angriffstyp verhindern soll, indem es einer vertrauenswürdigen dritten Partei erlaubt, die Zertifikate eines Servers kryptografisch zu signieren, um ihre Legitimität zu überprüfen. Kommt es zu Unstimmigkeiten, wird die Verbindung unterbrochen. Daher gestaltet sich die Analyse von gesicherten Verbindungen oftmals schwierig.
Die mitmproxy-Entwickler lösen dieses Problem mit einem Trick: Die Software agiert selbst als eine vertrauenswürdige Zertifizierungsstelle. Hierfür verfügt mitmproxy über eine vollständige CA-Implementierung, die sämtliche notwendigen Zertifikate on the fly generiert. Damit der Client diesen Zertifikaten auch vertraut, ist eine manuelle Registrierung als vertrauenswürdige Zertifizierungsstelle notwendig.
mitmproxy muss weitere Herausforderungen meistern, damit sich die Umgebung unbemerkt zwischen Client und Server platzieren kann. So muss der Domänennamen der Gegenstelle ermittelt werden, damit sich dieser im Abfangzertifikat nutzen lässt. Dazu bedient sich mitmproxy des Upstream Certificate Sniffing. Das Tool extrahiert außerdem den CN (Common Name) aus dem Upstream-Zertifikat und die SANs (Subject Alternative Name). Außerdem umgeht es geschickt die Übergabe der SNI (Server Name Indication).
Bei HTTPS-Verbindungen mit zwischengeschaltetem mitmproxy laufen folgende Prozesse ab (Bild 1):
1. Der Client stellt eine Verbindung zu mitmproxy her und erzeugt eine HTTP-"CONNECT"-Anfrage.
2. mitmproxy reagiert mit einem "200 Connection Established" und simuliert damit den Aufbau einer "CONNECT"-Pipe.
3. Der Client initiiert in der Annahme, dass es sich um den gewünschten Server handelt, eine SSL-/TLS-Verbindung. Dabei gibt er die SNI für den Hostnamen an.
4. mitmproxy stellt die Verbindung zum Server her und baut eine gesicherte Verbindung unter Verwendung des vom Client angegebenen SNI-Hostnamens auf.
5. Das Zielsystem reagiert mit dem passenden Zertifikat, das die CN- und SAN-Werte enthält, die zur Erstellung des Abhörzertifikats benötigt werden.
6. mitmproxy generiert das Abfangzertifikat und setzt den in Schritt 3 unterbrochenen Client-SSL-/TLS-Handshake fort.
7. Der Client sendet die Anfrage über die aufgebaute Verbindung.
8. mitmproxy leitet die Anfrage über die in Schritt 4 initiierte Verbindung an den Server weiter.
Diese vereinfachte Prozessabfolge zeigt, wie anspruchsvoll die von mitmproxy durchgeführten Aktionen sind, um sich unbemerkt zwischen Client und Server zu platzieren.
Bild 1: mitmproxy erlaubt durch seine Man-in-the-Middle-Position das Abhören und die Manipulation des Web-Traffics.
Erste Schritte
mitmproxy ist für Linux, macOS und Windows verfügbar. Für Linux und Windows stehen Standalone-Binaries zur Verfügung. Für verschiedene Linux-Distributionen gibt es distributionsspezifische Pakete, beispielsweise für Arch Linux, Debian, Ubuntu und Kali Linux. Nach der Windows-Installation werden "mitmproxy", "mitmdump" und "mitmweb" zum "PATH" hinzugefügt und lassen sich von der Kommandozeile aus aufrufen. Grundsätzlich laufen die Linux-Pakete auch unter WSL (Windows Subsystem for Linux).
Wenn Sie den Einsatz eines Docker-Containers präferieren, finden Sie diesen unter [2]. Um das Terminal-Interface vom mitmproxy zu starten, bedienen Sie sich folgenden Befehls:
docker run --rm -it -v ~/.mitmproxy:/home/mitmproxy/.mitmproxy -p 8080:8080 mitmproxy/mitmproxy
Damit der Web-Traffic des Clients über mitmproxy läuft, müssen Sie bei einer lokalen Installation der Software die systemweiten Einstellungen anpassen und dort den Proxy "127.0.0.1:8080" eintragen. Grundsätzlich ist auch die Nutzung einer PAC-Datei (Proxy Auto-Config) möglich, um die netzwerkweite Konfiguration zu vereinfachen. Unter [3] stehen die dazu notwendigen Dateien bereit.
Wenn Sie nach der Proxy-Konfiguration versuchen, mit dem Webbrowser auf das Internet zuzugreifen, schlägt dieser Versuch fehl. Ihr Browser gibt die Fehlermeldung "Ihre Verbindung ist nicht privat" aus. Die Ursache hierfür ist einfach: Der Browser betrachtet den zwischengeschalteten Proxy als nicht vertrauenswürdig, weil er das mitmproxy-Zertifikat als ungültig bewertet. Bei aktiviertem Proxy-Server beziehen Sie das notwendige Zertifikat über die Website "mitm.it". Dort stehen gültige Zertifikate für alle unterstützten Plattformen zur Verfügung. Unter Windows greifen Sie zum Zertifikat-Importassistenten, um das Zertifikat zu nutzen. Unter Linux führen Sie den Import am einfachsten mit folgendem Befehl aus:
Für alle anderen Plattformen stehen über [4] Installationsanleitungen zur Verfügung. In der Zertifikatverwaltung des verwendeten Betriebssystems können Sie anschließend die Details einsehen und gegebenenfalls bearbeiten.
Bild 2: Auf der Konsole können Sie die Kommunikation des Clients verfolgen und interaktiv in den Datenaustausch eingreifen.
Nutzung der Web-GUI
In der mitmproxy-Konsole können Sie nun die exakten HTTP-Kommandos verfolgen. Doch gestaltet sich die Analyse dieser Befehle nicht sonderlich benutzerfreundlich. Hier kommt das Webinterface von mitmproxy ins Spiel. Darauf greifen Sie standardmäßig über die URL "http:// 127.0.0.1:8081" zu. In der Web-GUI präsentiert Ihnen mitmproxy die chronologische Abfolge der ausgetauschten HTTP-Kommandos. Über diese Schnittstelle installieren Sie mit dem Befehl "File / Install Certificates" das betreffende Zertifikat auf dem Client-System.
Über die Registerkarte "Options" stehen Ihnen verschiedene Anpassungsmöglichkeiten des Webinterfaces zur Verfügung. Primär geht es um die Darstellung, Sie können aber auch mit Blocklisten arbeiten und spezifische Requests mit einer leeren Response-Nachricht beantworten. mitmproxy kennt neben dem Standard "Regular" folgende Modi:
- Transparent
- WireGuard
- Reverse Proxy
- Upstream Proxy
- SOCKS Proxy
- DNS Server
Die Wahl des Modus ist davon abhängig, ob Sie den Traffic eines Clients oder den zu einem einzelnen Server überwachen wollen. Möchten Sie den Verkehr untersuchen, der aus dem Internet auf einen eigenen Webserver trifft, wählen Sie die Variante "Reverse Proxy". In diesem Fall agiert mitmproxy wie ein "normaler" Server, der die Requests aus dem Internet beziehungsweise von einem Analyse-Client entgegennimmt und an das eigentliche Zielsystem übergibt.
Um die umfangreiche Darstellung einzuschränken, wechseln Sie zur Registerkarte "Start" und geben einen Suchbegriff ein. Auf diesem Weg schränken Sie die Darstellung beispielsweise auf bestimmte Quellen, Services oder Dateitypen ein. Das Schöne dabei: Wenn Sie die Web-GUI geöffnet hatten und in einem zweiten Browserfenster auf den Server zugreifen, können Sie in mitmproxy den Kommandos in Echtzeit folgen.
Sowohl auf der Konsolenebene als auch über das Webinterface lassen sich die einzelnen Requests und Responses unter die Lupe nehmen. Deutlich komfortabler geht es über die Webschnittstelle. Hier können Sie die Aufzeichnung erneut abspielen. Sie können zudem Requests mit einem Klick auf "Edit" bearbeiten und erst dann an den Ziel-Server weiterleiten. Weiterhin stellt es kein Problem dar, auf der Konsolenebene Filter anzuwenden, den Traffic abzufangen und die Auszeichnung lokal zu sichern.
Angesichts der enormen Datenmengen, die mitmproxy sichtbar macht, ist es nicht immer einfach, den Überblick über die relevanten Inhalte zu behalten. Hier erweist sich die "Hightlight"-Funktion als hilfreich. Mit einem Klick auf das zugehörige Symbol öffnen Sie das Auswahlmenü, um spezifische Inhalte zu markieren. Die Auswahl können Sie auf Methoden, Content-Types oder mit Hilfe eines regulären Ausdrucks begrenzen.
Bild 3: Die Analyse und Manipulation des Web-Traffics gestaltet sich über das Webinterface komfortabel.
Fortgeschrittene Analysetechniken
Zu den Besonderheiten von mitmproxy zählt die Funktion "Interception". Sie erlaubt es, Requests abzufangen und zu bearbeiten. Grundsätzlich ist das Abfangen nicht erwünscht, da es den Surf-Vorgang unterbricht. Damit Sie nicht den gesamten Datentransfer zum Erliegen bringen, nutzt mitmproxy einen anderen Ansatz und greift Requests selektiv ab. Dies kann über die Web-GUI oder über die Konsole mit dem Flussfilter "~u <regex>" erfolgen. Verwenden Sie zusätzlich die Option "~q", damit die Responses nicht abgefangen werden. Um mehrere Filteroptionen miteinander zu kombinieren, nutzen Sie das "&"-Zeichen.
Nachdem Sie einen Request unterbrochen haben, geht es im nächsten Schritt darum, diesen sinnvoll zu modifizieren. Wenn Sie mit der Web-GUI arbeiten, aktivieren Sie zunächst den Editiermodus und wählen den Eintrag der Anfrage aus, die Sie bearbeiten wollen. Denkbar ist beispielsweise die Manipulation der "Path"- oder der "user-agent"-Option.
Wollen Sie die Änderungen auf der Konsolenebene vornehmen, aktivieren Sie den Editiermodus mit der Taste "E"; in der Web-GUI öffnen Sie die Registerkarte "Request" und navigieren zu dem betreffenden Eintrag. Nehmen Sie die Änderungen vor und verlassen Sie den Editiermodus. Um den unterbrochenen Datenfluss fortzusetzen, betätigen Sie in der Konsole die Taste "A"; in der GUI klicken Sie auf "Resume".
Eine weitere Besonderheit von mitmproxy: Sie können frühere Datenflüsse wiederholt ablaufen lassen. Das Tool unterstützt grundsätzlich zwei Arten von Replay-Requests:
- Clientseitiges Replay: Bei diesem Typus übermitteln Sie frühere Clientanfragen erneut an den Server.
- Serverseitiges Replay: Hier geben Sie die Antworten des Servers von zuvor aufgezeichneten Anfragen wieder.
Sowohl über die Konsole als auch über die Web-GUI können Sie beide Varianten ausführen. Zunächst wählen Sie mithilfe der Filterfunktion die gewünschten Requests aus. Um diese zu wiederholen, betätigen Sie auf der Konsole die Taste "r"; in der GUI klicken Sie auf "Replay". Auch hier können Sie wieder Änderungen an der Anfrage vornehmen.
Dank seiner modularen Architektur können Sie mitmproxy funktional erweitern und dabei auf die Entwicklungsarbeit einer aktiven Community zurückgreifen. Die Tabelle fasst die interessantesten Erweiterungen zusammen. So lassen sich etwa mit dem Skript "log-events.py" Warnungen generieren. Die Ausführung erfolgt auf der Konsolenebene.
Beliebte mitmproxy-Erweiterungen
Skript
Kurzbeschreibung
log-events.py
Schreibt Nachrichten in das Ereignisprotokoll on mitmproxy.
http-add-header.py
Fügt einen HTTP-Header zu jeder Antwort hinzu.
internet-in-mirror.py
Spiegelt alle Webseiten.
commands-simple.py
Fügt einen benutzerdefinierten Befehl zur Kommandozeile hinzu.
shutdown.py
Erlaubt das Herunterfahren und Beenden einer mitmproxy-Instanz.
duplicate-modifyreplay.py
Dieses Skript nimmt eingehende HTTP-Anfragen entgegen und spielt sie mit geänderten Parametern erneut ab.
tcp-simple.py
Verarbeitet einzelne Nachrichten von einer TCP-Verbindung.
websocket-injectmessage.py
Injiziert eine WebSocket-Nachricht in eine laufende Verbindung
Domains ausschließen
Bei den Traffic-Analysen kann es durchaus Sinn ergeben, dass Sie bestimmte Domains ignorieren. Dafür gibt es im Wesentlichen zwei Gründe. Zum einen kann ein Teil des Datenverkehrs durch Certificate Pinning geschützt sein, zum anderen kann sich ein Teil des Traffics schlicht außerhalb Ihres Interessenbereichs bewegen.
Im ersten Fall funktionieren beispielsweise Windows-Updates oder Zugriffe auf Apples App Store nicht, wenn Sie mitmproxy zwischengeschaltet haben. Wenn bestimmte Inhalte nicht für Sie relevant sind, blenden Sie diese einfach mit der "view_filter"-Option aus.
Um Hosts von der Überwachung auszuschließen, greifen Sie zur Option "ignore_hosts" und spezifizieren diese mit einem regulären Ausdruck im Format "Host:Port-Zeichenkette".
Der Kommandozeilen-Alias lautet dementsprechend "--ignore-hosts regex". Der vollständige Befehl lautet demnach:
mitmproxy –ignore-hosts '^beispiel\.de:443$'
Wollen Sie die Aufzeichnung auf spezifische Domains begrenzen, verwenden Sie die Option "--allow-hosts".
Ein weiteres Feature von mitmproxy: Die Umgebung verfügt über eine modulare Architektur und lässt sich daher funktional mit Hilfe von Python-Skripts erweitern. Ein wesentlicher Teil der Funktionalität basiert bereits auf integrierten Add-ons. Die Struktur und der Aufbau dieser Skripte sind so einfach gehalten, dass deren Anpassung beziehungsweise die Entwicklung eigener Skripts leicht umzusetzen ist. Über die GitHub-Projekt-Site [5] stehen derzeit fast 30 Skripte zum Download bereit.
Fazit
mitmproxy ist ein spannendes Werkzeug für die Aufzeichnung, die Analyse und die Manipulation von HTTP-Traffic. Als wahrer Spezialist erlaubt der HTTP-Proxy insbesondere die Prüfung von Web-Requests und -Responses. Damit ist es nicht für Administratoren, sondern auch für Entwickler und Penetration-Tester ein wertvolles Instrument.