
Fängt USB-Massenspeicherverkehr auf Block- und Dateiebene ab und analysiert ihn, emuliert USB-Geräte und unterstützt benutzerdefinierte Python-Stubs für Sicherheitsforschung, Forensik und TOCTOU-Schwachstellentests.

usb-spy ist ein USB-Massenspeicher-Datenverkehrsanalysator, der um einen WiFi- oder Ethernet-fähigen Mikrocontroller herum aufgebaut ist.
Das Board stellt einem Zielsystem ein Festplattenabbild (FAT oder ein beliebiges Dateisystem) als gefälschtes USB-Massenspeichergerät zur Verfügung, während die tatsächlichen Speicherdaten von einem entfernten Server über WiFi oder Ethernet bereitgestellt werden.
Dieser Aufbau ermöglicht es usb-spy, jeden vom Ziel durchgeführten Blockzugriff abzufangen und zu analysieren.
Über die reine Blockverfolgung hinaus versteht usb-spy Dateisysteme und kann jeden zugegriffenen Block der entsprechenden Datei und dem entsprechenden Verzeichnis zuordnen, sodass sofort ersichtlich ist, welche Datei gelesen oder geschrieben wird, anstatt nur rohe Sektornummern.
Zusätzlich kann usb-spy jedes USB-Gerät emulieren, indem Geräteeigenschaften wie Hersteller-ID, Produkt-ID, Seriennummer, Hersteller und Produktname über eine JSON-Konfigurationsdatei angepasst werden. Dies ermöglicht es, bestimmte USB-Geräte zu Test- und Analysezwecken zu imitieren.
Das Tool lässt sich leicht durch vom Benutzer geschriebene Python-Stubs erweitern, sodass Sie benutzerdefinierte Logik für die Behandlung von USB-Lese-/Schreibereignissen und Blockebenenoperationen implementieren können.

Wenn ein unterstütztes Dateisystem erkannt wird, führt usb-spy Folgendes aus:
Derzeit unterstützte Dateisysteme:
Die Unterstützung für weitere Dateisysteme wird in Zukunft hinzugefügt.
Wenn das Dateisystem nicht unterstützt wird, kann usb-spy trotzdem verwendet werden:
Dies stellt sicher, dass usb-spy auch bei unbekannten, benutzerdefinierten oder proprietären Dateisystemen nützlich bleibt.

Firmware-Bauanleitungen für jedes unterstützte Board werden hier beschrieben:
Der Quellcode befindet sich im src-Verzeichnis. Es lädt ein FAT-Image, stellt es über einen TCP-Port bereit und protokolliert jeden Zugriff auf das Image.
Um Informationen zu Dateien und Verzeichnissen auszugeben, verlässt sich das Tool auf die TheSleuthKit-Bibliothek.
Um es zu erstellen, führen Sie den folgenden Befehl im Stammverzeichnis aus
Alle Submodule abrufen
git submodule update --init --recursive
Dann führen Sie den waf configure-Befehl aus.
./waf configure
Es überprüft und erstellt alle benötigten Abhängigkeiten. Um das Projekt dann tatsächlich zu erstellen, führen Sie
./waf build
Das Binärprogramm befindet sich im wbuild-Verzeichnis
Wir können dies einfach mit dem mtools-Dienstprogrammpaket tun
Erstellen einer 2-MB-Datei
dd if=/dev/zero of=disk.img bs=1M count=2
Ein FAT-Dateisystem darauf setzen (verwenden Sie -F für FAT32, sonst ist es automatisch)
mformat -i disk.img ::
Eine Datei hinzufügen
mcopy -i disk.img example.txt ::
Dateien auflisten
mdir -i disk.img ::
Eine Datei extrahieren
mcopy -i disk.img ::/example.txt extracted.txt
Führen Sie den Spy mit dem neu erstellten Image aus
./usb-spy -v disk.img
Schließen Sie das Board an den USB-Anschluss des Ziels an.
Um ein bestimmtes USB-Gerät zu emulieren, können Parameter über eine JSON-Konfigurationsdatei überschrieben werden:
Die folgende JSON-Datei emuliert ein Kingston DataTraveler USB-Gerät:
{
"vendor_id": 2385,
"product_id": 5734,
"bcd_device": 272,
"product_rev": "3.0",
"manufacturer": "Kingston",
"product_name": "DataTraveler",
"serial": "509C4BBFACCDE742880C026B",
"language": 1033
}
Führen Sie den Spy mit dieser Konfigurationsdatei aus
./usb-spy -c config/kingston.json disk.img
Die dmesg-Ausgabe für dieses Gerät:
usb 1-8: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 1.10
usb 1-8: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-8: Product: DataTraveler
usb 1-8: Manufacturer: Kingston
usb 1-8: SerialNumber: 509C4BBFACCDE742880C026B
usb-storage 1-8:1.0: USB Mass Storage device detected
scsi host6: usb-storage 1-8:1.0
scsi 6:0:0:0: Direct-Access Kingston DataTraveler 3.0 PQ: 0 ANSI: 2
Wenn Sie Ihre eigene Logik für jedes Lese-/Schreibereignis implementieren möchten, können Sie dies einfach in Python tun.
Implementieren Sie die USBImage-Klasse in Python wie in diesem dummy-Image:
class USBImage:
def __init__(self, *args, **kwargs):
"""
Initialize the USBImage.
:param args: should contain:
- filename: The name of the file to manage.
:param kwargs: Arbitrary arguments passed from the c++ command line including:
readOnly: Whether the interface is read-only.
verbose: Whether to enable verbose logging.
block: Whether to enable block mode.
"""
pass
def getBlockNumber(self):
"""Get block number"""
return 100
def getBlockSize(self):
"""Get block size"""
return 512
def read(self, lba, buffer, size):
"""Read block"""
print(f"read block={lba} size={size}")
for i in range(size):
buffer[i] = (lba + i) % 256 # Simulate reading data
return size
def write(self, lba, buffer, size):
"""Write block"""
print(f"write block={lba} size={size}")
print(buffer)
return size
def flush(self):
"""Flush block"""
print("flush data")
Und führen Sie den Spy mit Ihrem Python-Modul aus.
./usb-spy --py python/dummy.py disk.img
Sie können auch beliebige Argumente von der Befehlszeile an Ihre Python-Klasse übergeben. Argumente sind in den kwargs verfügbar.
./usb-spy --py python/dummy.py --py-args arg1=2 --py-args arg2=Hello disk.img
Sie können auch mit dem rawimage-Beispiel beginnen, das eine vollständige Implementierung (~100 Codezeilen) dessen bietet, was nativ in der usb-spy-Binärdatei implementiert ist.
Dieses Projekt wird "wie besehen" zur Verfügung gestellt. Es gibt keine Garantie für Richtigkeit, Sicherheit oder Eignung für einen bestimmten Zweck.
Die Verwendung der Tools und Firmware erfolgt auf eigenes Risiko. Der Autor und die Mitwirkenden übernehmen keine Verantwortung für Schäden, Datenverlust oder rechtliche Konsequenzen, die durch die Nutzung dieser Software oder Hardware entstehen können.
Beiträge sind willkommen! Bitte befolgen Sie diese Schritte:
Dieses Projekt ist unter der GNU General Public License v3.0 lizenziert. Weitere Informationen finden Sie in der Datei LICENSE.