Когда речь заходит о Flipper Zero, многие вспоминают RFID, NFC, Sub-GHz. Но одна из самых интересных возможностей устройства — это JavaScript-движок и модуль BadUSB, который позволяет превратить Flipper в программируемую USB-клавиатуру.
В этой статье разберём небольшой, но показательный скрипт, который автоматически устанавливает набор инструментов для пентеста(или другого ПО) на macOS через Homebrew. И посмотрим, почему JavaScript на Flipper значительно интереснее классического DuckyScript.
Почему одного DuckyScript уже мало?
Традиционные BadUSB-сценарии обычно пишутся на DuckyScript:
DELAY 1000GUI SPACEDELAY 500STRING terminalENTERSTRING brew install nmapENTER
Подход рабочий, но чаще упирается в ограничения:
-
нет циклов;
-
нет условий;
-
нет модулей;
-
сложно обрабатывать состояния;
-
код плохо масштабируется.
Во Flipper доступен JavaScript API, который позволяет писать полноценную логику:
Например:
for (let i = 0; i < apps.length; i++) { ...}
По сути мы получаем миниатюрный сценарный движок прямо внутри устройства.
Разбираем скрипт
Начинается всё с подключения модулей, где первый отвечает за уведомления Flipper, а второй — за эмуляцию HID-устройства:
let notify = require("notification");let badusb = require("badusb");
Следом задаётся список программ:
const apps = [ 'nmap', 'metasploit-framework', 'hydra'];
Список можно расширять любым количеством пакетов.
Маскируемся под клавиатуру Apple
Следующий блок задаёт USB-идентификаторы:
badusb.setup({ vid: 0x05AC, pid: 0x026C, mfr: "Apple", product: "Keyboard"});
Здесь используются VID и PID производителя Apple(гуглятся или смотрятся в настройках).
Проверяем подключение
После короткой индикации:
notify.blink("green", "short");
скрипт проверяет наличие соединения:
if (badusb.isConnected()) {
Это уже преимущество JavaScript перед DuckyScript. Можно выполнять действия только при наличии активного USB-соединения.
Автоматический запуск терминала
Далее происходит открытие Spotlight(Command + Space):
badusb.press("GUI", "SPACE");
После небольшой паузы вводится:
badusb.print("iterm", 100);badusb.press("ENTER");
Скрипт ищет iTerm и запускает его.
При желании можно заменить на:
badusb.print("terminal");
Установка инструментов
Самая интересная часть, так как больше всего показывается превосходство над DuckyScript:
for (let i = 0; i < apps.length; i++) { badusb.println("brew install " + apps[i], 100); delay(4000); }
На каждую программу, cоздаётся команда установки через brew:
brew install nmapbrew install metasploit-frameworkbrew install hydra
То есть список пакетов превращается в набор последовательных установок.
Например:
const apps = [ 'nmap', 'masscan', 'sqlmap', 'john-jumbo'];
Таким образом один и тот же сценарий можно использовать для разных ролей:
-
пентестер;
-
DevOps-инженер;
-
разработчик;
-
аналитик безопасности.
Обратная связь через Flipper
После завершения цикла:
notify.success();
Flipper отображает успешное выполнение.
Дополнительно в терминал выводится сообщение:
echo 'Installation complete!'
Где это действительно полезно
Чаще демонстрации BadUSB сводятся к “взлом умный холодильник за 5 секунд”. Но, как по мне, гораздо интереснее сценарии автоматизации(не только просто установок приложений).
Подготовка пентест-станции
При выдаче нового ноутбука специалисту:
const apps = [ 'nmap', 'hydra', 'metasploit-framework', 'wireshark', 'sqlmap'];
DevOps-настройка
const apps = [ 'terraform', 'ansible', 'kubectl', 'helm'];
Что можно улучшить ?
У исходного скрипта есть несколько ограничений.
Нет проверки Homebrew
Если Homebrew не установлен:
brew: command not found
весь сценарий остановится.
Логичнее сначала выполнить проверку:
which brew
и при необходимости установить пакетный менеджер.
Жёсткие задержки
Сейчас используется:
delay(4000);
Но установка приложение, особенно metasploit, может занимать минуты.
Фиксированные паузы работают не всегда надёжно.
Нет обработки ошибок
Сценарий предполагает, что:
-
пользователь авторизован;
-
iTerm установлен;
-
Homebrew присутствует;
-
сеть работает.
Почему JavaScript меняет правила игры
Идея этого примера не в установке Nmap или Hydra.
Интереснее другое: Flipper превращается из “умной флешки с макросами” в полноценную платформу автоматизации.
Появляются:
-
циклы;
-
условия;
-
работа с модулями;
-
управление логикой выполнения;
-
интерактивная обратная связь через устройство.
Поэтому, как по мне, JavaScript-сценарии для Flipper выглядят перспективнее классических DuckyScript-пейлоадов.
Итоги
Рассмотренный скрипт занимает всего несколько десятков строк, но хорошо показывает эволюцию BadUSB-подхода.
Flipper уже не просто отправляет заранее записанную последовательность нажатий клавиш. Он принимает решения, проверяет состояние подключения, управляет логикой выполнения и автоматизирует рутинные действия.
Исходный код, можно посмотреть здесь: https://gitlab.com/DuDlick/flipper-auto-installer/-/blob/main/download_all.js?ref_type=heads
ссылка на оригинал статьи https://habr.com/ru/articles/1052538/