USB: Dr. Jekyll und Mr. Hyde
Einleitung
Das Universal Serial Bus (USB) Protokoll wird zur Kommunikation zwischen einem Computer und externer Hardware wie Tastaturen und Massenspeichergeräten verwendet. Hierbei nimmt ein Kommunikationspartner die Rolle des Hosts, von dem die Kommunikation ausgeht, ein. Der andere Kommunikationspartner übernimmt die Rolle des Slave, der auf die Anfragen des Hosts antwortet. Im Allgemeinen kann der Host in diesem Modell davon ausgehen, als einziges Gerät auf den Slave zugreifen zu können.
In unserem Projekt haben wir uns zum Ziel gesetzt, einen USB-Stick zu emulieren, der sich im laufenden Betrieb, also ohne dass er vom Host-Computer abgesteckt wird, verändern kann. Der Projektname, "Dr. Jekyll und Mr. Hyde", bezieht sich hier auf die Novelle "Strange Case of Dr Jekyll and Mr Hyde" von Robert Louis Stevenson, in der sich Dr. Jekyll durch Einnahme eines Trankes in den bösen Teil seiner Seele, Mr. Hyde, verwandeln kann. Wie Dr. Jekyll ist auch unser emulierter Stick in der Lage sein Verhalten zu ändern.
Wir haben uns im Rahmen des Projekts mit drei Szenarien für einen "sich selbst verändernden" USB-Stick beschäftigt und diese jeweils auf unserem Hardware- und Software-Setup implementiert.<ref>Template:Cite news</ref>
Setup
Hardware
Zur Emulation des USB-Sticks wurde ein Raspberry PI Zero W verwendet. Dieser unterstützt, ebenso wie eine Reihe von Android Smartphones, die USB On-the-Go (OTG) Erweiterung. OTG wurde 2001 spezifiziert und ermöglicht es Geräten, sowohl als Host als auch als Slave aufzutreten, was für unser Projekt eine Voraussetzung war. Andere Single Board Computer wie der "Raspberry Pi Model B" unterstützen diese Erweiterung nicht.
Abgesehen von der OTG-Unterstützung ist auch der Formfaktor des Raspberry Pi Zero W zu erwähnen, der dem eines USB Sticks schon relativ nahe kommt.
Software
Raspberry Pi Zero einrichten
dd bs=4M if=2017-09-07-raspbian-stretch-lite.img of/dev/mmcblk0p1 conv=fsync
weiterhin muss das wlan eingerichtet werden
GadgetFS
echo "dtoverlay=dwc2" | sudo tee -a /boot/config.txt
echo "dwc2" | sudo tee -a /etc/modules
Gadget erstellen
#!/bin/bash
cd /sys/kernel/config/usb_gadget/
mkdir -p isticktoit
cd isticktoit
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2
mkdir -p strings/0x409
echo "fedcba9876543210" > strings/0x409/serialnumber
echo "Tobias Girstmair" > strings/0x409/manufacturer
echo "iSticktoit.net USB Device" > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower
# Add functions here
# see gadget configurations below
# End functions
ls /sys/class/udc > UDC
dd if=/dev/zer of=mass_storage bs=1M seek=1024 count=16000
mkdosfs mass_storage
Szenarien
Hidden Volume
was - usb hat 2 partitionen, sind auf dem raspberry pi 2 images, - je nach User wird eine oder beide Partionen sichtbar - beispielsweise hier loesungen der klausur und passwörter
wie , sind auf dem raspberry pi 2 images, eine partition wird default angezeigt als massenspeicher - außerdem emuliert gadgetfs eine serielle schnittstelle, wenn auf der seriellen schnittstelle daten rein kommen, soll die geheime partition angezeigt werden
resultat/probleme
- Der Pi erkennt nicht an welchem PC er angeschlossen wird, demnach nicht möglich so zu entscheiden wieviele Partionen gezeigt werden --> wir nutzten die serielle Schnittstelle als zusätzlichen Kanal, wenn Daten auf der seriellen Schnittstelle auf dem Pi ankommen, mountet er die hidden Partition
- Functions können nicht später (d.h. im gemounteten Zustand) hinzugefügt werden --> Lösung: um zwei Partionen statt einer zu erkennen, muss der Pi neu gestartet werden
Passive Attack
was - Alice speichert ein Dateien auf einem USB Stick und gibt diesem Bob - bevor Bob den Stick ansteckt, werden die Dateien auf dem Stick verändert. - Bob guckt sich modifizierte Daten an
wie
- Dateien werden verändert nach dem unmounten des USB Sticks
- Demo: Beispielsweise: Skript sucht auf dem Stick nach Bild Dateien und rotiert diese
- weitere Ideen: veränderung der IBAN oder Geldbeträge, weitere kompromittierte Dateien hinzufügen
resultat/problem
- nicht erkennbar für den Pi ob er gemountet ist oder nicht
- dadurch kann nicht automatisch nach unmounten des Sticks das Skript ausgeführt werden
---> Skript manuell ausführen nach unmounten
das Image muss dann gemountet werden
mkdir ~/mount_usb
mount -o loop,rw mass_storage ~/mount_usb
cd ~/mount_usb
yes 0 | dd of=test_file1.text bs=1M count=4000
yes 1 | dd of=test_file1.text bs=1M count=4000
Active Attack
dee virenscanner scannt dateien, sagt alles virenfrei schadcode im gemounteten Zustand einfügen
was
- der Stick wird angesteckt, eine Datei wird geladen angeguckt wieder geschlossen, und während der Stick gemountet ist, wird die Datei vom pi geändert bsp. mit schadcode
- danach wird die datei wieder geöffnet und ist verändert
wie
- kleine dateien verändern 00 zu 11 - keine veränderunng: gecacht oder gehasht fehlermeldung bei windows und linux korruptes filesystem
-versuch mit sehr großen dateien bsp. 4 gb bei 4 gb ram linux - swap deaktiviert veränderung wird gesehen - siehe demo
- versuche auf windows teilweise speicher volllaufen auf glück? veränderung gesehen einmal gesehen
- verschiedene Ansätze / Versuche - OS: Windows und Linux reagieren unterschiedlich
- text file erstellt, vom pi sollte dann dieser string eingefüght werden X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
https://en.wikipedia.org/wiki/EICAR_test_file
resultat/problem
- OS nimmt an totale Kontrolle über das File System zu haben - Dateien werden vermutkich im RAM gecacht (I/O Buffer)
Linux: wie in Demo, wird gezwungen File neu zu öffnen
Windows: caching verhalten nicht so vorhersehbar
unser Windows system hatte 8gb ram, dass linux system nur 4gb
Demo: 1. raspberry pi:
- create one images
dd if=/dev/zero of=image.img bs=1M count=4000
msdosfs image.img
sudo mount -o loop,rw image.img usbdisk.d
sudo umount usbdisk.d
yes 0 | sudo dd of=four_gb.txt bs=1M count=4000 iflag=fullblock
- - - - - schon erledigt - - - - - - - - -
2. ninas rechner: sudo modprobe usbmon sudo wireshark cat four_gb.txt > /dev/null wireshark zeigen
3. robbys rechner:
sudo mount -o loop,rw usbdisk.img usbdisk.d
sudo dd if=/dev/urandom of=four_gb.txt bs=1M count=4000 conv=notrunc status=progress
sudo umount usbdisk.d
4. ninas rechner
cat four_gb.txt > /dev/null
--> wireshark zeigen
datei erstellt 0000 pi mount verändert unmount datei anders