
Plataforma VAPT hospedada localmente e isolada fisicamente (air-gapped) que executa 8 módulos de varredura em paralelo, pontua achados de forma determinística com CVSS v3.1 e gera relatórios em PDF com remediação opcional gerada por IA via LLM local.
Desenvolvido por maverickaayush.
Uma ferramenta VAPT hospedada localmente e isolada de redes externas: aponte-a para um domínio alvo autorizado e ela executa 8 módulos de varredura em paralelo, calcula deterministicamente a pontuação de cada achado (CVSS v3.1), opcionalmente adiciona descrições em linguagem simples geradas por IA via um LLM local e gera um relatório em PDF além de um painel web em tempo real. Nenhuma chamada externa de API - tudo roda na sua própria rede.
Duas formas de executar o ONUS:
- Self-hosted (este repositório):
docker compose up→ insira um domínio → marque a caixa de autorização → escaneie. Sem conta, sem login, sem verificação de e-mail - é de operador único por design, e tudo abaixo cobre esse caminho.- Hospedado: uma instância gerenciada está disponível em tryonus.tech. Ela adiciona recursos exclusivos de produção (contas / login OAuth, uma fila de varreduras, histórico por usuário) que vêm desativados neste repositório, para que o self-hosting continue simples. Veja Self-hosted vs hospedado.
O caminho padrão do self-hosted é intencionalmente o mais simples: sem cadastro, sem
verificação de e-mail, sem OAuth. Os recursos exclusivos do hospedado (autenticação, fila de
varreduras) ficam atrás de flags de configuração que vêm desativadas por padrão (REQUIRE_AUTH=false,
HOSTED_QUEUE_ENABLED=false; veja Configuração) e não estão
definidos em docker-compose.yml - portanto, executar o ONUS localmente nunca coloca você atrás de um
login. Prefere zero configuração? Use o site hospedado em
tryonus.tech.
| Nova Varredura | Status da Varredura em Tempo Real |
|---|---|
![]() | ![]() |
| Painel do Relatório | Descoberta de Varreduras |
|---|---|
![]() | ![]() |
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 camadas: frontend Next.js → FastAPI → Celery/Redis → 8 módulos de varredura
em paralelo → Ollama (Qwen 2.5 7B) → WeasyPrint PDF + painel. Detalhes completos em
ARCHITECTURE.md (esquemas, contratos, salvaguardas) e
docs/QUICK_REF.md (consulta rápida para mudanças comuns).
mem_limit: 4g),
e Postgres, Redis, a API, o worker e o frontend rodam em paralelo a ele.Veja os Pré-requisitos acima: ~8 GB de disco e ~6 GB de RAM, e espere uma primeira compilação de 10 a 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)
Abra http://localhost:3000, insira um domínio, marque a caixa de autorização e inicie a varredura.
Sem login, cadastro ou verificação de e-mail. O ONUS self-hosted é de operador único por padrão - não há etapa de conta entre abrir o painel e escanear.
Isso funciona sem instalar o Ollama. A pontuação CVSS/severidade/prioridade é
sempre determinística (analysis/cvss_scorer.py) - sem o Ollama em execução,
os achados apenas recebem um modelo de descrição baseado em regras em vez de um texto
gerado por IA. Veja "Opcional: ative as descrições geradas por IA" abaixo para ativar esse recurso.
Nenhuma chave de API é necessária para executar esta ferramenta. Cada ferramenta de varredura
que ela utiliza (nmap, ZAP, Nikto, testssl.sh, Nuclei, Amass, Naabu, httpx, WhatWeb,
WAFW00F, FFUF) e o próprio Ollama funcionam sem nenhuma chave. A etapa de
cópia da configuração do subfinder acima é a única exceção opcional - deixá-la como
modelo vazio é suficiente; o subfinder apenas roda com fontes gratuitas/públicas.
Para aprofundar a enumeração de subdomínios, você pode adicionar até duas chaves de nível gratuito a
esse arquivo antes de começar: um token de acesso pessoal do GitHub e uma
chave de API do ProjectDiscovery Chaos - veja
os comentários dentro de provider-config.yaml.example.
O Ollama roda nativamente no host (não no Docker) para que possa usar a
GPU do host diretamente; os contêineres o acessam via host.docker.internal.
ollama pull qwen2.5:7b127.0.0.1 por padrão, que a rede bridge do Docker não consegue alcançar):
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 workerO arquivo compose também define 12 aplicativos de prática intencionalmente vulneráveis (Juice Shop, DVWA, bWAPP, Mutillidae, NodeGoat, DVWP/WordPress atrás de um WAF ModSecurity, Metasploitable2, WebGoat) para testar o scanner contra algo sem precisar do seu próprio alvo autorizado. Eles ficam atrás de um perfil do Compose para que nunca sejam compilados/iniciados por padrão:
docker compose --profile targets up -d
Aviso: estes são serviços intencionalmente vulneráveis, alguns genuinamente com backdoor
(o Metasploitable2 inclui um backdoor vsftpd ativo). Execute o perfil
targets apenas em uma máquina que não esteja acessível pela internet ou por uma
rede compartilhada - nunca em uma instância de nuvem pública ou em um host exposto.
A maioria desses usa imagens pré-compiladas e não precisa de nada extra. Dois -
nodegoat e dvwp-wordpress - são compilados a partir de código-fonte que não está
incluído neste repositório e precisam ser clonados primeiro:
git clone https://github.com/OWASP/NodeGoat nodegoat-src
git clone https://github.com/vavkamil/dvwp dvwp-src
Portas publicadas quando em execução: Juice Shop :3001, DVWA :8081, bWAPP
:8083, Mutillidae :8084, NodeGoat :8085, DVWP (via WAF, TLS) :8444,
WebGoat :8082. O Metasploitable2 não publica porta no host (acessível apenas a partir de
backend/worker pela rede interna do Docker), pois expõe serviços de rede
reais com backdoor/sem autenticação.
Variáveis de ambiente, definidas via .env (copiadas de .env.example):
Os padrões de POSTGRES_PASSWORD/SECRET_KEY acima são apenas para demonstração -
eles são adequados para uma instância local/pessoal, mas altere ambos antes de implantar
em qualquer lugar acessível por terceiros. Isso agora é aplicado, não apenas recomendado:
defina ONUS_ENV=production (ou ative a autenticação hospedada) e o backend se recusa a
iniciar enquanto qualquer um deles for um padrão/placeholder. Gere uma chave forte com
python -c "import secrets; print(secrets.token_urlsafe(48))".
Os recursos exclusivos do hospedado vêm desativados por padrão. REQUIRE_AUTH (contas / login
OAuth) e HOSTED_QUEUE_ENABLED (fila de varreduras) têm false como padrão e
não estão definidos em docker-compose.yml, portanto o ONUS self-hosted nunca coloca você atrás
de um login ou de uma fila. Deixe-os desativados, a menos que esteja intencionalmente construindo uma
implantação hospedada multiusuário - a instância gerenciada tryonus.tech
é a que os ativa.
O ONUS não tem analytics por padrão - nada é carregado e nenhum dado sai do navegador. Para coletar métricas anônimas de uso do produto na sua própria implantação, defina um único ID de medição do Google Analytics 4:
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
É uma variável de tempo de compilação do frontend, então defina-a no ambiente de compilação
do frontend (uma variável de ambiente do Vercel/host, ou frontend/.env.local para uma
compilação local com npm run build). Quando definido, o GA carrega apenas em builds de produção e rastreia
visualizações de página além de alguns eventos de produto (ex.: scan_started, scan_completed,
report_downloaded). Eventos personalizados passam pelo helper tipado em
frontend/lib/analytics.ts -
trackEvent('scan_started').
Privacidade: apenas eventos anônimos de uso com baixa cardinalidade são enviados - nunca
domínios escaneados, resultados de varreduras, achados, conteúdos de relatórios, o estado
de autorização ou qualquer dado pessoal. Deixe NEXT_PUBLIC_GA_ID sem definir e o ONUS se comporta
exatamente como antes; o analytics é totalmente opcional.
O FastAPI gera documentação Swagger interativa gratuitamente - assim que o backend estiver em execução, abra http://localhost:8000/docs.
docker compose down
docker compose logs -f backend worker
pip install -r backend/requirements-dev.txt
pytest backend/tests
655 testes automatizados de backend até o momento em que este texto foi escrito. Além da suíte
de testes unitários/integração, a ferramenta foi exercitada de ponta a ponta durante o desenvolvimento: 79 varreduras
reais executadas e 124 relatórios em PDF gerados contra nove aplicativos de prática
intencionalmente vulneráveis (DVWA, Juice Shop, Mutillidae, NodeGoat,
bWAPP, WebGoat, Metasploitable2, DVWP/WordPress atrás de um WAF) além de um
alvo público autorizado (testphp.vulnweb.com) - não são números hipotéticos.
Escanee apenas alvos que você tenha autorização explícita para testar - veja
docs/test_findings.md para os alvos de prática
usados durante o desenvolvimento.
ARCHITECTURE.md - arquitetura completa, esquemas e
os contratos que uma mudança nunca deve quebrar. Leia isto antes de fazer uma
mudança não trivial.docs/QUICK_REF.md - comandos de execução, responsabilidades
de pastas, "onde faço esta mudança."docs/scanners.md - a lógica por trás do design de tempo/flags
de cada módulo de varredura.docs/ai.md - ajuste de timeout/contexto do Ollama, por que a pontuação
saiu totalmente do LLM.docs/docker.md - notas sobre desvios do Docker e
pegadinhas de compilação.docs/troubleshooting.md - como testar manualmente
qualquer módulo/estágio isoladamente.docs/roadmap.md - sequência histórica de construção
(a construção está completa).MIT - veja LICENSE.
Escanear alvos sem autorização escrita explícita é ilegal de acordo com a IT Act 2000 (Índia) e estatutos internacionais equivalentes. Esta ferramenta exige confirmação de autorização em toda varredura e registra o operador + o timestamp para fins de responsabilização.
| Self-hosted (este repositório) | Hospedado (tryonus.tech) |
|---|
| Configuração | docker compose up | nenhuma - basta abrir o site |
| Login | nenhum - operador único | conta / Google / GitHub OAuth |
| Fluxo de varredura | domínio → caixa de autorização → varredura | o mesmo, após fazer login |
| Extras | - | fila de varreduras, histórico por usuário, e-mail hospedado |
| Executa em | sua própria rede, isolada da internet | nuvem gerenciada |
| Variável | Padrão | Finalidade |
|---|
POSTGRES_PASSWORD | vapt_secure_2025 | Senha do banco de dados |
SECRET_KEY | change_me_to_a_long_random_string | Chave secreta do backend |
ALLOWED_HOSTS | localhost,127.0.0.1 | Hosts permitidos do FastAPI |
OLLAMA_URL | http://host.docker.internal:11434 | Onde o backend/worker acessam o Ollama |
SCAN_TIMEOUT_MULTIPLIER | 1.5 | Escala o timeout de ferramenta/Celery de cada módulo - alvos do mundo real são mais lentos que alvos de laboratório; reduza para 1.0 para tempos ajustados a laboratório |
MAX_CONCURRENT_SCANS | 3 | Limite de varreduras simultâneas (proteção contra esgotamento de recursos / polidez com o alvo, também define o tamanho do pool de conexões do banco) |
ONUS_ENV | development | development (localhost self-hosted — segredos fracos apenas geram aviso) ou production (senha SECRET_KEY/do Postgres fraca se torna uma falha grave na inicialização) |
CONTRIBUTING.md