HID-Атаки. Программируем хакерский девайс.
Social Engineering![](/file/4cdb17af3be531ef7cca3.png)
Универсальность шины USB создает большую поверхность атаки. Исследователи из Университета Бен-Гуриона выделяют почти три десятка хакерских техник использования USB. В данной статье мы рассмотрим один из самых эффективных вариантов — автоматизированную отправку команд при помощи самодельного устройства класса HID.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
HID-атаки.
HID-атака — хитрая разновидность BadUSB. Ее суть сводится к тому, что в USB-порт вставляется простейший хакерский девайс, эмулирующий устройство ввода. Практически любая современная ОС поддерживает plug-n-play и содержит универсальный драйвер устройства каждого класса. Хакерский девайс автоматически определяется ОС как нужный нам Human Interface Device — HID. Далее ОС безо всяких проверок принимает его команды.
Есть много готовых девайсов для атак через USB-порт. Например, Rubber Ducky и ее разновидности. На мой взгляд, интереснее разобраться, как сделать такую штуку самому. Это довольно просто (когда знаешь как) и дешево. Нам даже флешка на этот раз не понадобится.
Преимуществ HID-атаки перед атакой вручную сразу несколько: это скорость, незаметность и автоматизация. Все необходимые действия выполнятся быстрее, чем ты сможешь набрать то же на клавиатуре, и без опечаток (если их не было изначально). Подключить к USB-порту миниатюрное устройство можно за пару секунд. Это не такое палево, как садиться за чужую клавиатуру и поминутно оглядываться через плечо. Из-за малых габаритов самодельный девайс легко спрятать и пронести через охрану даже на режимный объект. В крайнем случае можно просто выдать его за флешку и «случайно» уничтожить легким нажатием ботинка, после чего изготовить хоть мешок других таких же.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Выбираем аппаратную платформу.
Сотворить такую хакерскую железку можно и на одноплатниках (вроде Raspberry Pi), но это все равно что перевозить ноутбук на фуре. Есть «братья меньшие» не такие известные, но не менее «злые» и опасные в руках из плеч. По сути, для выполнения HID-атаки нам необходим микроконтроллер, USB-порт и минимальная электронная обвязка, чтобы это все заработало.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Arduino Micro Pro.
На мой взгляд, это один из идеальных кандидатов на роль хакерского девайса.
![](https://xakep.ru/wp-content/uploads/2018/09/186977/1.jpg#26143358)
Плата размером 33×16 мм работает на микроконтроллере ATmega32u4 и имеет на борту 28 Кбайт свободной памяти (вообще памяти 32 Кбайт, но 4 Кбайт уже заняты загрузчиком). С ней очень легко работать, так как проект Arduino хорошо поддерживается и для него написано много документации. Также для него есть готовая среда разработки Arduino IDE с дистрибутивами для Windows, Linux и macOS. Купить плату можно от 350 рублей.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Teensy Low Cost.
![](https://xakep.ru/wp-content/uploads/2018/09/186977/2.jpg#26143358)
Хорошая альтернатива — семейство плат Teensy, совместимых с Arduino. С ними также можно использовать Arduino IDE. Например, плата Teensy LC размером 17×35 мм оснащена процессорным ядром ARM Cortex-M0+ и 64 Кбайт памяти. Купить ее в России может быть проблематично (основной упор делается на продажи Teensy 3.2–3.6), но заказать из-за рубежа вполне возможно. Цены на Teensy LC начинаются от 10 долларов.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Digispark.
Многие думают, что Digispark — это самая подходящая плата для HID-атак. Да, она выигрывает по некоторым параметрам у остальных: крошечный размер 18×22 мм, практически нет лишних функций (и точек отказа), USB-разъем типа А и смешная цена порядка 100–150 рублей.
Однако в использовании она не так проста. Даже подключать ее стоит в порт USB 2.0 (или через USB-хаб v.2.0) либо лезть в BIOS, отключать xHCI и выставлять режим USB 3.0 порта как USB 2.0 compatible. Обратная совместимость у версий USB 3.0 и 2.0 заявлена, но порой нужен бубен, чтобы она реально заработала, особенно на Windows 10.
![](https://xakep.ru/wp-content/uploads/2018/09/186977/3.jpg#26143358)
Работает данная плата под управлением микроконтроллера Attiny85. С памятью у нее негусто — всего 8 Кбайт, из которых два уже заняты загрузчиком. Совсем не вдохновляет ограничение ROM в 512 байт под исполняемый код, но оптимизация тебе в помощь.
Процессор (если его можно так назвать) опять же совместим с Arduino IDE, только желательно использовать версию 1.6.5r2, а 1.6.6 и 1.6.7 не рекомендуется вовсе. Digispark Wiki любезно предоставляет мануал по «вживлению» этой платы в Arduino IDE, или можно скачать уже специально заточенные версии ПО.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Альтернативы.
Выше я привел для примера три платы, которые, на мой взгляд, идеально подходят для HID-атак, но под конкретную задачу может быть интереснее взять какую-то другую. Вот еще примеры плат и некоторые соображения, почему они были отвергнуты в качестве универсального варианта.
NodeMCU и SparkFun с микроконтроллером ESP8266. Этот чип разрабатывался с направлением на поддержку Wi-Fi, поэтому платы с беспроводным модулем получились довольно большими. NodeMCU имеет размер 60×30 мм при не самой выгодной цене от 400 рублей. Однако если планируется многоэтапная атака, то беспроводное подключение будет совсем не лишним.
SparkFun в целом неплох, но смущает ценой (от 17 долларов за копеечный процессор). Однако его контроллер совместим с Arduino IDE, что делает разработку удобной.
Функционально Particle Photon похож на платы с ESP8266, но его цена гораздо выше. На борту у него довольно дорогой и ненужный для HID-атак ARM Cortex M3 STM32F205RGY6 с Wi-Fi-модулем Broadcom BCM43362, что поднимает цену до 2000 рублей и выше. Он будет оправдан в том случае, если помимо эмуляции клавиатуры планируется выполнять какие-то более сложные задачи, требующие универсального процессора архитектуры ARM.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Делаем хакерский девайс за пять долларов.
Приступим к практической части на примере платы Arduino micro Pro и переходника mini-USB ↔ USB Type A. В качестве основной ОС используется Kali Linux (4.14.0-kali3-amd64), но на других сборках Linux и в Windows проблем возникнуть не должно. Arduino IDE v. 1.8.6 скачана с официального сайта. В качестве жертвы выбран тот же компьютер.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Готовим софт.
Скачиваем дистрибутив, распаковываем. В каталоге лежит файл с символичным названием install.sh. Его и запустим на исполнение:
./install.sh
Минуту-две смотрим на надпись Adding desktop shortcut, menu item and file associations for Arduino IDE... и вуаля! На рабочем столе появляется ярлык для запуска.
Теперь подключаем нашу плату. Весь нужный софт установился вместе с IDE, поэтому нет необходимости что-то доустанавливать, монтировать и запускать.
Командой lsusb
можно проверить, что устройство определено верно и все идет по плану (Arduino Micro Pro определяется как Leonardo).
![](https://xakep.ru/wp-content/uploads/2018/09/186977/4.png#26143358)
Следующая команда покажет порт, на котором повис наш Leonardo:
ls /dev/ | grep tty
У меня это ttyACM0
.
Теперь можно открыть саму IDE. Сразу после запуска идем в меню «Инструменты» и в разделе «Платы» выбираем Arduino Leonardo. Там же в «Инструментах» выбираем нужный порт (он там, скорее всего, будет один) из списка tty.
После этих действий связь платы с компьютером установлена, программное обеспечение настроено, можно переходить к написанию скетча (так называют код для Arduino-совместимых макетных плат).
После запуска Arduino IDE картинка будет следующая.
![](https://xakep.ru/wp-content/uploads/2018/09/186977/6.png#26143358)
Есть еще один вариант запустить подобие Arduino IDE. На сайте представлен Arduino Web Editor. На мой взгляд, он менее удобен, но тут уже кому как по вкусу. Для его использования будет необходимо зарегистрироваться на сайте либо авторизоваться через Google-аккаунт. Также для связи браузера с устройством потребуется установить плагин (он есть для Chrome и Firefox). Его удобство в том, что все написанные скетчи будут онлайн (с любой точки земли можно получить доступ к ним), но я в таких тонких деталях предпочитаю локальную работу.
![](https://xakep.ru/wp-content/uploads/2018/09/186977/9.png#26143358)
В остальном редакторы похожи.
Изначально присутствует заготовка из void setup()
и void loop()
. Напомню, что код, написанный в функции setup(), будет исполняться сразу при подаче питания на плату, причем он исполнится один раз. Функция loop()
отреагирует на питание таким же образом, вот только повторяться действие будет постоянно (цикл с бесконечным счетчиком и неизменным кодом на каждый проход).
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Пишем скетч.
Нам нужно, чтобы микроплата Arduino выдавала себя за клавиатуру. Для этого в самом начале следует добавить библиотеку Keyboard.h
.
Далее основные элементы, которыми мы будем пользоваться:
Keyboard.begin()
— строка необходима для начала эмуляции клавиатуры;Keyboard.print()
— вводит заданный текст;Keyboard.press()
— зажимает указанную клавишу;Keyboard.release()
— отпускает указанную клавишу;Keyboard.releaseAll()
— отпускает все клавиши;delay()
— задает период ожидания (между командами или для начала выполнения действия).
Ключи нажимаемых клавиш можно найти тут. Для простоты мы говорим «нажимаем/отпускаем клавишу», подразумевая, что контроллер отправляет ее скан-код, имитируя нажатие командами Keyboard.press/Keyboard.release.
Каждый, кто немного касался программирования, знает о том, как работать с повторяющимися вызовами. Если мы начинаем копипастить участки кода, то пора вызывать парней в белых халатах. Поэтому повторения будем выполнять с помощью отдельной функции.
Задается она вот такой конструкцией:
void function_name(){ ... }
В скетче указывается как function_name(). Для начала другие элементы управления платой нам не понадобятся.
Теперь можно попробовать написать свой первый скетч. Ведь в теории между теорией и практикой разницы нет, а на практике — есть.
В качестве PoC используем такую задачу: после подключения нашего девайса в USB-порт на компе с Linux должен автоматически открыться терминал, а затем в домашнем каталоге создаться файл с содержимым Hello World
, который открывается в текстовом редакторе (у меня будет Leafpad).
Скетч выглядит следующим образом.
![](https://xakep.ru/wp-content/uploads/2018/09/186977/7.png#26143358)
В самом начале указана знакомая всем сишникам конструкция #include
c указанием на использование библиотеки Keyboard.h
. Как уже говорилось выше, она нужна для того, чтобы наша ардуина смогла выдать себя за клавиатуру.
В коде повторяется нажатие клавиши Enter три раза, поэтому удобнее создать отдельную функцию pressEnter()
, что я и сделал. Обрати внимание: она находится за пределами setup(), а между нажатиями клавиши Enter вставлена задержка (ниже поясню, зачем она нужна).
Keyboard.press(KEY_RETURN); delay(50); Keyboard.release(KEY_RETURN);
Далее идет основная функция void setup()
.
Keyboard.begin(); // Начало эмуляции клавиатуры delay(5000); // Задержка 5000 мс Keyboard.press(KEY_LEFT_GUI); // Нажимаем клавишу «Пуск» delay(5000); Keyboard.release(KEY_LEFT_GUI); // Отпускаем ее delay(500); Keyboard.print("terminal"); // Пишем в поиске delay(500); pressEnter(); delay(1000); Keyboard.print("echo Hello World >> test"); // На этом моменте терминал уже открыт delay(50); pressEnter(); delay(1000); Keyboard.print("leafpad test"); // Открываем файл test в Leafpad delay(50); pressEnter();
Сложно? Пока нет, но станет сложнее, когда вместо Hello World
ты запишешь в файл код зловреда и запустишь его на исполнение.
Поясню выставление пауз: тут нужен трепетный подход, потому как ОС может не успеть отреагировать на команды. Допустим, ты не выставил паузу и подключил свою ардуину. Она начинает выполнять записанные действия еще до того, как операционная система поймет, что это за устройство, и подключит его как клавиатуру. То есть половина команд просто уйдет в никуда, и нужного результата мы не получим. Такая же история между нажатием клавиш и набором текста. Нашей жертве (компу) необходимо давать время, иначе она не поймет, чего от нее вообще хотят.
Есть еще один важный нюанс с раскладкой клавиатуры. Мы написали код, ориентированный на английскую раскладку. Если в момент подключения нашего устройства к атакуемому компьютеру раскладка будет не та, под которую писался скетч, то нужного нам действия не получится. Горячие и функциональные клавиши, конечно, отреагируют как надо, а вот с набором текста возникнут проблемы. Вместо «terminal» получится «еукьштфд», со всеми вытекающими последствиями.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Примеры атак.
При проведении реальных HID-атак можно начать с быстрого создания локального пользователя. Демонстрирую это на примере Windows 10 сборки 1607.
![](https://xakep.ru/wp-content/uploads/2018/09/186977/8.png#26143358)
Согласись — удобно. Незаметно вставил микроардуину в USB-порт чужого компа, и через несколько секунд на нем уже появилась локальная учетка с заданными тобой параметрами логин/пароль.
Глянем чуть глубже и немного усложним. Подготовим FTP-сервер и загрузим на него боевую нагрузку. И вот так будет выглядеть загрузка файла и его запуск. Благодаря самой загрузке это займет чуть больше времени, но, к примеру, админская сессия того стоит.
![](https://xakep.ru/wp-content/uploads/2018/09/186977/10.png#26143358)
Поясню момент с файлом: да, можно выполнить все команды вводом, но суть опять в тайм-ауте исполнения. Мы не знаем, как долго может сервер реагировать на команды (на это влияет скорость интернет-соединения, скорость работы самого компьютера и еще куча разных факторов). Также стоит учесть то, что ты можешь использовать в своих тестах SSD (и все вроде бы работает), но при подключении к компьютеру с HDD... думаю, ты уловил смысл.
Наверняка ты обращал внимание, что USB-клавиатура определяется BIOS еще до загрузки ОС. В UEFI вообще интегрирована расширенная поддержка USB-портов разных версий с готовыми профилями для HID-девайсов и USB-накопителей. Большой объем флеш-памяти современных материнок и унифицированная структура UEFI позволяют загрузить низкоуровневый бэкдор, просто вставив копеечный хакерский девайс из ардуины.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Как защититься от HID-атак.
Как мне кажется, самый надежный способ защиты для любой ОС — блокировать учетную запись (паролем, RFID-чипом или биометрическим сканером), когда уходишь из-за компа. Фишка атаки в беспалевности и скорости, поэтому вряд ли пентестер будет вставлять такую штуку в заблокированный компьютер (хотя в некоторых довольно крупных организациях девочки из бухгалтерии практикуют не блокировку компьютера, а выключение монитора. Как ты понимаешь, это не подойдет). Также можно совсем отключить незанятые USB-порты (в BIOS или физически), но что помешает атакующему вытащить легитимную клаву и подключить вместо нее эмулятор на ардуине? Только настройки политики безопасности и сторонний софт для контроля подключений по USB.
Что касается ОС Windows, то тут есть несколько решений. Во-первых, комплексные антивирусы. Они уже научились определять класс BadUSB и блокировать такие устройства. К примеру, в серверной части «Антивируса Касперского» при настройке политик безопасности есть функция «Защита от атак BadUSB».
![](https://xakep.ru/wp-content/uploads/2018/09/186977/11.png#26143358)
Во-вторых, есть средства борьбы с подобного рода атаками при помощи групповых политик. Необходимо открыть gpedit.msc
, пройти цепочку «Конфигурация компьютера → Административные шаблоны → Система → Ограничения на установку устройств». В этом разделе есть несколько правил. Нам нужно «Запретить установку устройств, не описанных другими параметрами политики». Суть правила заключается в том, что при его включении драйвер нового устройства не будет автоматически установлен, если только этот девайс прямо не указан в политиках. Есть, конечно, небольшое неудобство в данном методе, но если все грамотно настроить, то проблем не будет.
![](https://xakep.ru/wp-content/uploads/2018/09/186977/12.png#26143358)
В своих исследованиях защиты от HID-атак я использовал в качестве жертвы комп с Windows 10 (1607). В первом случае антивирь Касперского сработал на ура. Во втором ОС сама заблокировала мое устройство. Правда, когда я попытался подключить вторую клавиатуру к компьютеру, тоже получил отказ.
Для Linux можно воспользоваться udev и его правилами. Необходимо создать файл /etc/udev/rules.d/10-usbblock.rules
и вписать в него следующее содержимое (классы можно блокировать любые):
#ACTION=="add", ATTR{bInterfaceClass}=="03" RUN+="/bin/sh -c 'echo 0 >/sys$DEVPATH/../authorized'"
Теперь можно заблокировать добавление новых HID-устройств командой
sed -i 's/#//' /etc/udev/rules.d/10-usbblock.rules; udevadm control --reload-rules
А вот команда для разблокировки:
sed -i 's/^/#/' /etc/udev/rules.d/10-usbblock.rules; udevadm control --reload-rules
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Заключение.
Эмуляция клавиатуры — опасный инструмент в умелых руках. Это было наглядно продемонстрировано еще в 2014 году на Black Hat. Доклад Building Trojan Hardware at Home вызвал всплеск интереса к данной теме.
Изначально в серьезность угрозы верилось с трудом, а в Сети циркулировали шуточки на тему USBola, сравнивающие эту атаку с известным вирусом. После публикации статьи Computer Ebola шутки закончились.
За последние годы ситуация изменилась. С одной стороны, стало проще создавать копеечные эмуляторы клавиатуры, находить примеры готовых скетчей и пейлоадов. С другой — некоторые комплексные системы защиты научились распознавать хакерские HID-девайсы, а в современных ОС появились расширенные настройки политик безопасности, препятствующие их несанкционированному подключению.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)
Social Engineering - Канал посвященный Социальной инженерии, профайлингу, НЛП, Хакингу, Анонимности и безопасности в сети интернет, OSINT, Пентест, Даркнету и все что с ним связано. Добро пожаловать ;-)
S.E.Book - Литература социального инженера.
@Social_Engineering_bot - Бот обратной связи.
![](https://tgraph.io/file/a7a9b2fcbf18ede1a5748.png)