
Serveur DNS passif qui détecte les buckets de stockage cloud exposés (AWS S3, GCP, Azure) en résolvant les requêtes DNS, en traçant les chaînes CNAME, et en signalant les potentielles prises de contrôle de sous-domaines lors de la reconnaissance.
s3dns est un serveur DNS léger qui aide à découvrir les buckets de stockage cloud (AWS S3, Google Cloud Storage et Azure Blob) en résolvant les requêtes DNS, en traçant les CNAME et en faisant correspondre les modèles d'URL de buckets connus.
C'est un compagnon pratique pour les testeurs d'intrusion, les chasseurs de bug bounty et les analystes en sécurité cloud qui souhaitent détecter les buckets cloud exposés lors de l'analyse du trafic DNS.
Si S3DNS vous fait gagner du temps lors d'une session de reconnaissance, pensez à lui donner une ⭐️ — cela aide les autres à trouver le projet.
CACHE_SIZE (par défaut : 1000 entrées, mettre à 0 pour désactiver).RATE_LIMIT (par défaut : 100 req/s, mettre à 0 pour désactiver).NXDOMAIN, S3DNS le signale comme une possible prise de contrôle de domaine. Cela indique un enregistrement DNS orphelin pointant vers un bucket non réclamé qu'un attaquant pourrait enregistrer.max_cname_depth.AZURE_IP_RANGES=false ou AWS_IP_RANGES=false (par défaut true).regex_patterns et des motifs codés en dur vers le dossier patterns sous forme de fichiers YAML. Vous pouvez ajouter vos propres motifs.
regex_.53 (UDP et TCP)S3DNS écoute sur le port 53 (UDP et TCP) pour les requêtes DNS. Pour chaque requête, il :
1.1.1.1) — en UDP pour les clients UDP, en TCP pour les clients TCPEn parallèle, il :
s3dns.log⚡ Utilisez ceci comme votre DNS pendant la reconnaissance, et il fera remonter passivement les buckets cloud et les candidats à la prise de contrôle pour chaque domaine que vos outils ou navigateur résolvent.
Vous n'aurez besoin que de l'un des éléments suivants :
Nécessaire uniquement si vous souhaitez l'exécuter localement avec Python
git clone https://github.com/olizimmermann/s3dns.git
cd s3dns
(L'utilisation d'un environnement virtuel est recommandée)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
Le port 53 nécessite des privilèges élevés :
sudo python s3dns.py
Si sudo signale un module manquant, essayez : sudo venv/bin/python s3dns.py
docker build -t ozimmermann/s3dns:latest .La façon la plus simple de démarrer avec 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
Les découvertes sont enregistrées :
./bucket_findings/Lorsque vous utilisez S3DNS sur la même machine où vous effectuez l'analyse, il peut être utile de définir le drapeau --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
Étant donné que le port 53 nécessite des privilèges élevés, certains utilisateurs (par exemple, les utilisateurs Mac) peuvent avoir besoin de sudo :
sudo docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--name "s3dns" \
ozimmermann/s3dns:latest
Définissez le résolveur DNS de votre système ou outil sur votre instance S3DNS.
En naviguant ou en fuzzant votre cible, S3DNS analyse chaque domaine et vous indique s'il se résout en :
- Un bucket AWS S3
- Un bucket GCP
- Un conteneur Azure Blob
- L'un des 13 autres fournisseurs de stockage cloud pris en charge
Il suit les CNAME, donc si un domaine pointe vers
cdn.example.com, qui à son tour pointe vers un bucket cloud, il le détectera également.Il signale également les prises de contrôle de sous-domaine potentielles — si un domaine correspond à un motif de stockage cloud mais que la cible n'existe pas (NXDOMAIN), l'enregistrement orphelin est mis en évidence comme un candidat possible à la prise de contrôle.
Utilisez-le passivement lors de l'analyse d'un site pour repérer les buckets exposés et les opportunités de prise de contrôle sans sondage actif.
Vous pouvez ajuster le comportement via des drapeaux en ligne de commande, des variables d'environnement ou en modifiant s3dns.py.
La priorité pour chaque option est : drapeau en ligne de commande > variable d'environnement > invite interactive / valeur par défaut. L'exécution sans drapeau se comporte exactement comme avant.
Exécutez python s3dns.py -h pour la liste complète :
Exemple :
sudo python s3dns.py -l 0.0.0.0 -u 1.1.1.1 --rate-limit 200 --no-azure-ip-ranges
Étant donné que Microsoft ne nomme pas explicitement ses plages IP Azure Blob Storage, S3DNS utilise toutes les adresses IP Azure Storage fournies publiquement. Cela peut entraîner des faux positifs. Envisagez de désactiver cette vérification si vous rencontrez des problèmes :
AZURE_IP_RANGES=false
Ajoutez des fichiers YAML dans le répertoire patterns/. Les fichiers préfixés par regex_ sont traités comme des motifs regex ; tous les autres sont traités comme des correspondances de sous-chaîne.
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
Définir plusieurs variables d'environnement dans 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

Les contributions sont les bienvenues — nouveaux motifs de fournisseurs cloud, corrections de bugs et améliorations. Voir CONTRIBUTING.md pour les directives.
Les fichiers de motifs se trouvent dans patterns/. Ajouter le support d'un nouveau fournisseur est aussi simple que d'ajouter une entrée YAML — aucun Python requis.
Licence MIT — Libre d'utilisation, d'amélioration et de partage.
Utilisez de manière responsable. Ne scannez que les domaines que vous possédez ou pour lesquels vous avez l'autorisation explicite d'analyser.
Les accès ou sondages non autorisés peuvent être illégaux.
| Drapeau | Variable d'environnement équivalente | Description |
|---|
-h, --help | – | Affiche l'aide et quitte |
--version | – | Affiche la version et quitte |
-d, --debug | DEBUG | Active la sortie de débogage verbeuse |
-l, --listen IP | LOCAL_DNS_SERVER_IP | Interface locale sur laquelle écouter |
-u, --upstream IP | REAL_DNS_SERVER_IP | Résolveur DNS amont auquel transmettre |
-b, --bucket-file CHEMIN | BUCKET_FILE | Chemin pour écrire les domaines de buckets découverts |
--aws-ip-ranges / --no-aws-ip-ranges | AWS_IP_RANGES | Active/désactive les vérifications des plages IP AWS S3 |
--azure-ip-ranges / --no-azure-ip-ranges | AZURE_IP_RANGES | Active/désactive les vérifications des plages IP Azure Storage |
--rate-limit N | RATE_LIMIT | Nombre max de requêtes DNS/s par IP cliente (0 = désactivé) |
--cache-size N | CACHE_SIZE | Nombre max de réponses DNS en cache (0 = désactivé) |
--max-cname-depth N | – | Profondeur max de chaîne CNAME à suivre (par défaut : 10) |
| Variable | Valeur par défaut | Description |
|---|
DEBUG | false | Active la sortie de débogage verbeuse |
AWS_IP_RANGES | true | Active les vérifications des plages IP AWS S3 |
AZURE_IP_RANGES | true | Active les vérifications des plages IP Azure Storage |
REAL_DNS_SERVER_IP | 1.1.1.1 | Résolveur DNS amont pour transmettre les requêtes |
LOCAL_DNS_SERVER_IP | 0.0.0.0 | Interface locale sur laquelle écouter |
BUCKET_FILE | buckets.txt | Chemin pour écrire les domaines de buckets découverts |
RATE_LIMIT | 100 | Nombre max de requêtes DNS par seconde par IP cliente (0 = désactivé) |
CACHE_SIZE | 1000 | Nombre max de réponses DNS en cache (0 = désactivé) |