Bancos de dados: superfície de ataque e hardening
Como atacantes mapeiam, autenticam e exfiltram dados em Postgres, MySQL, Mongo e Redis — e o conjunto mínimo de controles para fechar a porta.
🎧 audiobook · nível 1
Bancos de dados: superfície de ataque e hardening
Por que bancos vazam
- Exposição direta (porta 5432/3306/27017/6379 na internet).
- Credenciais default ou hardcoded em repositório público.
- SQL Injection clássica e blind, em código sem prepared statements.
- Backups em S3 público ou snapshots compartilhados acidentalmente.
- Replicação mal configurada (logical replication sem ACL).
Reconhecimento
# Descobrir bancos expostos no escopo autorizado
nmap -sV -p 1433,3306,5432,6379,27017,9200 --script="banner,*-info" alvo.tld
# Buscar credenciais em código público (autorizado / próprio)
trufflehog filesystem ./repo --only-verifiedSQL Injection — o que sqlmap realmente faz
O sqlmap não 'mágica' — ele injeta marcadores, mede diferenças (booleano, tempo, erro, UNION) e infere o schema byte a byte. Saber isso ajuda a entender por que prepared statements eliminam a classe inteira.
# Teste assistido (escopo autorizado)
sqlmap -u "https://alvo.tld/item?id=1" --batch --risk=2 --level=3 \
--technique=BEUST --dbsDefesa que funciona
Prepared statements em 100% do código, ORM com binding, validação de tipo no DTO, WAF apenas como camada extra. Não confie em escaping manual.
Hardening por banco
PostgreSQL
- listen_addresses='localhost' a não ser que precise de rede; pg_hba.conf com 'scram-sha-256'.
- Roles por aplicação, REVOKE ALL em public schema, GRANT mínimo.
- Row Level Security para multi-tenant.
- Backups cifrados (pgbackrest + chave gerenciada).
MySQL / MariaDB
- bind-address=127.0.0.1, validate_password, sql_mode estrito.
- Usuários sem GRANT ALL; nunca usar 'root'@'%'.
MongoDB
- authorization enabled (não é default em versões antigas).
- TLS obrigatório, IP allowlist no Atlas, sem 0.0.0.0/0.
Redis
- requirepass + protected-mode yes, rename-command FLUSHALL '', sem expor à internet.
- Ataques de SSRF + Redis interno são clássicos — segmentar rede.
Template OffSec · aplicar antes de rodar
Objetivo → Preparação → Execução → Evidência → Ética
Objetivo
Identificar exposição de bancos, permissões excessivas, injeção e caminhos de escalonamento — sem tocar em dado de produção.
Pré-requisitos
- Instância de teste (MySQL/Postgres/Mongo em container) com dados sintéticos
- sqlmap, mysql-client, psql instalados
- Autorização explícita se o alvo não é seu
Passos
- Levantar banner e versão via nmap -sV -p 3306,5432,27017,1433
- Testar auth default e listar databases visíveis com usuário fraco
- Enumerar tabelas e privilégios do usuário atual
- Buscar injeção em endpoints da aplicação (sqlmap com --batch --risk=1)
- Correlacionar achado com logs do banco para validar não-falso-positivo
Evidências a coletar
- Saída do sqlmap (--output-dir) versionada
- Print do prompt do banco autenticado
- Log do banco (general log) mostrando a query maliciosa
Regra prática: se você não guardou evidência reprodutível, o achado não existe.
Guia prático (lab autorizado)
alvo · DVWA (nível low→high) em Docker + MySQL local
docker run --rm -it -p 80:80 vulnerables/web-dvwa # depois: sqlmap -u 'http://localhost/vulnerabilities/sqli/?id=1' --cookie='...' --batchverificar · Ative general_log no MySQL e confirme a query injetada aparecendo. Sem log correspondente, é hipótese.
Checklist interativo
Checklist ético (marcar antes do primeiro comando)
Autorização, escopo, lab e proteção de dados. Sem 100%, não roda fora do lab.
Prática segura · Banco de Dados
→ guia do labMonte um ambiente isolado antes de qualquer teste — use Docker (DVWA/juice-shop), uma VM host-only ou um alvo autorizado (HTB, TryHackMe, PortSwigger Academy).
Nunca aponte para alvo em produção. Se estiver no celular, use proot-distro + Debian para não sujar o Termux principal.
