Teensy USB Stick in der Virtualisierung zur Demonstration von Penetrationstests

9. Oktober 2011 | Von | Kategorie: Admin | Virtualisierung

Auf den OpenSource Trends Days habe ich Angriffe über programmierbare USB-Sticks vorgestellt. Der bekannteste Vertreter dieser programmierbaren Sticks ist der Teensy von PRJC. Dieser enthält, wie viele andere Sticks, einen Atmel Prozessor und ist Arduino-kompatibel. Mit den richtigen Bibliotheken kann dieser Stick eine Tastatur, Maus oder auch Verbundgeräte aus Tastatur und Flashdisk simulieren. Um diesen Stick für Penetrationstest zu nutzen, programmiert man diesen Stick so, dass er zum Beispiel unter Windows eine Kommandozeile öffnet und dort Programme aufruft, die er zuvor aus dem Internet oder von dem Stick heruntergeladen hat.

Die Demonstrationen konnten nur mit echten Windows-Systemen erfolgen. In einem virtualisierten Windows konnte ich den Angriff nicht vorführen. Damals dachte ich, dies hängt mit der USB-Unterstützung der Virtualisierung zusammen. Dem ist jedoch nicht so!

Der Stick initialisiert sich, sobald er über eine Versorgungsspannung verfügt. Mein Programmcode damals erkannte dies, wartete einige Sekunden, um dem Betriebssystem die Möglichkeit zu geben, die notwendigen Treiber zu laden, und begann dann die Kommandos zu tippen. Wurde der Stick in einem Linux-System eingesteckt, so funktionierte dies auch einwandfrei. Wurde der Stick dann in KVM an einen Windows-Gast weitergereicht, blieb er stumm.

Dies ist nun logisch, da die Initialisierung des Sticks bereits erfolgt war. Das Programm wurde nicht erneut aufgerufen. Entweder muss das Programm auf dem Stick in einer Endlosschleife arbeiten. Das könnte aber wieder zu anderen Problemen  (Erkennung durch den Anwender, etc.) führen. Schöner wäre es, wenn der Stick erkennt, dass er weitergereicht wurde. Das funktioniert auch. Hierzu muss das Programm angepasst werden:

void exploit() {
  Keyboard.print("Hello World");
}

void loop() {
  for (;;) {
    delay(5000);
    exploit();
    usb_configuration=0;
    while ( usb_configuration == 0) {
      delay(1);
    }
  }
}

Der eigentliche Angriff erfolgt in der Routine exploit. Diese wird zunächst direkt nach der Initialisierung aufgerufen. Dann beginnt eine Endlosschleife, die die USB-Konfiguration des Sticks zunächst löscht und so lange wartet, bis ein Betriebssystem den Stick erneut enummeriert und konfiguriert.
Geschieht dies, wird die Variable usb_configuration wieder von den Routinen im Stick gesetzt.
Dies lässt sich gut nachvollziehen, in dem der Stick dem Gast wieder entzogen und erneut zur Verfügung gestellt wird. Jedes Mal wird die exploit-Routine aufgerufen.

Post to Twitter Post to Yahoo Buzz Post to Delicious Post to Digg Post to Facebook Post to Ping.fm Post to Reddit

Tags: | | | | | |

Schreibe einen Kommentar

Fühle dich ermuntert einen Kommentar, Anmerkungen, Hinweise oder deine Ideen zum Thema zu hinterlassen. Wir freuen uns über deine Rückmeldung.