
Plataforma de simulación de adversarios Linux de espectro completo con sigilo a nivel de kernel, balizamiento C2, escalada de privilegios, recolección de credenciales, movimiento lateral y destrucción de artefactos. Diseñada para operaciones de equipo rojo e investigación de detección.
BAT es un modelo de amenaza de adversario realista y en evolución para Linux y Windows. No es un framework C2 ni un rootkit. Es una plataforma completa de simulación de amenazas que integra comunicación C2, módulos rootkit sigilosos a nivel de kernel, evasión en espacio de usuario, escalada de privilegios, persistencia, inyección de procesos, recolección de credenciales, exfiltración y movimiento lateral en un único adversario cohesivo. El objetivo de diseño es ser la amenaza Linux más sofisticada y realista alcanzable en 2026, independientemente de lo que cualquier sistema de detección capture actualmente.
Es el lado adversario de un par de investigación. El framework Aura evoluciona para detectar a Bat. Bat evoluciona para evadir a Aura. El adversario nunca está limitado por el 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
Genera un secreto: 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
Binarios terminan en `bin/`.
### 4. Inicializar el 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
Desplegar un agente en el objetivo:```bash
sudo setsid /path/to/bat-agent-v11-x86_64 </dev/null >/tmp/.log 2>&1 &
disown
El agente aparece en bat-server como <agentID>@<hostname> dentro de un intervalo de baliza (30s por defecto).
La capa de sigilo del kernel (bat-stealth.ko, código fuente en kperf-qos/) está construida directamente sobre Singularity, un framework avanzado de investigación de rootkits para el kernel. Se portaron y adaptaron cuatro módulos principales:
bpf_hook: Intercepta bpf(2) y todas las primitivas de comunicación eBPF. Cualquier sensor eBPF recibe cero telemetría para los PID ocultos. Adaptado: ARCH_SYS("bpf") reemplaza el __x64_sys_bpf exclusivo de x86; __ia32_sys_bpf eliminado para ARM64; HIDDEN_PORT reemplazado por un global configurable vía sysfs.
hiding_fs: Borrado completo del sistema de archivos: filtrado de getdents64/getdents, ajuste de nlink en stat/statx/newfstatat, bloqueo de openat/access/faccessat sobre /proc/<pid>, bloqueo de chdir y readlink. Fusionado de cinco módulos de Singularity (hiding_directory, hiding_stat, open, hiding_chdir, hiding_readlink). Adaptado: las macros REGS_ARGn reemplazan el acceso directo a registros; should_hide_path() ampliado para bat_hidden_paths[] configurable en tiempo de ejecución.
hide_module: Elimina bat-stealth.ko de todas las listas de módulos del kernel. Ampliado: Singularity ya guarda list.prev; esta versión guarda tanto list.prev como list.next y envenena ambos para bloquear el recorrido en cualquier dirección. Se añadió module_unhide() para la eliminación reversible, requerida por K-99 antes de que delete_module(2) pueda localizar el módulo por nombre.
lkrg_bypass: Suprime la aplicación de LKRG para procesos ocultos: engancha el envío de señales para bloquear SIGKILL a tareas ocultas, engancha vprintk_emit para descartar mensajes de registro de LKRG, desactiva la validación UMH durante la ejecución del agente. Portado directamente sin cambios arquitectónicos.
Los siguientes módulos se desarrollaron de forma independiente:
become_root: hook de la señal 59 que llama a commit_creds(prepare_kernel_cred(NULL)) para otorgar uid=0 (K-03)selfdefense: bloquea la adquisición de memoria con LiME, oculta entradas de kallsyms, bloquea kprobes en símbolos del agente, vuelve a ocultar el módulo ante cualquier intento de enumeraciónaudit: suprime eventos de auditd para PID ocultossysrq_hook: intercepta SysRq-T para excluir procesos ocultos de los volcados de tareastaskstats_hook: filtra respuestas NETLINK taskstats para PID ocultosreset_tainted + clear_taint_dmesg: pone a cero /proc/sys/kernel/tainted y filtra líneas de dmesg que contienen evidencia de carga del módulohooks_write: intercepta todas las rutas de escritura del kernel (write/splice/sendfile/tee + io_uring_enter/enter2 + compat ia32) para eliminar entradas de registro que coincidan con cadenas del agente antes de que lleguen a syslog o journaldpid_manager: tracepoint de fork para mantener el conjunto de PID ocultos en los procesos hijosToda la pila hace que el agente y todos sus artefactos sean invisibles para: ps, top, ss, netstat, lsof, el recorrido del sistema de archivos en rutas ocultas, lsmod, sysfs, kallsyms, auditd, todos los sensores eBPF, LKRG, LiME y el análisis forense con SysRq.