
Plataforma VAPT alojada localmente y aislada de red (air-gapped) que ejecuta 8 módulos de escaneo en paralelo, puntúa de forma determinista los hallazgos con CVSS v3.1 y genera informes PDF con remediación opcional generada por IA mediante un LLM local.
Creado por maverickaayush.
Una herramienta VAPT autoalojada y aislada de la red: apúntala a un dominio objetivo autorizado y ejecuta 8 módulos de escaneo en paralelo, puntúa de forma determinista cada hallazgo (CVSS v3.1), añade opcionalmente descripciones en inglés sencillo generadas por IA mediante un LLM local, y produce un informe PDF además de un panel web en vivo. Sin llamadas a API externas - todo se ejecuta en tu propia red.
Dos formas de ejecutar ONUS:
- Autoalojado (este repositorio):
docker compose up→ introduce un dominio → marca la casilla de autorización → escanea. Sin cuenta, sin inicio de sesión, sin verificación de correo - es de operador único por diseño, y todo lo que sigue cubre esta vía.- Alojado: una instancia gestionada está disponible en tryonus.tech. Añade funciones exclusivas de producción (cuentas / inicio de sesión con OAuth, cola de escaneos, historial por usuario) que están desactivadas por defecto en este repositorio, para que el autoalojamiento siga siendo sencillo. Ver Autoalojado vs alojado.
La vía autoalojada por defecto es intencionadamente la sencilla: sin registro, sin
verificación de correo, sin OAuth. Las funciones exclusivas del alojamiento
(autenticación, cola de escaneos) viven detrás de flags de configuración que por
defecto están desactivados (REQUIRE_AUTH=false, HOSTED_QUEUE_ENABLED=false;
ver Configuración) y no están definidos en docker-compose.yml -
por lo que ejecutar ONUS localmente nunca te pone detrás de un inicio de sesión.
¿Prefieres cero configuración? Usa el sitio alojado en
tryonus.tech.
| Nuevo escaneo | Estado del escaneo en vivo |
|---|---|
![]() | ![]() |
| Panel de informe | Descubrimiento de escaneos |
|---|---|
![]() | ![]() |
domain → [recon | webscan | ssl_tls | headers | owasp | tech_fingerprint | nuclei | enumeration] (parallel, Celery)
→ any module failed/timed out? → pause for operator retry/continue/cancel
→ aggregator (dedup + OWASP-map + sort)
→ confidence verification (passive re-observation)
→ deterministic CVSS scoring
→ Ollama (Qwen 2.5 7B) AI analysis
→ WeasyPrint PDF + PostgreSQL
→ dashboard / PDF download
Seis capas: frontend Next.js → FastAPI → Celery/Redis → 8 módulos de escaneo en
paralelo → Ollama (Qwen 2.5 7B) → PDF WeasyPrint + panel. Todos los detalles en
ARCHITECTURE.md (esquemas, contratos, salvaguardas) y
docs/QUICK_REF.md (consulta rápida para cambios habituales).
mem_limit: 4g),
y Postgres, Redis, la API, el worker y el frontend se ejecutan a la vez.Ver Requisitos previos más arriba: ~8 GB de disco y ~6 GB de RAM, y espera una primera compilación de 10-15 minutos.
cp .env.example .env
cp backend/subfinder-config/provider-config.yaml.example backend/subfinder-config/provider-config.yaml
docker compose up -d
docker compose ps # wait for zap to report healthy (~2 min)
Abre http://localhost:3000, introduce un dominio, marca la casilla de autorización y comienza el escaneo.
Sin inicio de sesión, registro ni verificación de correo. ONUS autoalojado es de operador único por defecto - no hay ningún paso de cuenta entre abrir el panel y escanear.
Esto funciona sin instalar Ollama. La puntuación CVSS/severidad/prioridad es
siempre determinista (analysis/cvss_scorer.py) - sin Ollama en ejecución, los
hallazgos reciben una plantilla de descripción basada en reglas en lugar de prosa
generada por IA. Ver «Opcional: activar descripciones generadas por IA» más abajo para activarlo.
Para ejecutar esta herramienta no se necesita ninguna clave de API. Todas las
herramientas que envuelve (nmap, ZAP, Nikto, testssl.sh, Nuclei, Amass, Naabu, httpx,
WhatWeb, WAFW00F, FFUF) y el propio Ollama funcionan sin ninguna clave. El paso de
copiar la configuración de subfinder de arriba es la única excepción opcional - dejarla
como plantilla vacía está bien, subfinder simplemente se ejecuta solo con fuentes
gratuitas/públicas. Para profundizar en la enumeración de subdominios, puedes añadir
hasta dos claves de nivel gratuito a ese archivo antes de empezar: un token de acceso
personal de GitHub y una clave de API de ProjectDiscovery Chaos -
ver los comentarios dentro de provider-config.yaml.example.
Ollama se ejecuta de forma nativa en el host (no en Docker) para poder usar la
GPU del host directamente; los contenedores acceden a él mediante host.docker.internal.
ollama pull qwen2.5:7b127.0.0.1, a lo que la red bridge de Docker no puede llegar):
sudo systemctl edit ollama
[Service]:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl daemon-reload && sudo systemctl restart ollama
curl http://localhost:11434/api/tagsdocker compose restart backend workerEl archivo compose también define 12 aplicaciones de práctica intencionadamente vulnerables (Juice Shop, DVWA, bWAPP, Mutillidae, NodeGoat, DVWP/WordPress detrás de un WAF ModSecurity, Metasploitable2, WebGoat) para probar el escáner contra algo sin necesitar tu propio objetivo autorizado. Están detrás de un perfil de Compose para que nunca se compilen/arranquen por defecto:
docker compose --profile targets up -d
Advertencia: estos servicios son intencionadamente vulnerables y algunos tienen
puertas traseras reales (Metasploitable2 incluye una backdoor viva de vsftpd).
Ejecuta el perfil targets solo en una máquina que no sea accesible desde internet ni
desde una red compartida - nunca en una instancia de nube pública ni en un host expuesto.
La mayoría de estos se ejecutan desde imágenes precompiladas y no necesitan nada extra.
Dos, nodegoat y dvwp-wordpress, se compilan desde código fuente que no está incluido
en este repositorio y deben clonarse primero:
git clone https://github.com/OWASP/NodeGoat nodegoat-src
git clone https://github.com/vavkamil/dvwp dvwp-src
Puertos publicados una vez en ejecución: Juice Shop :3001, DVWA :8081, bWAPP
:8083, Mutillidae :8084, NodeGoat :8085, DVWP (vía WAF, TLS) :8444,
WebGoat :8082. Metasploitable2 no publica ningún puerto del host (solo es accesible
desde backend/worker a través de la red interna de Docker) ya que expone servicios
de red reales con puertas traseras/sin autenticación.
Variables de entorno, definidas vía .env (copiado de .env.example):
Los valores por defecto de POSTGRES_PASSWORD/SECRET_KEY de arriba son solo para
demostración - están bien para una instancia local/personal, pero cambia ambos antes
de desplegar en cualquier lugar al que pueda acceder otra persona. Ahora esto está
impuesto, no solo recomendado: si defines ONUS_ENV=production (o activas la
autenticación alojada), el backend se niega a arrancar mientras cualquiera de los
dos siga siendo un valor por defecto/placeholder. Genera una clave fuerte con
python -c "import secrets; print(secrets.token_urlsafe(48))".
Las funciones exclusivas del alojamiento están desactivadas por defecto.
REQUIRE_AUTH (cuentas / inicio de sesión con OAuth) y HOSTED_QUEUE_ENABLED (cola
de escaneos) tienen ambas false por defecto y no están definidas en
docker-compose.yml, por lo que ONUS autoalojado nunca te bloquea detrás de un inicio
de sesión ni de una cola. Déjalas desactivadas a menos que estés construyendo
deliberadamente un despliegue alojado multiusuario - la instancia gestionada de
tryonus.tech es la que las activa.
ONUS no tiene analíticas por defecto - no se carga nada y ningún dato sale del navegador. Para recopilar métricas anónimas de uso del producto en tu propio despliegue, define un único ID de medición de Google Analytics 4:
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
Es una variable de compilación del frontend, así que defínela en el entorno de
compilación del frontend (una variable de entorno de Vercel/host, o frontend/.env.local
para un npm run build local). Cuando está definida, GA se carga solo en
compilaciones de producción y rastrea las visitas de páginas además de algunos eventos
de producto (p. ej. scan_started, scan_completed, report_downloaded). Los eventos
personalizados pasan por el helper tipado en
frontend/lib/analytics.ts -
trackEvent('scan_started').
Privacidad: solo se envían eventos de uso anónimos y de baja cardinalidad - nunca
dominios escaneados, resultados de escaneos, hallazgos, contenidos de informes, el
estado de autorización ni ningún dato personal. Deja NEXT_PUBLIC_GA_ID sin definir y
ONUS se comporta exactamente igual que antes; las analíticas son totalmente voluntarias.
FastAPI genera documentación Swagger interactiva de forma gratuita - una vez que el backend está en ejecución, abre http://localhost:8000/docs.
docker compose down
docker compose logs -f backend worker
pip install -r backend/requirements-dev.txt
pytest backend/tests
655 pruebas automatizadas del backend a día de hoy. Más allá del conjunto de pruebas
unitarias/de integración, la herramienta se ha puesto a prueba de extremo a extremo
durante el desarrollo: 79 escaneos reales ejecutados y 124 informes PDF generados
contra nueve aplicaciones de práctica intencionadamente vulnerables (DVWA, Juice Shop,
Mutillidae, NodeGoat, bWAPP, WebGoat, Metasploitable2, DVWP/WordPress detrás de un WAF)
más un objetivo público autorizado (testphp.vulnweb.com) - no son números hipotéticos.
Escanea únicamente objetivos que tengas autorización explícita para probar - ver
docs/test_findings.md para los objetivos de práctica
utilizados durante el desarrollo.
ARCHITECTURE.md - arquitectura completa, esquemas y
los contratos que un cambio nunca debería romper. Léelo antes de hacer un
cambio no trivial.docs/QUICK_REF.md - comandos de ejecución, responsabilidades
de carpetas, «dónde hago este cambio».docs/scanners.md - razonamiento detrás del diseño de
tiempos/flags de cada módulo de escaneo.docs/ai.md - ajuste de timeout/contexto de Ollama, por qué la
puntuación se trasladó por completo fuera del LLM.docs/docker.md - notas de desviaciones de Docker y trampas
de compilación.docs/troubleshooting.md - cómo probar manualmente
cualquier módulo/fase de forma aislada.docs/roadmap.md - secuencia histórica de construcción
(la construcción está completa).MIT - ver LICENSE.
Escanear objetivos sin autorización escrita explícita es ilegal según la IT Act 2000 (India) y los estatutos internacionales equivalentes. Esta herramienta exige confirmación de autorización en cada escaneo y registra el operador + la marca de tiempo para la rendición de cuentas.
| Autoalojado (este repositorio) | Alojado (tryonus.tech) |
|---|
| Configuración | docker compose up | ninguna - solo abre el sitio |
| Inicio de sesión | ninguno - operador único | cuenta / Google / GitHub OAuth |
| Flujo de escaneo | dominio → casilla de autorización → escaneo | igual, tras iniciar sesión |
| Extras | - | cola de escaneos, historial por usuario, correo alojado |
| Se ejecuta en | tu propia red, aislado | nube gestionada |
| Variable | Default | Propósito |
|---|
POSTGRES_PASSWORD | vapt_secure_2025 | Contraseña de la base de datos |
SECRET_KEY | change_me_to_a_long_random_string | Clave secreta del backend |
ALLOWED_HOSTS | localhost,127.0.0.1 | Hosts permitidos de FastAPI |
OLLAMA_URL | http://host.docker.internal:11434 | Dónde backend/worker alcanzan a Ollama |
SCAN_TIMEOUT_MULTIPLIER | 1.5 | Escala el timeout de herramientas/Celery de cada módulo - los objetivos del mundo real son más lentos que los de laboratorio; bájalo a 1.0 para tiempos ajustados a laboratorio |
MAX_CONCURRENT_SCANS | 3 | Límite de escaneos concurrentes (protección contra agotamiento de recursos / cortesía con el objetivo; también dimensiona el pool de conexiones de la BD) |
ONUS_ENV | development | development (localhost autoalojado — las claves débiles solo avisan) o production (una SECRET_KEY/contraseña de Postgres débil impide el arranque) |
CONTRIBUTING.md