Mobile Forensik mal anders: Netzwerkmonitoring mit Bash Bunny
In der heutigen Zeit sind unsere Smartphones mehr als nur Geräte zum Telefonieren. Sie sind unsere persönlichen Assistenten, eine Verbindung in die digitale Welt und vieles mehr. Auf meiner Webseite habe ich bereits einige Themen zur mobilen Forensik von Android-Geräten aufgefasst und beschrieben. Durch meine Bachelorarbeit habe ich mich intensiv mit dem forensischen Vorgehen bei Android-Geräten beschäftigt. Auf Basis dieser Arbeit entstand der Gedanke, dass Live-Forensik von Android nicht nur mit einer App wie ErrorCode 404 abgedeckt ist, sondern auch bei ungerooteten Smartphones die Netzwerkkommunikation überwacht werden muss.
Doch was hat der Bash Bunny damit zu tun? Nun, der Bash Bunny ist ein kompaktes, unscheinbares Gerät, das auf den ersten Blick wie ein gewöhnlicher USB-Stick aussieht. Die Möglichkeiten dieses Geräts in den Bereichen Netzwerkforensik und Penetrationstests sind meiner Meinung nach äußerst umfangreich. An dieser Stelle möchte ich mich allerdings auf das Netzwerkmonitoring mit dem Bash Bunny beschränken.
Auf dieser Seite werde ich die zentralen Teile beschreiben, um mit dem Bash Bunny die Netzwerkanfragen einer App zu monitoren. Das Ziel dabei ist es, App-Vorgänge bezüglich der Netzwerkkommunikation mitzuschneiden. Der hier beschriebene Versuch zielt dabei auf spezielle Netzwerkaktivitäten ab, die durch Aktionen in einer App gestartet werden.
Wieso macht das Sinn? Nicht gerootete Android-Smartphones bietet im Gegensatz zu herkömmlichen PCs oder Laptops keine Möglichkeit, Netzwerkverbindungen oder gar einzelne Netzwerkpakete anzeigen zu lassen – zumindest nicht zum Stand dieses Beitrags. Dadurch kann die Netzwerkkommunikation einer App nicht eingesehen und untersucht werden. Ein Routingprozess der Netzwerkpakete über den Bash Bunny ermöglicht es, Netzwerkaktivitäten durch bestimmte Aktionen auf dem Smartphone zu untersuchen.
Mein Sammelsurium nützlicher Quellen
Im Folgenden möchte ich einige nützliche Links zu Webseiten auflisten, die mir sowohl bei der Konfiguration, als auch der Entwicklung von Payloads geholfen haben:
- Hak5-Webseite: Bash Bunny Dokumentation
- Hak5-Webseite: Bash Bunny payloads
- Hak5-Forum: Tools für den Bash Bunny
- GitHub-Repository: Bash Bunny payloads
Wie sieht der Bunny aus?
An sich ist der Bash Bunny sehr unauffällig. Man könnte sagen, es handelt sich um einen etwas größeren USB-Stick mit einem LED-Licht, sowie einem 3-Wege Switch. In der folgenden Abbildung wird mein Bash Bunny, sowie ein für den Versuch benötigten Adapter von USB auf USB-C dargestellt:
Der Bunny wird mit einem regulären USB-Anschluss geliefert. Um ihn im weiteren Verlauf mit dem Testgerät (ein Samsung-Smartphone) verbinden zu können, wurde der dargestellte Adapter ergänzend montiert.
Auf der Oberfläche befindet sich eine Status-LED, die bei Programmieren des Payloads angesteuert werden kann. Seitlich angeordnet (bei diesem Bild oben) wurde ein Slot für eine Micro SD-Karte eingefügt. Auf der anderen Seite (bei diesem Bild unten) hingegen wurde ein dreistufiger Switch verbaut.
Da im Folgenden die Switch-Positionen nochmal relevant werden, möchte ich an dieser Stelle noch einen kurzen Überblick über die drei Switch-Stellungen geben. Der Arming-Mode bietet die Möglichkeit, auf den Bash Bunny zuzugreifen. Nach dem Start erhält man Zugriff auf organisatorisch wichtige Verzeichnisse und Dateien. Die Positionen „Switch 1“ und „Switch 2“ hingegen werden für Angriffe verwendet. Insgesamt kann pro Switch-Position (außer im Arming-Mode) ein Payload hinterlegt werden. Für eine umfangreichere Erklärung verweise ich an dieser Stelle auf die entsprechende Dokumentationsseite (siehe Links).
Per SSH auf den Bunny
Wie Hak5 in der Dokumentation für den Bash Bunny beschreibt, können umfangreich Tools installiert und weitere Anpassungen per Konsole vorgenommen werden. Hier möchte ich die Vorgehensweise unter Windows 11 nochmal kurz aufgreifen.
Wie verbindet man den Bash Bunny mit dem Internet und etabliert zugleich einen Zugang per SSH? Für beide Vorgänge muss der Bunny zuerst in den gebracht werden:
1. Starte den Bunny im Arming Mode
2. Erstelle eine payload.txt-Datei in Switch 1 oder Switch 2
3. Füge die folgenden zwei Zeilen in die payload.txt hinzu
- ATTACKMODE RNDIS_ETHERNET SERIAL
- LED FINISH
Für die Netzwerkkonfiguration kann zuerst die Windows-Taste + R gedrückt werden, um das Control-Panel zu öffnen. Anschließend gibt man ncpa.cpl ein und bestätigt mit Enter.
Die folgenden zwei Abbildungen zeigen die Netzwerkverbindungen bevor (links) und nachdem (rechts) der Bunny angeschlossen wurde.
An den beiden rot hervorgehobenen Verbindungen werden im folgenden kleine Änderungen vorgenommen. Zuerst wird Ethernet 13 (also der Bash Bunny) auf die IP-Adresse 172.16.64.64 gesetzt. Das kann in den Eigenschaften des Bereichs Internetprotokoll, Version 4 durchgeführt werden. Die Subnetzmaske auf 255.255.255.0 (falls nicht als default schon hinterlegt ist).
Um die Internetverbindung nun für den Bash Bunny bereitzustellen, muss der WLAN-Adapter die gemeinsame Internetnutzung mit Ethernet 13 zulassen. Dazu werden die Eigenschaften des WLANs geöffnet und zum Reiter Freigabe navigiert. Die gelb hervorgehobenen Optionen müssen anschließend angekreuzt und Ethernet 13 gesetzt werden. Nachdem die Einstellungen mit OK bestätigt wurden, ist das Internet auch auf dem Bash Bunny verfügbar.
Mit dem folgenden Kommandozeilenbefehl (hier mit Git Bash) und dem Passwort für den User:root kann die SSH-Verbindung zum Bunny erfolgreich hergestellt werden:
ssh root@172.16.64.1
root:hak5bunny
Und nun zum eigentlichen Netzwerkmonitoring…
Wie kann der Bash Bunny ein Smartphone monitoren? Für die Umsetzung habe ich einen Payload mit dem Namen DroidInfiltrator geschrieben. Für das vollständige Projekt möchte ich ab hier auf mein Repository verweisen. Insgesamt kann der Payload in die folgenden 5 Stages unterteilt werden:
Stage | Beschreibung |
---|---|
IP | Zeigt Informationen zu Netzwerkschnittstellen |
IPCONFIG | Zeigt Netzwerkkonfigurationen |
NMAPPORTSCAN | Führt einen Nmap-Portscan auf das Smartphone durch |
TCPDUMP | Erfasst den Netzwerkverkehr mit Tcpdump |
TCPDUMPHEX | Erfasst den Netzwerkverkehr im Hexadezimalformat mit Tcpdump |
Für den eigentlichen Prozess muss die Datei payload.txt aus meinem Repository lediglich in Switch 1 oder Switch 2 des Bunnys abgelegt werden. Voraussetzung für den Nmap-Scan, ist das Tool metasploit-framework. Dieses muss ggf. nachinstalliert werden.
Die folgenden Einstellungen sind ebenfalls noch anzupassen:
# Sets the termination condition for TCPDUMP
#
MAXTCPDUMPCOUNT=200
# Sets the min and max port for the Nmap scan
#
MINPORT=1
MAXPORT=2000
IP()
Die Funktion IP() dient lediglich zu Protokollzwecken und zeigt Informationen über die Netzwerk-Interfaces auf dem Bash Bunny. Im Folgenden wird ein Ausschnitt aus dieser Funktion aufgeführt:
IP() {
LED STAGE1
<...>
echo "export HOME=/root" >> $LOOTDIR/DILog.txt
export HOME=/root
echo "Start ip link show..." >> $LOOTDIR/DILog.txt
ip link show >> $LOOTDIR/NetworkLog.txt
echo "Finished ip link show!" >> $LOOTDIR/DILog.txt
SYNC
}
Wie sieht nun der Eintrag aus? Die folgende Abbildung zeigt die Ausgabe durch ip link show:
IPCONFIG()
Die Funktion IPCONFIG() zeigt die aktuellen Netzwerkkonfigurationen des Bunnys und dient ebenfalls zur Protokollierung und Analysezwecke:
IPCONFIG() {
LED STAGE2
<...>
echo "export HOME=/root" >> $LOOTDIR/DILog.txt
export HOME=/root
echo "Start ifconfig..." >> $LOOTDIR/DILog.txt
ifconfig >> $LOOTDIR/NetworkLog.txt
echo "Finished ifconfig!" >> $LOOTDIR/DILog.txt
SYNC
}
Die Ausgabe von ipconfig zeigt die eigentlichen Konfigurationen des Loopback-, sowie des Ethernet-Interfaces. Gut zu erkennen ist die IPv4-Adresse 172.16.64.1 am Interface usb0.
NMAPPORTSCAN()
Der Nmap-Portscan wird mit dem metasploit-framework durchgeführt. Die Installation von Tools kann der Dokumentation entnommen werden. Die Variablen $MINPORT und $MAXPORT können am Anfang des Payloads gesetzt werden. Und hier noch ein Hinweis dazu – wenn alle Ports gescannt werden (also 0 – 65.535), dauert der Scan zum Teil schon sehr lange. Dieser kritische Faktor sollte daher auch vom Akkustand des Smartphones abhängig gemacht werden.
NMAPPORTSCAN() {
LED STAGE3
<...>
echo "export HOME=/root" >> $LOOTDIR/DILog.txt
export HOME=/root
echo "cd $MSF_DIR" >> $LOOTDIR/DILog.txt
cd $MSF_DIR
echo "Start nmap scan..." >> $LOOTDIR/DILog.txt
./msfconsole -q -x "nmap -T5 -sV -vvv --reason $TARGET_IP -p $MINPORT-$MAXPORT -Pn; run; exit" >> $LOOTDIR/NetworkLog.txt
echo "Finished nmap scan!" >> $LOOTDIR/DILog.txt
SYNC
}
Die folgende Ausgabe des Nmap-Scans der Ports 2000-5000 kann der folgenden Abbildung entnommen werden. An dieser Stelle konnten keine offenen Ports gefunden werden. Allerdings bilden die gescannten Ports nur einen kleinen Teil auf dem Android-Gerät ab:
TCPDUMP()
Die Funktion TCPDUMP() erfasst den eigentlichen Netzwerkverkehr. Sämtliche Netzwerkanfragen werden bei diesem Angriffsmodus über den Bunny geleitet. Daher kann mit dem Tool tcpdump an dieser Schnittstelle mitgeschnitten werden. Die Option -vvv erstellt eine detailliertere Ausgabe der Pakete, wohingegen -c eine Art Paketcounter darstellt. Mit dieser Option wird das Tool tcpdump nach n-Paketen beendet.
TCPDUMP() {
LED STAGE4
<...>
echo "Start tcpdump -vvv -c $MAXTCPDUMPCOUNT" >> $LOOTDIR/DILog.txt
tcpdump -vvv -c $MAXTCPDUMPCOUNT >> $LOOTDIR/NetworkLog.txt
echo "Finished tcpdump!" >> $LOOTDIR/DILog.txt
SYNC
}
Die Sicherung sämtlicher Netzwerkpakete wird, wie bereits oben beschrieben, mit tcpdump durchgeführt. Die folgende Ausgabe zeigt zwei mitgeschnittene Pakete, die durch einen Klick in der Narrenzunft-Baienfurt App, vom Smartphone gesendet wurden:
TCPDUMPHEX()
Im Gegensatz zur vorherigen Funktion wird in TCPDUMPHEX() die Hex-Ansicht der Netzwerkpakete gespeichert. An dieser Stelle muss erwähnt werden, dass es durchaus manchmal auch Vorteile hat, den Hexdump zu erhalten. Die Option -X setzt diese Darstellung um. Auch hier wird wieder einen Counter verwendet, um eine Abbruchbedingung für den Payload zu erhalten.
TCPDUMPHEX() {
LED STAGE5
<...>
echo "Start tcpdump -X -c $MAXTCPDUMPCOUNT" >> $LOOTDIR/DILog.txt
tcpdump -X -c $MAXTCPDUMPCOUNT >> $LOOTDIR/NetworkLog.txt
echo "Finished tcpdump!" >> $LOOTDIR/DILog.txt
SYNC
}
Zuletzt möchte ich noch einen Ausschnitt zeigen, der die Hex-Darstellung verdeutlicht. Auch an dieser Stelle werden zwei Pakete gezeigt, die nach einem Klick in der Narrenzunft-App erstellt wurden: