Sistema web profissional para testes de segurança em redes WiFi
Instalação • Uso • API • Ngrok • Deploy
- Sobre o Projeto
- Arquitetura
- Tecnologias
- Instalação
- Como Usar
- API Reference
- Ngrok Setup
- Deploy
- Troubleshooting
- Segurança
Este é um sistema web completo para teste de segurança em redes WiFi, desenvolvido com tecnologias modernas e interface visual intuitiva. O projeto foi criado com base no script Python WifiBF.py e expandido para incluir:
- 🌐 Interface Web Moderna - Frontend React responsivo e intuitivo
- 📡 Escaneamento de Redes - Detecta todas as redes WiFi disponíveis
- 📝 Gerenciamento de Wordlists - Criar, upload e gerenciar listas de senhas
- ⚡ Teste de Segurança - Bruteforce com progresso em tempo real
- 📊 Logs em Tempo Real - WebSocket para atualizações instantâneas
- 🔒 Sistema de Segurança - CORS, validações e proteções
O sistema possui uma interface visual completa com:
- Painel de redes WiFi com indicador de força do sinal
- Gerenciador visual de wordlists
- Painel de controle com barra de progresso
- Visualizador de logs em tempo real
- Design moderno com gradientes e animações
bruteforce-wifi/
├── server/ # Backend Node.js
│ ├── index.js # Servidor Express + WebSocket
│ ├── routes/
│ │ ├── wifi.js # Rotas de WiFi (scan, start, stop)
│ │ └── wordlist.js # Rotas de wordlists (CRUD)
│ └── utils/
│ └── wifiScanner.js # Lógica de scan e bruteforce
│
├── client/ # Frontend React
│ ├── public/
│ │ └── index.html # HTML base
│ └── src/
│ ├── components/ # Componentes React
│ │ ├── NetworkScanner.js # Lista de redes WiFi
│ │ ├── WordlistManager.js # Gerenciador de wordlists
│ │ ├── BruteforcePanel.js # Painel de controle
│ │ └── LogViewer.js # Visualizador de logs
│ ├── services/
│ │ ├── api.js # Cliente API (Axios)
│ │ └── websocket.js # Cliente WebSocket
│ ├── App.js # Componente principal
│ └── index.js # Entry point
│
├── wordlists/ # Armazenamento de wordlists
│ └── words.txt # Wordlist padrão (4809 senhas)
│
├── WifiBF.py # Script Python original
├── package.json # Dependências do projeto
├── vercel.json # Configuração Vercel
├── ngrok.yml # Configuração Ngrok
└── README.md # Este arquivo
┌─────────────┐ HTTP/WS ┌─────────────┐
│ Frontend │ <──────────────────────> │ Backend │
│ (React) │ │ (Node.js) │
└─────────────┘ └─────────────┘
│
│ System Commands
│ (networksetup, airport)
▼
┌─────────────┐
│ macOS │
│ WiFi API │
└─────────────┘
- Node.js 18+ - Runtime JavaScript
- Express.js 4.x - Framework web
- WebSocket (ws) - Comunicação em tempo real
- Multer - Upload de arquivos
- CORS - Cross-Origin Resource Sharing
- Child Process - Execução de comandos do sistema
- React 18 - Biblioteca UI
- Axios - Cliente HTTP
- WebSocket API - Comunicação real-time
- CSS3 - Estilização moderna com gradientes
- Create React App - Tooling e build
- Ngrok - Túnel HTTPS para localhost
- Vercel - Deploy de frontend
- Nodemon - Hot reload em desenvolvimento
- Concurrently - Execução paralela de scripts
- Node.js 14+ - Download
- npm ou yarn - Incluído com Node.js
- macOS - Sistema operacional (comandos específicos do macOS)
- Homebrew - Gerenciador de pacotes para macOS
git clone <seu-repositorio>
cd bruteforce-wifi# Instalar todas as dependências (backend + frontend)
npm run install-allOu manualmente:
# Backend
npm install
# Frontend
cd client
npm install
cd ..# Verificar estrutura
ls -la
# Deve mostrar:
# - server/
# - client/
# - wordlists/
# - package.jsonnpm run devEste comando inicia backend e frontend simultaneamente.
# Terminal 1 - Backend
npm run server
# ou
node server/index.js
# Terminal 2 - Frontend
npm run client
# ou
cd client && npm start# Build do frontend
npm run build
# Iniciar em modo produção
NODE_ENV=production node server/index.js- Frontend Local: http://localhost:3000
- Backend Local: http://localhost:5000
- WebSocket: ws://localhost:5000
Local: http://localhost:5000/api
Ngrok: https://<seu-ngrok>.ngrok-free.dev/api
Ngrok: https://judson-throneless-aide.ngrok-free.dev/api
Escaneia redes WiFi disponíveis.
Response:
{
"success": true,
"networks": [
{
"ssid": "MinhaRede",
"bssid": "00:11:22:33:44:55",
"rssi": -45,
"channel": "6",
"security": "WPA2(PSK/AES/AES)"
}
]
}Inicia teste de bruteforce.
Request:
{
"ssid": "MinhaRede",
"wordlistPath": "/path/to/wordlist.txt"
}Response:
{
"success": true,
"message": "Bruteforce iniciado"
}Para o teste em execução.
Response:
{
"success": true,
"message": "Bruteforce parado"
}Obtém status atual do teste.
Response:
{
"success": true,
"status": {
"isRunning": true,
"ssid": "MinhaRede",
"currentPassword": "senha123",
"attemptCount": 150,
"totalPasswords": 4809,
"startTime": "2025-10-02T03:00:00.000Z"
}
}Lista todas as wordlists disponíveis.
Response:
{
"success": true,
"wordlists": [
{
"name": "words.txt",
"path": "/path/to/wordlists/words.txt",
"size": 50171,
"passwordCount": 4809,
"isDefault": true
}
]
}Faz upload de uma wordlist.
Request: multipart/form-data
wordlist: arquivo .txt
Response:
{
"success": true,
"message": "Wordlist enviada com sucesso",
"file": {
"name": "minha-wordlist.txt",
"path": "/path/to/wordlists/minha-wordlist.txt",
"size": 12345
}
}Cria nova wordlist manualmente.
Request:
{
"name": "minha-lista",
"passwords": ["senha1", "senha2", "senha3"]
}Response:
{
"success": true,
"message": "Wordlist criada com sucesso",
"file": {
"name": "minha-lista.txt",
"path": "/path/to/wordlists/minha-lista.txt",
"passwordCount": 3
}
}Deleta uma wordlist.
Response:
{
"success": true,
"message": "Wordlist deletada com sucesso"
}Conexão automática, sem eventos enviados pelo cliente.
{
"type": "start",
"data": {
"ssid": "MinhaRede",
"totalPasswords": 4809
}
}{
"type": "progress",
"data": {
"attemptCount": 150,
"totalPasswords": 4809,
"currentPassword": "senha123",
"percentage": "3.12"
}
}{
"type": "success",
"data": {
"ssid": "MinhaRede",
"password": "senhaCorreta123",
"attemptCount": 234
}
}{
"type": "failed",
"data": {
"attemptCount": 150,
"password": "senhaErrada"
}
}{
"type": "finished",
"data": {
"message": "Todas as senhas foram testadas sem sucesso",
"attemptCount": 4809
}
}Ngrok é uma ferramenta que cria um túnel seguro HTTPS para expor seu servidor local na internet.
brew install ngrok- Acesse: https://ngrok.com/download
- Baixe a versão para macOS
- Extraia e mova para
/usr/local/bin
- Acesse: https://dashboard.ngrok.com/signup
- Cadastre-se (Google, GitHub ou Email)
- Confirme seu email
- Faça login em: https://dashboard.ngrok.com/get-started/your-authtoken
- Copie seu authtoken (exemplo:
2ab...xyz)
ngrok config add-authtoken SEU_TOKEN_COMPLETO_AQUIExemplo:
ngrok config add-authtoken 33UZre4pA8qeweg5exFeyhsVOg9_6H4gXy2nJkdYFBA2WXYQi# Certifique-se que o backend está rodando
node server/index.js
# Em outro terminal, expor com ngrok
ngrok http 5000Output:
Session Status online
Forwarding https://abc-123.ngrok-free.dev -> http://localhost:5000
URLs disponíveis:
- Raiz:
https://abc-123.ngrok-free.dev/ - API:
https://abc-123.ngrok-free.dev/api/wifi/scan
# Certifique-se que o frontend está rodando
cd client && npm start
# Em outro terminal
ngrok http 3000Importante: Configure o React para aceitar hosts externos:
Edite client/package.json:
"scripts": {
"start": "DANGEROUSLY_DISABLE_HOST_CHECK=true react-scripts start"
}Crie arquivo ngrok.yml:
version: "2"
authtoken: SEU_TOKEN_AQUI
tunnels:
backend:
proto: http
addr: 5000
frontend:
proto: http
addr: 3000Inicie ambos:
ngrok start --all --config=ngrok.yml# Obter URL do ngrok
curl http://127.0.0.1:4040/api/tunnels | jq -r '.tunnels[0].public_url'
# Testar API
curl https://SEU-NGROK.ngrok-free.dev/api/wordlist/listAcesse: http://127.0.0.1:4040
Você verá:
- 📊 Estatísticas de tráfego
- 📝 Requisições em tempo real
- 🔍 Detalhes de cada request/response
| Recurso | Limite Gratuito |
|---|---|
| Túneis simultâneos | 1 |
| Conexões/minuto | 40 |
| URL | Aleatória (muda ao reiniciar) |
| HTTPS | ✅ Sim |
| Autenticação | ❌ Não |
Personal Plan - $8/mês:
- 3 túneis simultâneos
- URLs customizadas
- IP whitelisting
- Autenticação básica
Pro Plan - $20/mês:
- 5 túneis
- Domínios customizados
- Reserva de URLs
node server/index.jsngrok http 5000
# Copie a URL: https://abc-123.ngrok-free.devEdite client/.env.production:
REACT_APP_API_URL=https://abc-123.ngrok-free.dev/api
REACT_APP_WS_URL=wss://abc-123.ngrok-free.dev# Instalar Vercel CLI
npm i -g vercel
# Deploy
cd client
vercel --prodcd client
npm run build
vercel --prodConfigure variáveis de ambiente na Vercel:
REACT_APP_API_URL=http://SEU-IP:5000/api
REACT_APP_WS_URL=ws://SEU-IP:5000
Edite server/utils/wifiScanner.js:
// macOS (atual)
const { stdout } = await execAsync(
'/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s'
);
// Linux (adaptação)
const { stdout } = await execAsync('nmcli -t -f SSID,SIGNAL,SECURITY dev wifi');# SSH no servidor
ssh user@seu-servidor.com
# Clonar projeto
git clone <seu-repo>
cd bruteforce-wifi
# Instalar dependências
npm run install-all
# Build frontend
npm run build
# Instalar PM2
npm install -g pm2
# Iniciar com PM2
pm2 start server/index.js --name wifi-bruteforce
pm2 save
pm2 startupCausa: O script usa comandos específicos do macOS.
Solução:
- Use em macOS
- Ou adapte para Linux (veja seção Deploy)
Causa: Dependências não instaladas.
Solução:
npm run install-allCausa: Outra aplicação usando a porta.
Solução:
# Encontrar processo
lsof -ti:5000
# Matar processo
lsof -ti:5000 | xargs kill -9
# Ou usar outra porta
PORT=5001 node server/index.jsCausa: React rejeita hosts desconhecidos.
Solução: Configure no package.json:
"start": "DANGEROUSLY_DISABLE_HOST_CHECK=true react-scripts start"Causa: Firewall ou CORS bloqueando.
Solução:
// server/index.js
app.use(cors({
origin: '*', // ou especifique domínios permitidos
credentials: true
}));Causa: Token não configurado.
Solução:
ngrok config add-authtoken SEU_TOKENCausa: Diretório não existe.
Solução:
mkdir -p wordlists
cp words.txt wordlists/LEIA ATENTAMENTE:
- ✅ USE APENAS EM REDES PRÓPRIAS
- ❌ Testar redes sem autorização é CRIME
- 📚 Esta ferramenta é EXCLUSIVAMENTE EDUCACIONAL
- ⚖️ O desenvolvedor NÃO SE RESPONSABILIZA por uso indevido
- 📝 Sempre obtenha AUTORIZAÇÃO ESCRITA antes de testar
Lei Nº 12.737/2012 (Lei Carolina Dieckmann):
- Invasão de dispositivo sem autorização: 6 meses a 2 anos de detenção
- Se causar prejuízo econômico: 1 a 3 anos de reclusão
-
Autenticação
- Adicione autenticação ao sistema em produção
- Use JWT ou sessões seguras
-
HTTPS Obrigatório
- Use sempre HTTPS em produção
- Configure certificados SSL
-
Rate Limiting
- Implemente limites de requisições
- Use Express Rate Limit
-
Logs e Auditoria
- Mantenha logs de todas as ações
- Registre IPs e timestamps
-
Wordlists Seguras
- Não compartilhe wordlists públicas
- Use senhas fictícias para testes
// server/middleware/auth.js
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'Token não fornecido' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
next();
} catch (error) {
res.status(401).json({ error: 'Token inválido' });
}
};const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutos
max: 100 // limite de 100 requisições
});
app.use('/api/', limiter);const helmet = require('helmet');
app.use(helmet());- Linhas de Código: ~3.500
- Componentes React: 4
- Endpoints API: 9
- Eventos WebSocket: 6
- Dependências: 26
- Wordlist Padrão: 4.809 senhas
Contribuições são bem-vindas! Por favor:
- Fork o projeto
- Crie uma branch (
git checkout -b feature/NovaFeature) - Commit suas mudanças (
git commit -m 'Adiciona NovaFeature') - Push para a branch (
git push origin feature/NovaFeature) - Abra um Pull Request
Este projeto é fornecido "como está" para fins educacionais.
Isenção de Responsabilidade:
- Use por sua conta e risco
- Apenas para aprendizado
- Sempre com autorização
- Script Python Original: Brahim Jarrar
- Adaptação macOS: Gemini
- Sistema Web: Desenvolvido com Claude Code
- Tecnologias: React, Node.js, Express, WebSocket
Para questões técnicas ou bugs:
- Abra uma Issue
- Consulte a seção Troubleshooting