
Настройте ваш Pi Zero 2W как BadUSB
Программируемая платформа для атак BadUSB / HID, построенная на Raspberry Pi Zero 2 W. Pi эмулирует составное USB-устройство (клавиатуру плюс опциональный доступный только для чтения том массового хранения) и выполняет пейлоады в стиле Ducky-Script на хосте, к которому она подключена. Предназначена для авторизованных заданий red-команд, тестирования на проникновение и CTF.
⚠️ Юридическое уведомление. Используйте только на системах, которыми вы владеете или на которые имеете явное письменное разрешение на тестирование. Несанкционированный доступ незаконен в большинстве юрисдикций, и притворство, что вы не знали, не поможет.
configured — никаких
ложных запусков пейлоада при загрузке.LAYOUT.IF / ELSE, WHILE, HOLD / RELEASE, INJECT_MOD,
генераторы RANDOM_*, STRING_BLOCK / STRINGLN_BLOCK, DEFINE.ExecStop, который корректно отключает гаджет.
Никаких остаточных состояний configfs, перезапуск работает без перезагрузки./dev/hidg0 — никаких узлов устройств,
доступных на запись всем.+----------------+ USB cable +-------------+
| Raspberry Pi | ===================>>> | Host PC |
| Zero 2 W | (Pi эмулирует HID + | (целевой) |
| (это устройство)| опциональный диск) | |
+----------------+ +-------------+
|
| /home/pi/pi-badusb/
|
+-- badusb.service ----> monitor_and_run.py
|
| при `state == configured`:
v
run_payload.py
|
v
/dev/hidg0 (USB HID гаджет)
badusb.service запускает gadget_setup.sh,
который с помощью configfs/libcomposite собирает USB-гаджет с
функцией HID-клавиатуры и (опционально) LUN массового хранения на основе
плоского образа файла в /var/badusb/storage.img.monitor_and_run.py. Он опрашивает
/sys/class/udc/<udc>/state и ждёт configured — состояние USB-спецификации,
означающее, что хост успешно перечислил гаджет. (Мы не используем существование
/dev/hidg0 как сигнал: оно истинно в момент привязки гаджета к UDC при загрузке,
независимо от того, что-либо подключено или нет.)run_payload.py,
который разбирает payload.txt и записывает HID-отчёты в /dev/hidg0.configured.| Компонент | Примечание |
|---|---|
| Raspberry Pi Zero 2 W | Протестировано на ревизии оборудования 2026-05. Более старые Pi Zero W с драйвером BCM2835 dwc_otg также работают в принципе, но этот README предполагает 2 W с dwc2. |
| Кабель micro-USB → USB-A | Или переходник в форм-факторе «USB-флешки», позволяющий подключить Pi напрямую к порту хоста. |
| Опционально: отдельное зарядное устройство | Если вы хотите питать Pi от источника, отличного от хоста, чтобы слушатель мог загрузиться до подключения к целевому устройству (в противном случае питание подаётся от порта хоста). |
Pi Zero 2 W имеет два micro-USB порта:
PWR IN — только питание, не выставляет линии данных USB на блок OTG dwc2.USB — порт данных OTG; сюда подключаетесь к целевому устройству.| Требование | Зачем |
|---|---|
| Raspberry Pi OS (Debian Bookworm или Trixie, рекомендуется 64-битная Lite) | Скрипт установки пишет в /boot/firmware/... на Bookworm+ и делает откат к /boot/... на старых образах. |
| Python 3 | Поставляется с Pi OS. |
mkfs.vfat | Для форматирования образа массового хранения при первом запуске. Отключите, если массовое хранение не используется. |
| Доступ root для настройки | Затрагивает systemd, udev и /boot/firmware/config.txt. |
Клонируйте или скопируйте репозиторий на Pi, затем запустите установщик:
git clone http://your-gitea/admin/Pi-Zero-2W-Bad-USB.git /home/pi/pi-badusb
cd /home/pi/pi-badusb
sudo ./install.sh
sudo reboot
После перезагрузки включите и запустите сервис:
sudo systemctl enable --now badusb.service
journalctl -u badusb -f
install.sh идемпотентен — запускайте его повторно при изменении файлов проекта.
Он:
/boot/firmware (Bookworm+) vs /boot (старые версии).dtoverlay=dwc2,dr_mode=otg активен под блоком [all]
в config.txt. По умолчанию Raspberry Pi Imager помещает эту строку
внутрь фильтра [cm5], который не применяется на Pi Zero 2 W; установщик
добавляет переопределение с меткой, чтобы повторные запуски не дублировали её.modules-load=dwc2 присутствует в cmdline.txt.g_ether всё ещё присутствует в cmdline.txt (он перехватывает
UDC у libcomposite и ломает режим гаджета)./etc/systemd/system/badusb.service./etc/udev/rules.d/99-badusb-hidg.rules,
чтобы /dev/hidg0 был доступен для записи группе plugdev.pi в группу plugdev./var/badusb/ для образа массового хранения.# Запуск / остановка / перезапуск
sudo systemctl start badusb
sudo systemctl stop badusb
sudo systemctl restart badusb # безопасно, даже если подключено
# Просмотр лога в реальном времени
journalctl -u badusb -f
# Отключение автозапуска при загрузке
sudo systemctl disable badusb
# Настройка таймингов (создаёт переопределение drop-in)
sudo systemctl edit badusb
# (вставьте блок [Service] с Environment="BADUSB_REARM_COOLDOWN_S=8" и т.д.)
sudo systemctl restart badusb
Сервис зависит от sys-kernel-config.mount и наличия UDC,
поэтому он не сможет запустить пейлоады, пока гаджет не будет действительно готов.