Gspy device windows что это
Злой HID. Делаем и программируем хакерский девайс для HID-атак
Содержание статьи
HID-атаки
HID-атака — хитрая разновидность BadUSB. Ее суть сводится к тому, что в USB-порт вставляется простейший хакерский девайс, эмулирующий устройство ввода. Практически любая современная ОС поддерживает plug-n-play и содержит универсальный драйвер устройства каждого класса. Хакерский девайс автоматически определяется ОС как нужный нам Human Interface Device — HID. Далее ОС безо всяких проверок принимает его команды.
Есть много готовых девайсов для атак через USB-порт. Например, Rubber Ducky и ее разновидности. На мой взгляд, интереснее разобраться, как сделать такую штуку самому. Это довольно просто (когда знаешь как) и дешево. Нам даже флешка на этот раз не понадобится.
Преимуществ HID-атаки перед атакой вручную сразу несколько: это скорость, незаметность и автоматизация. Все необходимые действия выполнятся быстрее, чем ты сможешь набрать то же на клавиатуре, и без опечаток (если их не было изначально). Подключить к USB-порту миниатюрное устройство можно за пару секунд. Это не такое палево, как садиться за чужую клавиатуру и поминутно оглядываться через плечо. Из-за малых габаритов самодельный девайс легко спрятать и пронести через охрану даже на режимный объект. В крайнем случае можно просто выдать его за флешку и «случайно» уничтожить легким нажатием ботинка, после чего изготовить хоть мешок других таких же.
WARNING
Статья написана в исследовательских целях. Вся информация в ней носит ознакомительный характер. Ни автор, ни редакция не несет ответственности за неправомерное использование упомянутых в ней аппаратных платформ, программ и техник!
Выбираем аппаратную платформу
Сотворить такую хакерскую железку можно и на одноплатниках (вроде Raspberry Pi), но это все равно что перевозить ноутбук на фуре. Есть «братья меньшие» не такие известные, но не менее «злые» и опасные в руках из плеч. По сути, для выполнения HID-атаки нам необходим микроконтроллер, USB-порт и минимальная электронная обвязка, чтобы это все заработало.
Arduino Micro Pro
На мой взгляд, это один из идеальных кандидатов на роль хакерского девайса.
Xakep #234. Взломать iPhone
Плата размером 33×16 мм работает на микроконтроллере ATmega32u4 и имеет на борту 28 Кбайт свободной памяти (вообще памяти 32 Кбайт, но 4 Кбайт уже заняты загрузчиком). С ней очень легко работать, так как проект Arduino хорошо поддерживается и для него написано много документации. Также для него есть готовая среда разработки Arduino IDE с дистрибутивами для Windows, Linux и macOS. Купить плату можно от 350 рублей.
Teensy Low Cost
Хорошая альтернатива — семейство плат Teensy, совместимых с Arduino. С ними также можно использовать Arduino IDE. Например, плата Teensy LC размером 17×35 мм оснащена процессорным ядром ARM Cortex-M0+ и 64 Кбайт памяти. Купить ее в России может быть проблематично (основной упор делается на продажи Teensy 3.2–3.6), но заказать из-за рубежа вполне возможно. Цены на Teensy LC начинаются от 10 долларов.
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.
Работает данная плата под управлением микроконтроллера Attiny85. С памятью у нее негусто — всего 8 Кбайт, из которых два уже заняты загрузчиком. Совсем не вдохновляет ограничение ROM в 512 байт под исполняемый код, но оптимизация тебе в помощь.
Процессор (если его можно так назвать) опять же совместим с Arduino IDE, только желательно использовать версию 1.6.5r2, а 1.6.6 и 1.6.7 не рекомендуется вовсе. Digispark Wiki любезно предоставляет мануал по «вживлению» этой платы в Arduino IDE, или можно скачать уже специально заточенные версии ПО.
Альтернативы
Выше я привел для примера три платы, которые, на мой взгляд, идеально подходят для 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.
Обрати внимание, что из всех рассмотренных плат лишь Digispark оснащен USB-портом типа А. Остальные имеют разъемы micro-USB и mini-USB, поэтому советую сразу обзавестись OTG-адаптером на интерфейс платы или кабелем для подключения нашего хакерского девайса к компу.
Делаем хакерский девайс за пять долларов
Приступим к практической части на примере платы Arduino micro Pro и переходника mini-USB ↔ USB Type A. В качестве основной ОС используется Kali Linux (4.14.0-kali3-amd64), но на других сборках Linux и в Windows проблем возникнуть не должно. Arduino IDE v. 1.8.6 скачана с официального сайта. В качестве жертвы выбран тот же компьютер.
Готовим софт
Скачиваем дистрибутив, распаковываем. В каталоге лежит файл с символичным названием install.sh. Его и запустим на исполнение:
Минуту-две смотрим на надпись Adding desktop shortcut, menu item and file associations for Arduino IDE. и вуаля! На рабочем столе появляется ярлык для запуска.
Теперь подключаем нашу плату. Весь нужный софт установился вместе с IDE, поэтому нет необходимости что-то доустанавливать, монтировать и запускать.
Командой lsusb можно проверить, что устройство определено верно и все идет по плану (Arduino Micro Pro определяется как Leonardo).
Следующая команда покажет порт, на котором повис наш Leonardo:
Теперь можно открыть саму IDE. Сразу после запуска идем в меню «Инструменты» и в разделе «Платы» выбираем Arduino Leonardo. Там же в «Инструментах» выбираем нужный порт (он там, скорее всего, будет один) из списка tty.
После этих действий связь платы с компьютером установлена, программное обеспечение настроено, можно переходить к написанию скетча (так называют код для Arduino-совместимых макетных плат).
После запуска Arduino IDE картинка будет следующая.
Интерфейс Arduino IDE
Есть еще один вариант запустить подобие Arduino IDE. На сайте представлен Arduino Web Editor. На мой взгляд, он менее удобен, но тут уже кому как по вкусу. Для его использования будет необходимо зарегистрироваться на сайте либо авторизоваться через Google-аккаунт. Также для связи браузера с устройством потребуется установить плагин (он есть для Chrome и Firefox). Его удобство в том, что все написанные скетчи будут онлайн (с любой точки земли можно получить доступ к ним), но я в таких тонких деталях предпочитаю локальную работу.
Интерфейс Arduino Web Editor
В остальном редакторы похожи.
Пишем скетч
Далее основные элементы, которыми мы будем пользоваться:
Ключи нажимаемых клавиш можно найти тут. Для простоты мы говорим «нажимаем/отпускаем клавишу», подразумевая, что контроллер отправляет ее скан-код, имитируя нажатие командами Keyboard.press/Keyboard.release.
Каждый, кто немного касался программирования, знает о том, как работать с повторяющимися вызовами. Если мы начинаем копипастить участки кода, то пора вызывать парней в белых халатах. Поэтому повторения будем выполнять с помощью отдельной функции.
Задается она вот такой конструкцией:
В скетче указывается как function_name(). Для начала другие элементы управления платой нам не понадобятся.
Теперь можно попробовать написать свой первый скетч. Ведь в теории между теорией и практикой разницы нет, а на практике — есть.
Скетч выглядит следующим образом.
Сложно? Пока нет, но станет сложнее, когда вместо Hello World ты запишешь в файл код зловреда и запустишь его на исполнение.
Поясню выставление пауз: тут нужен трепетный подход, потому как ОС может не успеть отреагировать на команды. Допустим, ты не выставил паузу и подключил свою ардуину. Она начинает выполнять записанные действия еще до того, как операционная система поймет, что это за устройство, и подключит его как клавиатуру. То есть половина команд просто уйдет в никуда, и нужного результата мы не получим. Такая же история между нажатием клавиш и набором текста. Нашей жертве (компу) необходимо давать время, иначе она не поймет, чего от нее вообще хотят.
Есть еще один важный нюанс с раскладкой клавиатуры. Мы написали код, ориентированный на английскую раскладку. Если в момент подключения нашего устройства к атакуемому компьютеру раскладка будет не та, под которую писался скетч, то нужного нам действия не получится. Горячие и функциональные клавиши, конечно, отреагируют как надо, а вот с набором текста возникнут проблемы. Вместо «terminal» получится «еукьштфд», со всеми вытекающими последствиями.
Примеры атак
При проведении реальных HID-атак можно начать с быстрого создания локального пользователя. Демонстрирую это на примере Windows 10 сборки 1607.
Создаем пользователя
Согласись — удобно. Незаметно вставил микроардуину в USB-порт чужого компа, и через несколько секунд на нем уже появилась локальная учетка с заданными тобой параметрами логин/пароль.
Глянем чуть глубже и немного усложним. Подготовим FTP-сервер и загрузим на него боевую нагрузку. И вот так будет выглядеть загрузка файла и его запуск. Благодаря самой загрузке это займет чуть больше времени, но, к примеру, админская сессия того стоит.
Загружаем файл с FTP
Поясню момент с файлом: да, можно выполнить все команды вводом, но суть опять в тайм-ауте исполнения. Мы не знаем, как долго может сервер реагировать на команды (на это влияет скорость интернет-соединения, скорость работы самого компьютера и еще куча разных факторов). Также стоит учесть то, что ты можешь использовать в своих тестах SSD (и все вроде бы работает), но при подключении к компьютеру с HDD. думаю, ты уловил смысл.
Наверняка ты обращал внимание, что USB-клавиатура определяется BIOS еще до загрузки ОС. В UEFI вообще интегрирована расширенная поддержка USB-портов разных версий с готовыми профилями для HID-девайсов и USB-накопителей. Большой объем флеш-памяти современных материнок и унифицированная структура UEFI позволяют загрузить низкоуровневый бэкдор, просто вставив копеечный хакерский девайс из ардуины.
Как защититься от HID-атак
Как мне кажется, самый надежный способ защиты для любой ОС — блокировать учетную запись (паролем, RFID-чипом или биометрическим сканером), когда уходишь из-за компа. Фишка атаки в беспалевности и скорости, поэтому вряд ли пентестер будет вставлять такую штуку в заблокированный компьютер (хотя в некоторых довольно крупных организациях девочки из бухгалтерии практикуют не блокировку компьютера, а выключение монитора. Как ты понимаешь, это не подойдет). Также можно совсем отключить незанятые USB-порты (в BIOS или физически), но что помешает атакующему вытащить легитимную клаву и подключить вместо нее эмулятор на ардуине? Только настройки политики безопасности и сторонний софт для контроля подключений по USB.
Что касается ОС Windows, то тут есть несколько решений. Во-первых, комплексные антивирусы. Они уже научились определять класс BadUSB и блокировать такие устройства. К примеру, в серверной части «Антивируса Касперского» при настройке политик безопасности есть функция «Защита от атак BadUSB».
Настройка политики безопасности с сервера управления Kaspersky
Настройка правил групповой политики Windows 10
В своих исследованиях защиты от HID-атак я использовал в качестве жертвы комп с Windows 10 (1607). В первом случае антивирь Касперского сработал на ура. Во втором ОС сама заблокировала мое устройство. Правда, когда я попытался подключить вторую клавиатуру к компьютеру, тоже получил отказ.
Для Linux можно воспользоваться udev и его правилами. Необходимо создать файл /etc/udev/rules.d/10-usbblock.rules и вписать в него следующее содержимое (классы можно блокировать любые):
Теперь можно заблокировать добавление новых HID-устройств командой
А вот команда для разблокировки:
Заключение
Эмуляция клавиатуры — опасный инструмент в умелых руках. Это было наглядно продемонстрировано еще в 2014 году на Black Hat. Доклад Building Trojan Hardware at Home вызвал всплеск интереса к данной теме.
Изначально в серьезность угрозы верилось с трудом, а в Сети циркулировали шуточки на тему USBola, сравнивающие эту атаку с известным вирусом. После публикации статьи Computer Ebola шутки закончились. Вдобавок Карстен Нол подлил масла в огонь, создав список уязвимых устройств, которые удобно использовать для проведения атак вида BadUSB.
За последние годы ситуация изменилась. С одной стороны, стало проще создавать копеечные эмуляторы клавиатуры, находить примеры готовых скетчей и пейлоадов. С другой — некоторые комплексные системы защиты научились распознавать хакерские HID-девайсы, а в современных ОС появились расширенные настройки политик безопасности, препятствующие их несанкционированному подключению.
Отобразить все скрытые устройства в диспетчере задач
По умолчанию диспетчер устройств не отображает устройства, которые в данный момент не подключены к компьютеру (так называемые устройства-призраки). Это касается всех версий Windows: от Windows XP до Windows 8.1. Устройства не отображаются даже в случае, если в меню «Вид» («View») включить режим «Показать скрытые устройства» («Show hidden devices»). Как с этим бороться? Как удалить (например) сетевую карту [со всеми ее настройками]?
Для этого выполните следующую инструкцию:
Обратите внимание, что после закрытия окна командной строки Windows обнуляет переменную devmgr_show_nonpresent_devices=1, установленную на шаге 2, и устройства-призраки перестают отображаться при выборе пункта «Показать скрытые устройства» («Show hidden devices»).
Постоянное отображение устройств-призраков
Разработчики или опытные пользователи, которые хотят, чтобы неподключенные к компьютеру устройства отображались в диспетчере устройств, могут установить эту переменную окружения глобально:
Примечание. Используйте этот способ только для целей устранения неполадок или во время разработки, а также для исключения возможности случайного удаления пользователем необходимого устройства, не подключенного к компьютеру (например, устройства USB или стыковочного узла, не подключенного к переносному компьютеру).
Дополнительная информация
В диспетчере устройств в дополнение к отображаемым устройствам существует два типа скрытых 8устройств:
Работа с устройством USB HID в ОС Windows через Windows API
В прошлой статье я рассказывал как сделать устройство USB HID на микроконтроллере stm32. Но, как вы понимаете, сделать устройство — это только половина дела, вторая половина — как с этим устройством потом работать. Сегодняшняя статья как раз будет посвящена тому, как работать с устройством USB HID из операционной системы Windows с использованием Windows API. Кстати, наиболее полное и толковое описание работы с USB (не только с классом HID) можно найти в книге от Jan Axelson — «USB Complete». Это вообще очень мощная тётка, шикарно пишет (у неё есть книги не только про USB), жаль только нет переводов этих книг с английского на русский (по крайней мере я не нашёл), но и так тоже пойдёт.
В качестве подопытного устройства для тестов я буду использовать как раз USB HID устройство на микроконтроллере stm32 из статьи, ссылка на которую дана выше.
Приведённый в статье пример написан на С++ Builder 10 (из Embarcadero RAD Studio). Для работы с исходниками, на компьютере помимо RAD Studio должен быть установлен Windows DDK (у меня установлен Windows Driver Development Kit Version 7.1.0). Вот ссылка на статью о том, как «подружить» C++ Builder и Windows DDK.
В ОС Windows при подключении устройства в систему, операционка выясняет что это за устройство, к какому оно относится классу и какой для него использовать драйвер. После этого драйвер класса или устройства может зарегистрировать для этого устройства один или несколько классов интерфейса. В дальнейшем подключение выполняется к какому либо из этих интерфейсов. То есть, грубо говоря, у устройства может быть несколько разных интерфейсов, подключаться к устройству можно через любой из них и это будут разные подключения, поэтому вместо термина «подключение к устройству» правильнее, насколько я понимаю, говорить о подключении к тому или иному интерфейсу устройства.
Каждый класс интерфейса имеет свой GUID, — уникальное 128-битное значение, разбитое на 5 групп шестнадцатиричных символов, типа вот такого: <50127DC3-0F36-415E-A6CC-4CB3BE910B65>. Информация обо всех когда-либо подключенных устройствах, использующих тот или иной класс интерфейса хранится в системном реестре. GUID-ы зарегистрированных классов интерфейсов для Windows 7 можно найти в ветке
HKEY_LOCL_MACHINE/Microsoft/Windows NT/CurrentVersion/DeviceDisplayObjects/InterfaceInformation,
а список всех когда либо подключенных устройств, использовавших эти интерфейсы — в ветке
HKEY_LOCL_MACHINE/SYSTEM/CurrentControlSet/Control/DeviceClasses.
Для Windows 10 список предопределённых классов интерфейсов устройств можно найти в официальной документации Microsoft.
Специальной API-функцией, вызванной с определёнными флагами, можно получить набор информации обо всех используемых в настоящий момент интерфейсах определённого класса. Вообще, обязательно изучите какие флаги используются при вызове тех или иных приведённых ниже API-функций, — там много интересного.
Таким образом, чтобы найти в системе наше устройства (его интерфейс) и получить заветный путь к нему — нужно пройти небольшой квест:
Выполнить этот квест помогут API-функции, описанные в таблице ниже (в среднем столбце указано из какой библиотеки соответствующая функция вызывается):
имя API-функции | библиотека | предназначение |
---|---|---|
HidD_GetHidGuid | hid.dll | получает GUID интерфейса класса HID |
SetupDiGetClassDevs | setupapi.dll | получает список интерфейсов с указанным GUID и набор информации о каждом из них (грубо говоря кусок реестра со списком нужных интерфейсов и информацией о каждом из них) |
SetupDiDestroyDeviceInfoList | setupapi.dll | освобождает ресурсы, используемые функцией SetupDiGetClassDevs |
SetupDiEnumDeviceInterfaces | setupapi.dll | получает из полученного ранее набора информации об интерфейсах информацию об одном конкретном интерфейсе |
SetupDiGetDeviceInterfaceDetail | setupapi.dll | получает подробную информацию о контретном интерфейсе, включая путь для подключения к нему |
Теперь несколько слов о том, как опознать в списке «своё» устройство. Самый простой метод идентификации — по VID/PID, альтернативный вариант — используя элемент Usages (возможности). Usages состоит из двух полей, которые вместе описыавают назначение данных в репортах HID-устройства. Первое поле называется Usage, второе — Usage Page (Page ID). Эти поля могут также использоваться для идентификации функционального назначения устройства (мышь, Джостик, геймпад…) На usb.org лежит pdf-документ, в котором описаны стандартные значения Usage и Usage Page. Дополнительно можно проверять задаваемые при конфигурировании строковые дескрипторы Manufacturer и Product, скажем, комбинируя их с Usages.
Кстати, в созданном нами ранее HID-устройстве на stm32 (ссылка на которое приводится в начале статьи) мы сами не создавали дескрипторы репортов и не прописывали Usages, они были прописаны где-то на уровене middleware. Если бы мы хотели сделать это самостоятельно, то нужно было бы создавать HID-устройство на основе класса Custom.
Учтите, что в системе может быть несколько HID-устройств с одинаковыми Usages. Например, подключив к системе две мышки, мы будем видеть на экране движение каждой из них. Это потому что системе пофиг от какой мыши получать информацию, она получает её от всех устройств, у которых в Usages указано что это мышь. С другой стороны ничего не мешает нам также подключить к системе два устройства с одинаковыми VID/PID, так что… В общем мы будем использовать идентификацию устройства по VID/PID.
Кстати, мы в приведённой в качестве примера программе сможем увидеть USB мышь и клавиатуру, но не сможем к ним подключиться, поскольку к этим устройствам операционка подключается в режиме монопольного доступа и откажет в таком доступе функции CreateFile. Но это так, к слову.
После того, как мы определили путь для подключения и подключились к устройству — мы можем специальными функциями запросить описание устройства и его репортов (дескрипторы). API-функции, используемые для запроса разных описаний, перечислены в таблице ниже:
имя API-функции | предназначение |
---|---|
HidD_GetPreparsedData | возвращает указатель на буфер, содержащий информацию о репортах HID-устройства |
HidD_FreePreparsedData | освобождает ресурсы, выделенные функцией HidD_GetPreparsedData |
HidD_GetCaps | получает структуру HID_CAPS, содержащую информацию о возможностях устройства, — поддерживаемых устройством типах репортов и типах информации в них (Usage, UsagePage, InputReportByteLength, OutputReportByteLength, FeatureReportByteLength… Размеры репортов указываются с учётом Report ID, то есть на единицу больше длины пользовательской информации в них). Эту структуру формирует парсер HID, который вообще-то может не суметь итерпретировать все полученные дескрипторы. |
HidD_GetPhisicalDescriptor 1 | извлекает дескриптор устройства (сырой, без парсинга) |
HidD_GetAttributes | возвращает указатель на структуру, содержащую VID, PID и Release Number |
HidD_GetManufacturerString 1 | возвращает строку Manufacturer |
HidD_GetProductString 1 | возвращает строку Product |
HidD_GetSerialNumberString 1 | возвращает строку SerialNumber |
1 — только для ОС старше Win98 |
Для обмена данными с устройствами USB HID могут использоваться следующие API-функции:
имя API-функции | предназначение |
---|---|
HidD_GetFeature | Читает из устройства Feature-репорт, используя управляющую передачу. |
HidD_SetFeature | Отправляет устройству Feature-репорт, используя управляющую передачу. |
HidD_GetInputReport 1 | Читает Input-репорт, используя управляющую передачу. Данные читаются в обход буфера, прочитанного драйвером HID |
HidD_SetOutputReport 1 | Отправляяет устройству Output-репорт, используя управляющую передачу. |
ReadFile 1 | Читает Input-репорт, используя передачу типа прерывание. Данные на самом деле читаются из буфера, заполняемого драйвером HID, который с заданным периодом опрашивает устройство. Если буфер пуст, функция просто ждёт, пока в него придут данные. |
WriteFile 1 | Отправляет Output-репорт, используя, если возможно, передачу типа прерывание, в противном случае используется управляющая передача. |
Ниже показана структурная схема взаимодействия ПО хоста (в том числе API-функций) и HID-устройства: