
Servidor DNS passivo que detecta buckets de armazenamento em nuvem expostos (AWS S3, GCP, Azure) resolvendo requisições DNS, rastreando cadeias CNAME e sinalizando potenciais sequestros de subdomínio durante o reconhecimento.
s3dns é um servidor DNS leve que ajuda a descobrir buckets de armazenamento em nuvem (AWS S3, Google Cloud Storage e Azure Blob) resolvendo consultas DNS, rastreando CNAMEs e combinando padrões conhecidos de URLs de buckets.
É uma ferramenta útil para testadores de penetração, caçadores de recompensas e analistas de segurança em nuvem que desejam capturar buckets de nuvem expostos durante a análise de tráfego DNS.
Se o S3DNS economizar seu tempo em uma sessão de reconhecimento, considere dar uma ⭐️ — isso ajuda outras pessoas a encontrarem o projeto.
CACHE_SIZE (padrão: 1000 entradas; defina 0 para desativar).RATE_LIMIT (padrão: 100 req/s; defina 0 para desativar).NXDOMAIN, o S3DNS o marca como um possível takeover de domínio. Isso indica um registro DNS órfão apontando para um bucket não reivindicado que um atacante poderia registrar.max_cname_depth.AZURE_IP_RANGES=false ou AWS_IP_RANGES=false (padrão é true).regex_patterns e padrões fixos para a pasta patterns como arquivos YAML. Você pode adicionar seus próprios padrões.
regex_.53 (UDP e TCP)O S3DNS escuta na porta 53 (UDP e TCP) por consultas DNS. Para cada requisição ele:
1.1.1.1) — via UDP para clientes UDP, via TCP para clientes TCPEm paralelo, ele:
s3dns.log⚡ Use isto como seu DNS durante o reconhecimento, e ele irá expor passivamente buckets na nuvem e candidatos a takeover para cada domínio que suas ferramentas ou navegador resolverem.
Você precisará apenas de um dos seguintes:
Necessário apenas se quiser executar localmente com Python
git clone https://github.com/olizimmermann/s3dns.git
cd s3dns
(Recomenda-se o uso de ambiente virtual)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
A porta 53 requer privilégios elevados:
sudo python s3dns.py
Se sudo reclamar de um módulo faltando, tente: sudo venv/bin/python s3dns.py
docker build -t ozimmermann/s3dns:latest .A maneira mais fácil de começar com o S3DNS.
docker pull ozimmermann/s3dns:latest
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--name "s3dns" \
ozimmermann/s3dns:latest
docker build -t ozimmermann/s3dns:latest .
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--name "s3dns" \
ozimmermann/s3dns:latest
Os achados são salvos:
./bucket_findings/Ao usar o S3DNS na mesma máquina onde realiza a análise, pode ser útil definir a flag --network host:
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--network host \
--name "s3dns" \
ozimmermann/s3dns:latest
Como a porta 53 requer privilégios elevados, alguns usuários (ex.: usuários Mac) podem precisar de sudo:
sudo docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--name "s3dns" \
ozimmermann/s3dns:latest
Configure o resolvedor DNS do seu sistema ou ferramenta para sua instância do S3DNS.
Enquanto navega ou faz fuzzing no seu alvo, o S3DNS analisa cada domínio e informa se ele resolve para:
- Um bucket AWS S3
- Um bucket GCP
- Um container Azure Blob
- Qualquer um dos outros 13 provedores de armazenamento em nuvem suportados
Ele segue CNAMEs, então se um domínio aponta para
cdn.example.com, que por sua vez aponta para um bucket na nuvem, ele também capturará isso.Também sinaliza potenciais takeovers de subdomínio — se um domínio corresponde a um padrão de armazenamento em nuvem, mas o alvo não existe (NXDOMAIN), o registro órfão é destacado como um possível candidato a takeover.
Use-o passivamente enquanto analisa um site para detectar buckets expostos e oportunidades de takeover sem sondagem ativa.
Você pode ajustar o comportamento via flags de linha de comando, variáveis de ambiente ou modificando s3dns.py.
A precedência para cada opção é: flag de linha de comando > variável de ambiente > prompt interativo / padrão. Executar sem flags se comporta exatamente como antes.
Execute python s3dns.py -h para a lista completa:
Exemplo:
sudo python s3dns.py -l 0.0.0.0 -u 1.1.1.1 --rate-limit 200 --no-azure-ip-ranges
Como a Microsoft não nomeia explicitamente suas faixas IP de Azure Blob Storage, o S3DNS usa todos os endereços IP do Azure Storage fornecidos publicamente. Isso pode levar a falsos positivos. Considere desabilitar essa verificação se encontrar problemas:
AZURE_IP_RANGES=false
Adicione arquivos YAML no diretório patterns/. Arquivos prefixados com regex_ são tratados como padrões regex; todos os outros são tratados como correspondências de substring.
Python:
sudo su
export DEBUG=true
python s3dns.py
Docker:
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
-e "DEBUG=true" \
--name "s3dns" \
ozimmermann/s3dns:latest
Definindo múltiplas variáveis de ambiente no Docker:
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
-e "LOCAL_DNS_SERVER_IP=0.0.0.0" \
-e "REAL_DNS_SERVER_IP=1.1.1.1" \
-e "RATE_LIMIT=200" \
-e "CACHE_SIZE=2000" \
--name "s3dns" \
ozimmermann/s3dns:latest

Contribuições são bem-vindas — novos padrões de provedores de nuvem, correções de bugs e melhorias. Veja CONTRIBUTING.md para diretrizes.
Os arquivos de padrão ficam em patterns/. Adicionar suporte a um novo provedor é tão simples quanto adicionar uma entrada YAML — não é necessário Python.
Licença MIT — Gratuito para usar, melhorar e compartilhar.
Use com responsabilidade. Apenas escaneie domínios que você possui ou para os quais tenha permissão explícita de análise.
Acesso não autorizado ou sondagem pode ser ilegal.
| Flag | Variável de ambiente equivalente | Descrição |
|---|
-h, --help | – | Mostra ajuda e sai |
--version | – | Mostra versão e sai |
-d, --debug | DEBUG | Habilita saída detalhada de depuração |
-l, --listen IP | LOCAL_DNS_SERVER_IP | Interface local para escutar |
-u, --upstream IP | REAL_DNS_SERVER_IP | Resolvedor DNS upstream para encaminhar |
-b, --bucket-file CAMINHO | BUCKET_FILE | Caminho para escrever domínios de bucket descobertos |
--aws-ip-ranges / --no-aws-ip-ranges | AWS_IP_RANGES | Ativa/desativa verificação de faixas IP do AWS S3 |
--azure-ip-ranges / --no-azure-ip-ranges | AZURE_IP_RANGES | Ativa/desativa verificação de faixas IP do Azure Storage |
--rate-limit N | RATE_LIMIT | Máx. de requisições DNS/s por IP do cliente (0 = desativado) |
--cache-size N | CACHE_SIZE | Máx. de respostas DNS em cache (0 = desativado) |
--max-cname-depth N | – | Profundidade máxima da cadeia de CNAME a seguir (padrão: 10) |
| Variável | Padrão | Descrição |
|---|
DEBUG | false | Habilita saída detalhada de depuração |
AWS_IP_RANGES | true | Ativa verificação de faixas IP do AWS S3 |
AZURE_IP_RANGES | true | Ativa verificação de faixas IP do Azure Storage |
REAL_DNS_SERVER_IP | 1.1.1.1 | Resolvedor DNS upstream para encaminhar consultas |
LOCAL_DNS_SERVER_IP | 0.0.0.0 | Interface local para escutar |
BUCKET_FILE | buckets.txt | Caminho para escrever domínios de bucket descobertos |
RATE_LIMIT | 100 | Máx. de requisições DNS por segundo por IP do cliente (0 = desativado) |
CACHE_SIZE | 1000 | Máx. de respostas DNS em cache (0 = desativado) |