Quando o assunto é Flipper Zero, muitos pensam imediatamente em RFID, NFC e Sub-GHz. No entanto, uma das capacidades mais intrigantes do dispositivo reside em seu motor JavaScript e no módulo BadUSB, que o capacita a funcionar como um teclado USB programável. Neste artigo, vamos analisar um script conciso, porém ilustrativo, que automatiza a instalação de um conjunto de ferramentas para pentest (ou qualquer outro software de sua preferência) em sistemas macOS utilizando o Homebrew. Além disso, discutiremos por que o JavaScript no Flipper oferece vantagens significativas sobre o clássico DuckyScript.
Por que o DuckyScript Tradicional Já Não é Suficiente?
Os cenários tradicionais de BadUSB são geralmente desenvolvidos em DuckyScript, seguindo uma estrutura como:
duckyscriptDELAY 1000 GUI SPACE DELAY 500 STRING terminal ENTER STRING brew install nmap ENTER
Embora funcional, essa abordagem frequentemente encontra limitações inerentes:
- Ausência de loops;
- Falta de estruturas condicionais;
- Impossibilidade de utilizar módulos;
- Dificuldade no tratamento de estados;
- Código com baixa escalabilidade.
O Flipper, por outro lado, oferece acesso a uma API JavaScript que permite a implementação de lógica de programação completa. Por exemplo:
javascriptfor (let i = 0; i < apps.length; i++) { // Lógica de instalação }
Essencialmente, isso nos proporciona um motor de script miniaturizado diretamente dentro do dispositivo.
Analisando o Script
O script inicia com a importação dos módulos necessários. O primeiro é responsável pelas notificações do Flipper, enquanto o segundo gerencia a emulação de dispositivos HID (Human Interface Device):
javascriptlet notify = require("notification"); let badusb = require("badusb");
Em seguida, definimos a lista de aplicações a serem instaladas:
javascriptconst apps = [ 'nmap', 'metasploit-framework', 'hydra' ];
Esta lista pode ser expandida para incluir qualquer quantidade de pacotes desejados.
Camuflagem como Teclado Apple
O próximo bloco configura os identificadores USB, simulando um dispositivo Apple:
javascriptbadusb.setup({ vid: 0x05AC, // Vendor ID da Apple pid: 0x026C, // Product ID de um teclado Apple mfr: "Apple", product: "Keyboard" });
Neste trecho, utilizamos o Vendor ID (VID) e Product ID (PID) de um teclado Apple, que podem ser facilmente encontrados online ou nas configurações do sistema.
Verificação de Conexão
Após uma breve indicação visual no Flipper:
javascriptnotify.blink("green", "short");
O script verifica a presença de uma conexão USB ativa:
javascriptif (badusb.isConnected()) { // Continua apenas se conectado }
Esta é uma vantagem crucial do JavaScript sobre o DuckyScript, pois permite a execução de ações somente quando uma conexão USB ativa é detectada.
Inicialização Automática do Terminal
Em seguida, o script aciona o Spotlight (Command + Space):
javascriptbadusb.press("GUI", "SPACE");
Após uma pequena pausa, o comando para abrir o iTerm é digitado:
javascriptbadusb.print("iterm", 100); badusb.press("ENTER");
O script procura pelo iTerm e o executa. Se preferir, você pode substituir "iterm" por "terminal" para usar o aplicativo Terminal nativo do macOS.
Instalação de Ferramentas
Esta é a parte mais empolgante, onde a superioridade sobre o DuckyScript se torna evidente:
javascriptfor (let i = 0; i < apps.length; i++) { badusb.println("brew install " + apps[i], 100); delay(4000); // Pausa para garantir que o comando anterior foi processado }
Para cada programa na lista apps, um comando de instalação via brew é gerado e executado:
brew install nmap
brew install metasploit-framework
brew install hydra
Isso transforma a lista de pacotes em uma sequência de instalações automatizadas. Por exemplo, a lista de aplicações pode ser definida como:
javascriptconst apps = [ 'nmap', 'masscan', 'sqlmap', 'john-jumbo' ];
Dessa forma, o mesmo script pode ser adaptado para diferentes perfis de usuários, como:
- Pentester;
- Engenheiro DevOps;
- Desenvolvedor;
- Analista de Segurança.
Feedback via Flipper
Após a conclusão do loop de instalação:
javascriptnotify.success();
O Flipper exibe uma notificação de sucesso. Adicionalmente, uma mensagem é exibida no terminal:
echo 'Installation complete!'
Onde Isso é Realmente Útil?
Frequentemente, as demonstrações de BadUSB se limitam a "invadir uma geladeira inteligente em 5 segundos". No entanto, cenários de automação, que vão além da simples instalação de aplicativos, são consideravelmente mais interessantes. Considere os seguintes casos de uso:
Preparação de uma Estação de Pentest: Ao entregar um novo notebook a um especialista, o script pode instalar automaticamente um conjunto completo de ferramentas:
javascriptconst apps = [ 'nmap', 'hydra', 'metasploit-framework', 'wireshark', 'sqlmap' ];
Configuração DevOps: Para um engenheiro DevOps, o script pode configurar o ambiente com as ferramentas essenciais:
javascriptconst apps = [ 'terraform', 'ansible', 'kubectl', 'helm' ];
O Que Pode Ser Melhorado?
O script original apresenta algumas limitações que podem ser aprimoradas:
- Verificação do Homebrew: Se o Homebrew não estiver instalado no sistema macOS, o comando
brewresultará emcommand not found, interrompendo todo o processo. Seria mais robusto verificar a existência do Homebrew primeiro (por exemplo, comwhich brew) e, se necessário, iniciar o processo de instalação do gerenciador de pacotes. - Delays Fixos: O script utiliza
delay(4000). No entanto, a instalação de pacotes, especialmente os mais complexos como o Metasploit, pode levar vários minutos. Pausas fixas nem sempre garantem a confiabilidade do processo. - Ausência de Tratamento de Erros: O cenário atual assume que o usuário está autenticado, o iTerm está instalado, o Homebrew está presente e a rede está funcionando. A implementação de tratamento de erros para essas condições tornaria o script mais resiliente.
Por Que o JavaScript Muda o Jogo?
A verdadeira inovação deste exemplo não reside apenas na instalação de Nmap ou Hydra. O Flipper Zero se transforma de um "pen drive inteligente com macros" para uma plataforma de automação completa. A introdução de:
- Loops;
- Condicionais;
- Interação com módulos;
- Gerenciamento da lógica de execução;
- Feedback interativo através do dispositivo.
Torna os scripts JavaScript para Flipper uma abordagem muito mais promissora e flexível em comparação com os tradicionais payloads DuckyScript.
Conclusão
O script analisado, com apenas algumas dezenas de linhas, demonstra de forma eficaz a evolução da abordagem BadUSB. O Flipper Zero não se limita mais a enviar uma sequência pré-gravada de pressionamentos de tecla. Agora, ele é capaz de tomar decisões, verificar o estado de conexões, gerenciar a lógica de execução e automatizar tarefas rotineiras. Essa capacidade de automação inteligente, impulsionada pelo motor JavaScript, abre um leque de possibilidades para profissionais de segurança e administradores de sistemas.
O código-fonte original pode ser consultado em: https://gitlab.com/DuDlick/flipper-auto-installer/-/blob/main/download_all.js?ref_type=heads





