Aviso Legal: Esta ferramenta destina-se exclusivamente a ambientes autorizados e fins educativos/profissionais. A utilização em redes sem permissão explícita é ilegal. O autor não se responsabiliza por usos indevidos.
O KaliScan v2 é uma interface gráfica web para análise de segurança de redes locais, construída sobre o motor de scanning Nmap. A ferramenta automatiza a descoberta de hosts, enumeração de serviços, detecção de vulnerabilidades e geração de relatórios detalhados — tudo acessível através de um browser moderno.
O problema que resolve é a fragmentação e complexidade dos workflows de análise de segurança: em vez de executar manualmente dezenas de comandos Nmap distintos, interpretar output bruto e compilar relatórios, o KaliScan v2 orquestra toda a sequência de forma automática, apresenta os resultados de forma estruturada e exporta relatórios profissionais em PDF e JSON.
- Ping Sweep automático — descobre todos os hosts activos na sub-rede configurada
- Detecção automática de rede local — identifica o IP e a sub-rede do sistema host
- Auto-refresh a cada 5 minutos — mantém a lista de hosts actualizada via thread em background
- Notificações push em tempo real — via Server-Sent Events (SSE), o browser recebe alertas quando novos hosts aparecem ou ficam offline
-
10 módulos de scan independentes, executáveis individualmente ou em sequência completa:
ID Nome Comando Nmap ping_sweepPing Sweep nmap -sn {target}tcp_connectTCP Connect nmap -sT {target}version_osVersões + OS nmap -sV -O -v {target}default_scriptsScripts Padrão nmap -sC -sV {target}ftp_backdoorFTP Backdoor nmap --script=ftp-vsftpd-backdoor,ftp-anon -p 21smb_enumSMB Análise nmap --script smb-enum-users,smb-vuln-ms17-010 -p 445,139http_scanHTTP Análise nmap --script http-headers,http-methods,http-enum -p 80,443aggressiveScan Agressivo nmap -A -T4 {target}syn_stealthSYN Stealth nmap -sS -T4 -p 1-1024 {target}full_vulnVulnerabilidades NSE nmap -sS -sV -O -p- --script vuln,exploit,auth -
Output em tempo real — terminal integrado exibe linhas do Nmap à medida que são produzidas
-
Parser automático de output Nmap — extrai portas, serviços, versões, OS, MAC, vendor e scripts NSE
- Identificação automática de CVEs conhecidos por expressão regular no output NSE
- Classificação por severidade: CRITICAL, HIGH, MEDIUM, LOW
- Detecção específica para:
- vsftpd 2.3.4 Backdoor (CVE-2011-2523)
- EternalBlue MS17-010 (CVE-2017-0144)
- MS08-067 (CVE-2008-4250)
- FTP Anonymous Login
- MySQL root sem password
- Telnet activo
- Apache desactualizado
- phpMyAdmin exposto
- SSH versão desactualizada
- Base de dados interna de mitigações com descrição, passos de resolução e comandos executáveis
- Mapeamento porta → mitigação automático com base nas portas abertas detectadas
- CVSS score associado a cada mitigação
- Interface dark mode com tema cibersegurança (IBM Plex Mono + Rajdhani)
- Sidebar com lista de hosts com badges de estado (online/offline/novo/vulns)
- Relatório por host com tabs: Portas, Vulnerabilidades, Mitigações, Output Raw
- Histórico de scans agrupado por sessão com timestamps, duração e estatísticas
- Exportação PDF — relatório detalhado multi-página com ReportLab (capa, índice, portas, vulns, mitigações, output raw)
- Exportação JSON — estrutura completa com metadados, sumário e dados por host
- Exportação individual por host ou exportação global de todos os hosts scaneados
| Camada | Tecnologia | Versão |
|---|---|---|
| Backend | Python | 3.8+ |
| Framework Web | Flask | 3.0+ |
| Scanner | Nmap | 7.x |
| Geração PDF | ReportLab | 3.x |
| Frontend | HTML5 + CSS3 + JavaScript (Vanilla) | — |
| Tipografia | IBM Plex Mono, Rajdhani (Google Fonts) | — |
| Comunicação Assíncrona | Server-Sent Events (SSE) | — |
| Concorrência | Python threading + queue |
stdlib |
| Parsing | Python re (Regex) |
stdlib |
Não são utilizadas bases de dados externas — o estado é mantido em memória durante a sessão.
kaliscan/
├── app.py # Backend principal Flask — toda a lógica do servidor
├── index.html # Frontend completo — UI, CSS e JavaScript
├── requirements.txt # Dependências Python
└── install.sh # Script de instalação automática
app.py — Núcleo da aplicação. Contém:
- Estado global da aplicação (
statedict com hosts, rede, timestamps) - Base de dados de mitigações (
MITIGATIONS,PORT_MITIGATION_MAP) - Definição dos 10 módulos de scan (
SCAN_SEQUENCE) - Parser de output Nmap (
parse_nmap_output) - Thread de auto-refresh (
auto_sweep_worker) - 11 rotas Flask:
/,/api/network-info,/api/state,/api/mitigations,/api/events(SSE),/api/sweep/stream,/api/full-scan/stream,/api/single-scan/stream,/api/report/json/<ip>,/api/report/json/all,/api/report/pdf/<ip>,/api/report/pdf/all - Gerador de PDF (
generate_pdf_report) e builder JSON (_build_json_export)
index.html — Interface completa (single-file):
- ~1200 linhas de CSS com variáveis custom, design system dark mode
- ~800 linhas de JavaScript vanilla: gestão de estado, SSE consumers, rendering dinâmico de UI, lógica de scans
requirements.txt — Lista de dependências pip:
flask>=3.0.0
ReportLab é utilizado mas não está declarado neste ficheiro — ver secção Problemas Comuns.
install.sh — Instala Nmap, Python, Flask e cria o comando kaliscan em /usr/local/bin/.
- Linux (Debian/Ubuntu/Kali Linux recomendado)
- macOS (funcional, SYN scan requer root)
- Windows (suporte parcial — sem SYN/OS scan sem WinPcap)
| Software | Versão Mínima | Obrigatório |
|---|---|---|
| Python | 3.8+ | ✅ |
| pip | 21+ | ✅ |
| Nmap | 7.0+ | ✅ |
| Flask | 3.0+ | ✅ (via pip) |
| ReportLab | 3.x | ✅ para PDF |
- sudo/root recomendado para SYN Stealth scan (
-sS) e detecção de OS (-O) - Sem root: TCP Connect scan (
-sT) e version scan (-sV) funcionam normalmente
git clone https://github.com/seuuser/kaliscan.git
cd kaliscan
sudo bash install.shO script instala automaticamente: Nmap, Python3, pip e Flask, e cria o atalho kaliscan.
# 1. Instalar Nmap
sudo apt-get update && sudo apt-get install -y nmap
# 2. Instalar dependências Python
pip3 install flask --break-system-packages
pip3 install reportlab --break-system-packages
# 3. Clonar ou copiar os ficheiros
git clone https://github.com/seuuser/kaliscan.git
cd kaliscanpython3 -m venv venv
source venv/bin/activate
pip install flask reportlab
sudo python3 app.pyPor defeito, o KaliScan detecta automaticamente a rede local. Para forçar uma rede específica, edite directamente no browser o campo "Rede / Alvo" na sidebar ou modifique a função get_local_network() em app.py.
O servidor Flask inicia na porta 5000. Para alterar:
# Em app.py, linha final:
app.run(host="0.0.0.0", port=5000, debug=False, threaded=True)
# Altere port=5000 para a porta desejadaO intervalo de refresh automático está definido em 300 segundos (5 minutos). Para alterar:
# Em app.py, função auto_sweep_worker():
time.sleep(300) # Altere para o valor desejado em segundos# Em run_nmap_cmd():
result = subprocess.run(..., timeout=300) # 5 minutos por scan
# Em /api/full-scan/stream:
item = q.get(timeout=600) # 10 minutos timeout total# Execução normal (sem SYN/OS scan)
python3 app.py
# Execução com privilégios completos (recomendado)
sudo python3 app.py
# Via atalho (após install.sh)
kaliscan
# Com variável de ambiente para debug
FLASK_DEBUG=1 sudo python3 app.pyOutput esperado no terminal:
════════════════════════════════════════════════════
KaliScan v2 — Network Scanner GUI
════════════════════════════════════════════════════
IP Local : 192.168.1.100
Rede : 192.168.1.0/24
Interface : http://127.0.0.1:5000
Refresh : automático a cada 5 minutos
════════════════════════════════════════════════════
Abrir no browser: http://127.0.0.1:5000 ou http://localhost:5000
- Abrir http://127.0.0.1:5000 no browser
- Verificar/editar a rede no campo da sidebar (ex:
192.168.1.0/24) - Clicar em "⬡ Descobrir Rede"
- Os hosts detectados aparecem na sidebar em tempo real
- Scan rápido: clicar directamente no card do host na sidebar → inicia scan completo
- Scan individual: clicar no botão "▶ Escanear" no card → abre o Scan Picker → escolher o módulo desejado
- Scan completo: Scan Picker → "🔴 Scan Completo" → executa todos os 10 módulos em sequência
Após o scan, o relatório apresenta:
- Tab "Portas e Serviços" — lista completa de portas abertas com versões detectadas
- Tab "Vulnerabilidades" — CVEs e issues detectados pelos scripts NSE, ordenados por severidade
- Tab "Mitigações" — passos de resolução com comandos para cada vulnerabilidade
- Tab "Output Raw" — output completo do Nmap para auditoria
- JSON (botão "↓ JSON"): dados estruturados para integração com outros sistemas
- PDF (botão "⎙ PDF"): relatório profissional para entrega a clientes
- Exportação global (botão "⎙ Exportar ▾" no topo): exporta todos os hosts scaneados
Browser Flask (app.py) Nmap
│ │ │
├─ GET / │ │
│◄─ HTML (index.html) ────────┤ │
│ │ │
├─ GET /api/sweep/stream ─────► │
│ ├─ Popen(nmap -sn ...) ──►│
│◄── SSE: host_found ─────────┤◄── stdout line ─────────┤
│◄── SSE: sweep_complete ─────┤ │
│ │ │
├─ GET /api/full-scan/stream ─► │
│ ├─ [para cada scan] ──────►│
│◄── SSE: scan_start ─────────┤ │
│◄── SSE: line (output) ──────┤◄── stdout lines ────────┤
│◄── SSE: scan_done ──────────┤ │
│◄── SSE: complete (host) ────┤ (parse + merge estado) │
│ │ │
├─ GET /api/report/pdf/{ip} ──► │
│◄── PDF (ReportLab) ─────────┤ │
O estado global (state) é um dicionário Python partilhado entre threads, protegido por threading.Lock(). Contém todos os hosts descobertos, com os respectivos dados de portas, vulnerabilidades, mitigações e histórico de scans.
Cada scan individual é executado e o seu output é parseado e merged no estado do host sem sobrescrever dados anteriores — portas são adicionadas sem duplicação, vulnerabilidades são deduplicadas, e campos como OS/hostname são preenchidos apenas quando ausentes.
# Ver hosts descobertos
curl http://localhost:5000/api/state | python3 -m json.tool
# Descarregar relatório JSON de um host
curl http://localhost:5000/api/report/json/192.168.1.1 -o relatorio.json
# Descarregar PDF de todos os hosts
curl http://localhost:5000/api/report/pdf/all -o relatorio_completo.pdf# Acompanhar scan FTP em tempo real
curl -N "http://localhost:5000/api/single-scan/stream?target=192.168.1.50&scan_id=ftp_backdoor"| Vista | Descrição |
|---|---|
| Sidebar | Lista de hosts com dots verde/cinza, badges "NOVO", "X VULN", chips de portas abertas |
| Scan em Progresso | Barra de steps com spinner no step activo, terminal com output verde em tempo real |
| Relatório | Grid de 5 stats (portas, críticas, altas, total vulns, mitigações) + tabela de portas + cards de vulns por severidade |
| Mitigações | Cards expansíveis com descrição, lista de passos e bloco de comandos copiáveis |
| Histórico | Tabela agrupada por sessão com timestamps, duração e toggle para output raw |
| PDF exportado | Capa com metadados, índice de hosts, secções por host com tabelas coloridas |
sudo apt-get install nmap
# Verificar:
nmap --versionO requirements.txt não inclui ReportLab. Instalar manualmente:
pip3 install reportlab --break-system-packages# Executar com sudo:
sudo python3 app.py# Verificar o processo:
lsof -i :5000
# Matar:
kill -9 <PID>
# Ou alterar a porta em app.py- Verificar que a rede está correcta no campo da sidebar
- Confirmar que o utilizador tem permissão para enviar pacotes ICMP
- Tentar com
sudopara garantir permissões completas
pip3 install "reportlab>=3.6" --break-system-packagesAdicionar ao proxy:
proxy_read_timeout 600s;
proxy_buffering off;| Área | Sugestão |
|---|---|
| Persistência | Guardar estado em SQLite ou JSON em disco para sobreviver a reinícios |
| Autenticação | Adicionar login básico (Flask-Login) para acesso multi-utilizador |
| Agendamento | Scans agendados (cron-like) com notificações por email |
| Integração CVE | Consulta à NVD API para dados actualizados de CVEs |
| Exportação HTML | Relatório HTML standalone para partilha fácil |
| Comparação de Scans | Diff entre sessões para detectar mudanças na superfície de ataque |
| requirements.txt | Adicionar reportlab>=3.6 às dependências declaradas |
| Containerização | Dockerfile para execução isolada e reproduzível |
| Testes | Suite de testes unitários para o parser Nmap e módulos de mitigação |
| Rate limiting | Protecção contra scans acidentais em larga escala |
- Toda a execução de comandos usa
subprocesscom lista de argumentos (não shell=True), mitigando injecção de comandos - Lock de threading (
threading.Lock) protege o estado partilhado contra race conditions - Escape HTML (
esc()) em todo o output dinâmico no frontend previne XSS - Servidor Flask inicia em modo
debug=Falseem produção
- Não expor na internet — usar apenas em redes locais isoladas ou via VPN
- Adicionar autenticação antes de qualquer exposição externa
- Restringir
host="0.0.0.0"parahost="127.0.0.1"se o acesso for apenas local - Registar todas as actividades de scan em ficheiro de log para auditoria
- Ping sweep numa /24: ~5-15 segundos (dependendo da rede e TTL)
- Scan completo de um host: 2-15 minutos (o
full_vulncom-p-é o mais lento) - Scans paralelos: cada scan corre na sua própria thread; múltiplos hosts podem ser scaneados em simultâneo
- Memória: estado em RAM — em redes grandes (/16), considerar limitar o número de hosts activos em memória
- SSE: cada cliente aberto mantém uma conexão HTTP persistente; adequado para uso individual/pequena equipa
Desenvolvido como ferramenta educativa de segurança de redes.
Para contribuições, issues ou sugestões, abrir uma issue no repositório do projecto.
MIT License — ver ficheiro LICENSE para detalhes completos.
Uso permitido para: fins educativos, pentest em ambientes autorizados, auditoria interna.
Uso proibido em: redes sem autorização expressa do proprietário.