
Server DNS passivo che rileva bucket di archiviazione cloud esposti (AWS S3, GCP, Azure) risolvendo richieste DNS, tracciando catene CNAME e segnalando potenziali takeover di sottodomini durante la ricognizione.
s3dns è un server DNS leggero che aiuta a scoprire bucket di cloud storage (AWS S3, Google Cloud Storage e Azure Blob) risolvendo richieste DNS, tracciando i CNAME e confrontando i pattern URL noti dei bucket.
È un pratico compagno per pentester, cacciatori di bug bounty e analisti di sicurezza cloud che vogliono intercettare bucket cloud esposti durante l'analisi del traffico DNS.
Se S3DNS ti fa risparmiare tempo durante una sessione di ricognizione, considera di dargli una ⭐️ — aiuta altri a trovare il progetto.
CACHE_SIZE (default: 1000 voci, impostare a 0 per disabilitare).RATE_LIMIT (default: 100 req/s, impostare a 0 per disabilitare).NXDOMAIN, S3DNS lo segnala come possibile domain takeover. Ciò indica un record DNS pendente che punta a un bucket non rivendicato che un attaccante potrebbe registrare.max_cname_depth.AZURE_IP_RANGES=false o AWS_IP_RANGES=false (default è true).regex_patterns e pattern hardcoded nella cartella patterns come file YAML. Puoi aggiungere i tuoi pattern.
regex_.53 (UDP e TCP)S3DNS ascolta sulla porta 53 (UDP e TCP) per le query DNS. Per ogni richiesta:
1.1.1.1) — su UDP per client UDP, su TCP per client TCPIn parallelo:
s3dns.log⚡ Usalo come tuo DNS durante la ricognizione e rivelerà passivamente bucket cloud e candidati takeover per ogni dominio che i tuoi strumenti o browser risolvono.
Avrai bisogno solo di uno dei seguenti:
Necessario solo se vuoi eseguirlo localmente con Python
git clone https://github.com/olizimmermann/s3dns.git
cd s3dns
(Si consiglia l'uso di un ambiente virtuale)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
La porta 53 richiede privilegi elevati:
sudo python s3dns.py
Se sudo segnala un modulo mancante, prova: sudo venv/bin/python s3dns.py
docker build -t ozimmermann/s3dns:latest .Il modo più semplice per iniziare con 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
I risultati vengono salvati:
./bucket_findings/Quando usi S3DNS sulla stessa macchina in cui esegui l'analisi, può essere utile impostare il 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
Poiché la porta 53 richiede privilegi elevati, alcuni utenti (es. utenti Mac) potrebbero aver bisogno di sudo:
sudo docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--name "s3dns" \
ozimmermann/s3dns:latest
Imposta il resolver DNS del tuo sistema o strumento sulla tua istanza S3DNS.
Mentre navighi o fai fuzzing del tuo target, S3DNS analizza ogni dominio e ti dice se si risolve in:
- Un bucket AWS S3
- Un bucket GCP
- Un contenitore Azure Blob
- Uno qualsiasi degli altri 13 provider di cloud storage supportati
Segue i CNAME, quindi se un dominio punta a
cdn.example.com, che a sua volta punta a un bucket cloud, lo intercetterà.Segnala anche potenziali subdomain takeover — se un dominio corrisponde a un pattern di cloud storage ma il target non esiste (NXDOMAIN), il record pendente viene evidenziato come possibile candidato takeover.
Usalo passivamente mentre analizzi un sito per individuare bucket esposti e opportunità di takeover senza probing attivo.
Puoi modificare il comportamento tramite flag da riga di comando, variabili d'ambiente o modificando s3dns.py.
La precedenza per ogni opzione è: flag da riga di comando > variabile d'ambiente > prompt interattivo / default. Eseguire senza flag si comporta esattamente come prima.
Esegui python s3dns.py -h per l'elenco completo:
Esempio:
sudo python s3dns.py -l 0.0.0.0 -u 1.1.1.1 --rate-limit 200 --no-azure-ip-ranges
Poiché Microsoft non denomina esplicitamente i propri range IP di Azure Blob Storage, S3DNS utilizza tutti gli indirizzi IP di Azure Storage forniti pubblicamente. Ciò può portare a falsi positivi. Considera di disabilitare questo controllo se riscontri problemi:
AZURE_IP_RANGES=false
Aggiungi file YAML nella directory patterns/. I file con prefisso regex_ vengono trattati come pattern regex; tutti gli altri come corrispondenze di sottostringa.
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
Impostare più variabili d'ambiente in 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

I contributi sono benvenuti — nuovi pattern per provider cloud, correzioni di bug e miglioramenti. Vedi CONTRIBUTING.md per le linee guida.
I file dei pattern risiedono in patterns/. Aggiungere il supporto per un nuovo provider è semplice come aggiungere una voce YAML — non è richiesto Python.
Licenza MIT — Libero da usare, migliorare e condividere.
Utilizza responsabilmente. Scansiona solo domini di cui sei proprietario o per cui hai esplicita autorizzazione all'analisi.
L'accesso non autorizzato o il probing potrebbero essere illegali.
| Flag | Variabile d'ambiente equivalente | Descrizione |
|---|
-h, --help | – | Mostra aiuto ed esci |
--version | – | Mostra versione ed esci |
-d, --debug | DEBUG | Abilita output debug dettagliato |
-l, --listen IP | LOCAL_DNS_SERVER_IP | Interfaccia locale su cui ascoltare |
-u, --upstream IP | REAL_DNS_SERVER_IP | Resolver DNS a monte per l'inoltro |
-b, --bucket-file PERCORSO | BUCKET_FILE | Percorso dove scrivere i domini bucket scoperti |
--aws-ip-ranges / --no-aws-ip-ranges | AWS_IP_RANGES | Attiva/disattiva controlli range IP AWS S3 |
--azure-ip-ranges / --no-azure-ip-ranges | AZURE_IP_RANGES | Attiva/disattiva controlli range IP Azure Storage |
--rate-limit N | RATE_LIMIT | Max richieste DNS/sec per IP client (0 = disabilitato) |
--cache-size N | CACHE_SIZE | Max risposte DNS in cache (0 = disabilitato) |
--max-cname-depth N | – | Profondità massima catena CNAME da seguire (default: 10) |
| Variabile | Default | Descrizione |
|---|
DEBUG | false | Abilita output debug dettagliato |
AWS_IP_RANGES | true | Abilita controlli range IP AWS S3 |
AZURE_IP_RANGES | true | Abilita controlli range IP Azure Storage |
REAL_DNS_SERVER_IP | 1.1.1.1 | Resolver DNS a monte per l'inoltro delle query |
LOCAL_DNS_SERVER_IP | 0.0.0.0 | Interfaccia locale su cui ascoltare |
BUCKET_FILE | buckets.txt | Percorso dove scrivere i domini bucket scoperti |
RATE_LIMIT | 100 | Max richieste DNS al secondo per IP client (0 = disabilitato) |
CACHE_SIZE | 1000 | Max risposte DNS in cache (0 = disabilitato) |