Docker-Sniffing leicht gemacht
Eine Anwendung in einem Docker-Container soll verschlüsselt kommunizieren und es muss sichergestellt werden, dass die Verschlüsselung erfolgreich ist. Wie gehen Sie vor?
In einem vergangenen Projekt war genau das mein Auftrag. Ich sollte in einem unserer Projekte einen Penetrationstest durchführen und musste dafür die verschlüsselte Kommunikation eines Docker-Containers auf die Probe stellen. Auch abseits von einem Penetrationstest kann es bei der Entwicklung von Software hilfreich sein, die verschlüsselte Kommunikation einer in Docker laufenden Anwendung zu überprüfen.
Was Penetrationstests mit Docker zu tun haben (können)
Dass Software sicher sein und ohne Ausfälle funktionieren sollte, liegt auf der Hand. Wenig überraschend ist Cybersecurity ein elementarer Bestandteil der heutigen Softwareentwicklung.
Beim Thema Cybersecurity sind Penetrationstests nicht fern. Bei einem Penetrationstest werden Hacker-Angriffe simuliert, indem ein System gezielt von außerhalb angegriffen und belastet wird, um Schwachstellen und Sicherheitsprobleme ausfindig zu machen. [1] Dazu läuft das System, das getestet wird (kurz SUT: „System under Test“), auf einer speziell vorbereiteten Testumgebung. Diese Umgebung muss isoliert sein, damit im Rahmen des Penetrationstests durchgeführte Angriffe keinen Schaden außerhalb des Systems anrichten können.
In meinem Fall umfasste das SUT unter anderem die Kommunikation mit einem Server über TLS TCP/IP. Ein Ziel des Penetrationstests war es, durch Sniffing-Angriffe herauszufinden, ob die Kommunikation des Servers erfolgreich verschlüsselt wird.
Bei einem Sniffing-Angriff wird versucht, den Inhalt der Kommunikation zweier Kommunikationsparteien mitzulesen. Durch Verschlüsselung der Kommunikation lassen sich Sniffing-Angriffe zwar nicht verhindern, jedoch sind diese dann erfolglos, da übermittelte Informationen nur vom Empfänger verstanden werden und Angreifer nichts mit ihnen anfangen könnnen.
Auf der Produktivumgebung sollte der Server im Web gehostet werden. Um die Isolierung meines SUT nicht auf das Web ausweiten zu müssen, entschied ich mich, den Server nur lokal zu hosten. An dieser Stelle kommt Docker ins Spiel. [2] Docker ermöglicht die plattformunabhängige und isolierte Bereitstellung von Applikationen mit geringem Aufwand. Eine Applikation wird in einem Docker-Container ausgeführt, der als Umgebung für die Applikation fungiert.
Docker spielt bei der Entwicklung von Software mittlerweile eine große Rolle, weil die verschiedensten Applikationen beim Entwickeln lokal individuell gestartet und verwaltet werden können. Da das Entwicklungsteam den zu testenden Server ohnehin in Docker hostete, entschied ich mich ebenfalls dazu, den Server in einem Docker-Container zu hosten, sodass mein SUT keinen im Web gehosteten Server umfasste.
Der Werkzeugkasten für die Docker-Traffic-Analyse
Jetzt brauchte ich eine Möglichkeit, den Netzwerk-Verkehr des Docker-Containers mitzulesen. Eine kurze Recherche ergab, dass sich das mit einer Kombination aus Wireshark [3] und Edgeshark [4] und dem zugehörigen cshargextcap [5] umsetzen lässt.
Wireshark wird verwendet, um die Netzwerk-Kommunikation zwischen zwei Kommunikationsparteien zu analysieren. Zusätzlich können verschiedene sogenannte „Extcaps“ („Capturing Extension“) in Wireshark integriert werden. Das sind externe Mini-Programme, die die Funktionalität von Wireshark ergänzen.
Edgeshark ist ein Tool zur Analyse von Docker-Containern. Es läuft selbst in zwei Docker-Containern und bietet eine Web-Oberfläche, auf der verschiedene Daten über andere existierende Docker-Container angezeigt werden.
cshargextcap („Containershark Extcap Plugin for Wireshark“) ist ein Extcap, das die Zusammenarbeit von Wireshark und Edgeshark ermöglicht.
Lassen Sie mich das Zusammenspiel dieser drei Tools hier demonstrieren. Dafür verändere ich mein SUT ein wenig.
Zwei kleine Python-Skripte kommen als Clients zum Einsatz: Ein TLS-TCP-Client, der verschlüsselt über TLS TCP/IP mit einem Server kommuniziert, und einen TCP-Client, der unverschlüsselt über TCP/IP kommuniziert. Entsprechend dazu hoste ich zwei Echo-Server in Docker, die eingehende Nachrichten wie ein Echo wieder zurücksenden: Einen TLS-TCP-Server und einen TCP-Server. So habe ich einen unverschlüsselten und einen verschlüsselten TCP-Kanal. Die übermittelten Informationen von beiden Kanälen können von Edgeshark, das ebenfalls in Docker läuft, abgehört und an cshargextcap übermittelt werden. Meine Testumgebung mit dem SUT und den drei Testing-Tools sieht nun wie folgt aus:
Abbildung 1: Werkzeugkasten der Docker-Traffic-Analyse
Netzwerk-Sniffing in der Praxis
Zurück zu den Tools. Edgeshark lässt sich unter Windows mit nur einem Command installieren, Wireshark und cshargextcap mit einem kurzen Prozess im jeweiligen Installer. Direkt nach der Installation ist Edgeshark funktionsfähig und cshargextcap in Wireshark verfügbar. Nun muss nur noch die Verbindung zwischen Wireshark und Edgeshark hergestellt werden.
Beim Öffnen von Wireshark fällt direkt die Schnittstelle „Docker host capture“ ins Auge. Diese ist der Link zu Edgeshark und ermöglicht das Erfassen der Container-Kommunikation in Wireshark. Mit einem Klick auf das Zahnrad konfiguriere ich http://localhost:5001 als Docker host URL, weil unter dieser der Edgeshark-Container läuft. Im „Containers“-Dropdown kann ich den Container auswählen, dessen Kommunikation mitgeschnitten werden soll; ich wähle hier zunächst den TCP-Server aus, um die unverschlüsselte TCP-Kommunikation mitlesen zu können.
Nun starte ich die Aufzeichnung in Wireshark und lasse den TCP-Client die Nachricht „Hello World!“ senden, worauf der TCP-Server mit „Hello World!“ antwortet. In Wireshark tauchen sofort verschiedene Nachrichten auf, die zwischen Client und Server im Rahmen des TCP ausgetauscht werden:
Abbildung 2: Aufzeichnung in Wireshark mit „Hello World“
In zwei Nachrichten ist der übermittelte Inhalt „Hello World!“ zu sehen. Zu Beginn der Informationen in der „Info“-Spalte sind die Ports von Sender und Empfänger angegeben, die erste markierte Nachricht wurde an Port 1234 geschickt, die Zweite stammt von diesem Port. Die erste Nachricht wurde demzufolge vom Client an den Server gesendet, bei der Zweiten handelt es sich um die Antwort des Servers.
Es wird also deutlich, dass die Kommunikation unverschlüsselt ist und sich daher der Inhalt gesendeter Nachrichten mitlesen lässt.
Nun wähle ich in der Schnittstellen-Konfiguration den TLS-TCP-Server aus, um die TLS-TCP-Kommunikation aufzeichnen zu können. Wird jetzt dieselbe Nachricht übermittelt, allerdings diesmal vom TLS-TCP-Client an den TLS-TCP-Server, lässt sich in Wireshark in keiner der Nachrichten der übermittelte Text „Hello World!“ finden:
Abbildung 3: Nachrichtenübermittlung ohne „Hello World“
Es wird nur sichtbar, dass Informationen übertragen wurden und dass diese verschlüsselt sind, der Inhalt bleibt verborgen.
Die verschlüsselte Kommunikation transparent machen
Ich kann in meinem Angriffs-Scenario noch einen Schritt weiter gehen: Wenn ich Wireshark mit den für die Verschlüsselung verwendeten Geheimnissen versorge, ist das Programm in der Lage, die TLS-Verschlüsselung zu entschlüsseln.
Dazu gebe ich in der Umgebungsvariable SSLKEYLOGFILE einen beliebigen Pfad zu einer Datei an. Das hat zur Folge, dass viele TLS-Bibliotheken das Geheimnis, das zur Verschlüsselung verwendet wird, automatisch in diese Datei schreiben. Das trifft auch auf die Python-Bilbiothek zu, die im TLS-TCP-Client-Skript zur Verschlüsselung verwendet wird. Den Pfad zur Datei hinterlege ich jetzt in Wireshark in den Einstellungen für das TLS-Protokoll, sodass das Geheimnis zur Entschlüsselung verwendet werden kann.
Wird jetzt die Aufzeichnung der TLS-TCP-Kommunikation erneut durchgeführt, ist Wireshark diesmal in der Lage, die übermittelte Nachricht im Klartext anzuzeigen:
Abbildung 4: Nachrichtenübermittlung im Klartext
In beiden markierten Nachrichten ist der übermittelten Text „Hello World!“ zu sehen. Somit war die Entschlüsselung erfolgreich.
Fazit
Die Tool-Kombination aus Wireshark, Edgeshark und cshargextcap ermöglicht das Auslesen der Kommunikation eines Docker-Containers. Alle Tools lassen sich schnell installieren und der Aufwand für die Konfiguration fällt ebenfalls sehr gering aus. In Wireshark lässt sich dann ein- und ausgehende Kommunikation eines Docker-Containers mitlesen. Es ist ebenfalls möglich, verschlüsselte Kommunikation zu entschlüsseln, wenn die Geheimnisse für die Verschlüsselung bereitgestellt werden.
Das kann zu Entwicklungszwecken oder im Rahmen eines Penetrationstests sehr hilfreich sein. So konnte ich in dem Kundenprojekt die Verschlüsselung des Servers in Docker verifizieren und meinen Penetrationstest erfolgreich durchführen.
Hinweise:
[1] Im Umgang mit Computern, Programmen, Netzwerken oder Websites ist ein Hacker häufig eine Person, die Grenzen und Mechanismen einer Technologie auslotet. Auch wenn es einen typischen Hacker nicht gibt, üblicherweise werden drei Arten unterschieden:
- Ein Black-Hat-Hacker ist eine Person, die mit krimineller Absicht handelt.
- Ein White-Hat-Hacker ist eine Person, die zwar in ein System oder Netzwerk eindringt, dabei aber keinerlei Schaden anrichtet. Was auf den ersten Blick etwas merkwürdig klingt, ergibt Sinn, wenn diese Person im Auftrag des System- oder Netzwerkbetreibers agiert.
- Bei einem Gray-Hat-Hacker lässt sich nicht direkt bestimmen, welche Absicht hinter dem Angriff auf ein System, ein Netzwerk oder eine Website liegt. In manchen Fällen geht es den beteiligten Personen um die Veröffentlichung von „geheimen“ Daten, um dadurch öffentlich auf Missstände aufmerksam zu machen. In anderen Fällen geht es um Erpressung, mit dem Ziel, Organisationen zu bestimmten Aktionen zu bewegen. Grau ist weder weiß noch schwarz, grau ist grau.
[2] Docker
[3] Wireshark
[4] Edgeshark
[5] cshargextcap
Hier finden Sie einen Beitrag über Integrationstest First mit Gherkin und Docker.
Suchen Sie nach einem Team für Ihre Softwareentwicklung oder -modernisierung? Dann laden Sie sich den t2informatik Steckbrief herunter.
Wollen Sie als Meinungsmacherin oder Kommunikator über Docker Sniffing diskutieren? Dann teilen Sie den Beitrag gerne in Ihrem Netzwerk. Und falls Sie sich für weitere Beiträge aus der Welt der Softwareentwicklung interessieren, dann testen Sie unseren beliebten Newsletter.
Hier finden Sie weitere Artikel aus dem t2informatik Blog:

Jannis Krumbholz
Schon während der Schulzeit entdeckte Jannis Krumbholz sein Interesse für die digitale Welt. Deshalb entschied er sich für ein duales Informatik-Studium bei t2informatik und arbeitet seit 2023 als Junior-Entwickler, größtenteils im Frontend. In seiner Freizeit findet man ihn beim Badminton- oder Volleyballspielen oder im Fitnessstudio.
Im t2informatik Blog veröffentlichen wir Beträge für Menschen in Organisationen. Für diese Menschen entwickeln und modernisieren wir Software. Pragmatisch. ✔️ Persönlich. ✔️ Professionell. ✔️ Ein Klick hier und Sie erfahren mehr.






