
Red teamer local impulsado por IA en un teléfono
Un agente autónomo de pruebas de penetración que se ejecuta completamente en un smartphone. Deja el teléfono en una red, aléjate, y descubre hosts, mapea servicios, encuentra vulnerabilidades y genera un informe de pentest — todo sin conectividad a la nube.
░█▄░█ █ █▀▀ █░█ ▀█▀ █▀▀ █▀█ ▄▀█ █░█░█ █░░ █▀▀ █▀█
░█░▀█ █ █▄█ █▀█ ░█░ █▄▄ █▀▄ █▀█ ▀▄▀▄▀ █▄▄ ██▄ █▀▄ v0.1.0
AUTONOMOUS MOBILE PENTEST AGENT
OnePlus 8 · NetHunter · LFM2.5-1.2B · OpenCL GPU
Las pruebas de penetración (pentesting) son la práctica de probar la seguridad de una red informática simulando un ataque — con el permiso explícito del propietario de la red. Los pentesters profesionales son contratados para encontrar vulnerabilidades antes de que lo hagan los atacantes reales.
Nightcrawler automatiza este proceso en un teléfono. Utiliza un pequeño modelo de IA (LFM2.5-1.2B-Instruct-Heretic, 1.2 mil millones de parámetros) que se ejecuta localmente en la GPU del teléfono para decidir qué hacer a continuación — qué host sondear, qué herramienta usar, qué buscar. No requiere conexión a internet ni API en la nube.
▶️ Mira Nightcrawler en acción en Instagram
El agente opera como un pentester humano paciente — rota entre hosts, realiza una pequeña acción por turno y construye conocimiento gradualmente a lo largo de horas. Esto lo hace mucho más difícil de detectar que los escáneres de vulnerabilidades tradicionales que atacan todos los hosts a la vez.
┌──────────────────────────────────────────────────────────┐
│ PHONE (OnePlus 8) │
│ │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ LFM2.5 │ │ Agent Loop │ │
│ │ 1.2B model │◄───►│ (main.py) │ │
│ │ on GPU │ │ Decides what │ │
│ │ (:8080) │ │ to do next │ │
│ └─────────────┘ └────────┬─────────┘ │
│ │ │
│ ┌────────▼─────────┐ │
│ │ Scope Proxy │ ← Safety layer │
│ │ Validates every │ Blocks out- │
│ │ command before │ of-scope │
│ │ execution │ actions │
│ └────────┬─────────┘ │
│ │ │
│ ┌────────▼─────────┐ │
│ │ Kali MCP Server │ ← Runs the │
│ │ nmap, curl, │ actual │
│ │ smbclient, ... │ commands │
│ └──────────────────┘ │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Web Dashboard │ │ SQLite DB │ │
│ │ (:8888) │ │ Hosts, vulns, │ │
│ │ Monitor & steer │ │ creds, commands │ │
│ └──────────────────┘ └──────────────────┘ │
└──────────────────────────────────────────────────────────┘
Para el diseño completo del sistema, consulta docs/ARCHITECTURE.md.
Consulta docs/FEATURES.md para la referencia completa de características.
Toda la inferencia mediante OpenCL en GPU Adreno 650:
Nota: Android limita la GPU cuando se usa con batería (desaceleración de 6x). Nightcrawler incluye un daemon de gobernador de GPU que fuerza el rendimiento máximo y se auto-limita al ≤15% de batería.
# 1. Instalación (dentro del chroot de Kali NetHunter)
bash INSTALL.sh
# 2. Espera a que se inicie llama-server (~5 min después del arranque)
curl -s http://127.0.0.1:8080/health # Debería devolver {"status":"ok"}
# 3. Inicia todos los servicios
bash scripts/run-36h.sh
# 4. Abre el panel web (desde cualquier dispositivo en tu red Tailscale)
# https://<tu-hostname-tailscale>:8888
NC_DRY_RUN=1 python3 main.py
Esto usa un servidor Kali simulado para que puedas probar el bucle del agente sin ejecutar comandos de red reales.
kali-server-mcp --port 5000 &
python3 scope_proxy.py --config config.yaml --port 8800 --upstream http://127.0.0.1:5000 &
bash scripts/webui-daemon.sh start
python3 main.py &
Edita config.yaml antes del despliegue:
mission:
id: "CLIENT-YYYY-XXX" # Tu ID de compromiso
scope:
networks: ["auto"] # "auto" = detectar desde wlan0 al inicio
excluded_hosts: ["auto"] # "auto" = gateway + IP propia
excluded_ports: [502, 503] # Puertos SCADA/ICS que nunca tocar
authorization: "ROE-YYYY-XXX.pdf"
max_runtime_hours: 0 # 0 = sin límite
model:
local:
ctx_size: 8192
port: 8080
Detección dinámica de alcance significa cero cambios de configuración al moverse entre redes — el agente lee la subred actual desde wlan0 al inicio.
nightcrawler/
├── main.py # Punto de entrada
├── config.yaml # Alcance de misión + configuración del modelo
├── scope_proxy.py # Proxy de cumplimiento de alcance
├── INSTALL.sh # Instalador
│
├── agent/ # Lógica central del agente
│ ├── loop.py # Bucle de decisión + recuperación de errores
│ ├── planner.py # Máquina de estados de fases (recon → exploit)
│ ├── llm_client.py # Cliente API LLM (llama.cpp / remoto)
│ ├── db.py # Backend SQLite (hosts, vulns, creds)
│ ├── host_memory.py # Observaciones por host + auto-etiquetado
│ ├── cve_db.py # Base de datos CVE de 24,956 entradas
│ ├── attack_planner.py # Directivas estratégicas para la fase de explotación
│ ├── output_parser.py # Extrae datos estructurados de la salida de herramientas
│ ├── offline_manager.py # Máquina de estados del pipeline de brecha WiFi
│ ├── net_detect.py # Auto-detección de red desde wlan0
│ ├── cover_traffic.py # Mezcla sigilosa con tráfico web realista
│ ├── passive_capture.py # tcpdump en segundo plano para tráfico de difusión
│ └── ...
│
├── proxy/ # Componentes de cumplimiento de alcance
│ ├── scope.py # Validación de IP/puerto/host
│ ├── rate_limiter.py # Limitación de velocidad de comandos + jitter
│ └── command_filter.py # Lista negra de comandos destructivos
│
├── webui/ # Panel web (Flask)
│ ├── server.py # API + middleware sigiloso
│ └── templates/index.html # Interfaz del panel
│
├── data/ # Archivos de datos estáticos
│ ├── cve_exploits.json # Mapeos CVE→comando de explotación
│ └── playbooks.json # 27 playbooks de ataque de múltiples pasos
│
├── prompts/ # Plantillas de prompt LLM (recargables en caliente)
├── scripts/ # Scripts operativos (inicio, parada, watchdogs)
├── tests/ # Suites de pruebas (API, UI, modo sin conexión)
├── kernels/ # Módulos de driver WiFi + documentación de kernel
├── simulation/ # Servidor simulado para ejecución de prueba
├── docs/ # Arquitectura, configuración de GPU, características
├── logs/ # Datos de ejecución (ignorados por git)
└── models/ # Archivos de modelo (ignorados por git)
El agente usa un bucle simple pero efectivo:
REASONING: ... COMMAND: ...El modelo de 1.2B tiene una tasa de éxito de comandos de ~50% (inherente a su tamaño). El agente lo compensa con:
El panel en :8888 proporciona monitoreo y control en tiempo real:
El panel está filtrado por sigilo: suplanta encabezados nginx y devuelve 404s vacíos a conexiones desde la red objetivo.
De más de 72 horas de operación autónoma en múltiples redes:
¡Las contribuciones son bienvenidas! Consulta CONTRIBUTING.md para las pautas.
# Clona el repositorio
git clone https://github.com/garagehq/nightcrawler.git
cd nightcrawler
# Modo de ejecución de prueba (sin comandos reales, sin necesidad de hardware)
NC_DRY_RUN=1 python3 main.py
# Ejecuta las pruebas
python3 -m pytest tests/
Esta herramienta es solo para pruebas de penetración autorizadas. Debes tener permiso por escrito (Reglas de Compromiso) del propietario de la red antes de desplegar Nightcrawler. El uso no autorizado contra redes que no posees o para las que no tienes permiso de prueba es ilegal.
MIT — consulta LICENSE para más detalles.
Si disfrutas este proyecto, puedes invitarme a un café ☕:
| Término | Qué significa |
|---|
| Drop box | Un dispositivo dejado en una red objetivo para realizar pruebas de forma autónoma |
| Alcance | El conjunto de redes/hosts que estás autorizado a probar |
| Reglas de Compromiso (ROE) | Un documento legal que especifica lo que se te permite hacer |
| Sigilo | Técnicas para evitar la detección por monitoreo de red (IDS/IPS) |
| MCP | Model Context Protocol — una interfaz estándar para el uso de herramientas por IA |
| C2 | Command and Control — el panel web para monitorear y dirigir al agente |
| Modelo | Cuantización | Velocidad de prompt | Velocidad de generación |
|---|
| LFM2.5-1.2B-Instruct-Heretic (producción) | Q8_0 | 115 tok/s | 13 tok/s |
| Qwen3.5-0.8B | Q8_0 | 30.5 tok/s | 6.3 tok/s |
| Qwen3.5-4B | Q4_0 | 10.1 tok/s | 2.0 tok/s |