
s3dns v0.2.22
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
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.
🆕 Mise à jour 2026/03/06
- Support TCP/53 — S3DNS écoute désormais sur les ports UDP et TCP 53. Les clients qui réessaient en TCP après une réponse UDP tronquée sont traités correctement, la requête étant transmise en amont via TCP pour récupérer la réponse complète.
- Tampon DNS plus grand — Le tampon de réception UDP est passé de 512 à 4096 octets. Les options EDNS0 du client sont transmises telles quelles au résolveur amont.
- Cache de réponses — Cache LRU basé sur TTL pour les réponses DNS, partagé entre les chemins UDP et TCP. Réduit la charge amont et la latence lors des sessions de reconnaissance actives. Configurable via
CACHE_SIZE(par défaut :1000entrées, mettre à0pour désactiver). - Limitation de débit — Limite du taux de requêtes par IP cliente pour éviter les abus. Configurable via
RATE_LIMIT(par défaut :100req/s, mettre à0pour désactiver). - Détection de prise de contrôle de sous-domaine — Lorsqu'un domaine correspond à un modèle de stockage cloud mais renvoie
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. - Vérifications de plages IP IPv6 — Les enregistrements AAAA sont désormais également résolus et vérifiés par rapport aux plages IP de stockage cloud connues. Les préfixes AWS IPv6 S3 sont chargés en même temps que les plages IPv4.
- Limite de profondeur CNAME — Le suivi récursif des chaînes CNAME est désormais plafonné (par défaut : 10 sauts) pour éviter les boucles infinies sur des enregistrements artificiels ou cycliques. Configurable via le paramètre
max_cname_depth.
Mise à jour 2025/08/19
- Ajout des plages IP AWS hors ligne sous forme de fichier JSON.
- Ajout des plages IP Azure Storage hors ligne sous forme de fichier JSON.
- Ajout de l'option pour désactiver la vérification des plages IP pour chaque service en utilisant :
AZURE_IP_RANGES=falseouAWS_IP_RANGES=false(par défaut true).
- Déplacement des
regex_patternset des motifs codés en dur vers le dossierpatternssous forme de fichiers YAML. Vous pouvez ajouter vos propres motifs.- Les motifs regex doivent commencer par
regex_.
- Les motifs regex doivent commencer par
- Ajout de plusieurs autres fournisseurs cloud :
- IBM Cloud Object Storage
- Oracle Object Storage
- Alibaba OSS
- Backblaze B2
- Linode Object Storage
- Scaleway Object Storage
- Vultr Object Storage
- Cloudflare R2
Mise à jour 2025/06/21
- Ajout du support AWS GovCloud.
Mise à jour 2025/04/16
- Mise à jour des motifs regex.
- Mise à jour de la sortie pour une meilleure visibilité (affichage du domaine d'origine pour les CNAME, de l'IP cliente et des indicateurs de plage IP).
- Téléchargement automatique des plages IP depuis AWS — elles sont désormais également vérifiées !
- Option d'ajouter vos propres plages IP (ajustez manuellement les motifs ou les plages IP dans la classe).
Mise à jour 2025/04/14
- Ajout du support regex pour les buckets Google Cloud Storage et Azure Blob Storage.
🚀 Fonctionnalités
- Fonctionne comme serveur DNS sur le port
53(UDP et TCP) - Détecte les potentiels buckets de stockage cloud dans les requêtes DNS :
- AWS S3 (style hôte virtuel et chemin, y compris GovCloud)
- Buckets GCP
- Conteneurs Azure Blob
- DigitalOcean Spaces, Wasabi, IBM COS, Oracle Object Storage, Alibaba OSS, Backblaze B2, Linode, Scaleway, Vultr, Cloudflare R2
- Suit les chaînes CNAME de manière récursive (limite de profondeur configurable) pour détecter les liens vers des buckets cloud masqués
- Signale les prises de contrôle de sous-domaine potentielles — motifs de stockage cloud qui renvoient NXDOMAIN
- Vérifie les IP résolues (A et AAAA) par rapport aux plages IP AWS S3 et Azure Storage connues
- Cache de réponses avec TTL pour réduire la latence et la charge amont pendant la reconnaissance
- Limitation de débit par IP pour prévenir les abus
- Enregistre toutes les découvertes dans la console et dans un fichier
- Adapté aux conteneurs
⚙️ Comment ça fonctionne
S3DNS écoute sur le port 53 (UDP et TCP) pour les requêtes DNS. Pour chaque requête, il :
- Extrait le domaine demandé
- Vérifie le cache de réponses — si une réponse en cache valide existe, elle est renvoyée immédiatement
- Transmet la requête à un résolveur DNS réel (ex.
1.1.1.1) — en UDP pour les clients UDP, en TCP pour les clients TCP - Renvoie la réponse DNS valide au client
En parallèle, il :
- Vérifie les motifs de bucket de stockage cloud (correspondance regex et nom d'hôte codé en dur)
- Vérifie les IP résolues par rapport aux plages AWS S3 et Azure Storage connues (IPv4 et IPv6)
- Suit les chaînes CNAME de manière récursive jusqu'à la profondeur configurée
- Signale les hits NXDOMAIN sur les motifs correspondants comme candidats potentiels à la prise de contrôle de sous-domaine
- Enregistre toutes les découvertes dans la console et dans
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.
🧱 Prérequis
Vous n'aurez besoin que de l'un des éléments suivants :
- Python 3.11+
- Docker (optionnel, mais recommandé)
🔧 Installation
Nécessaire uniquement si vous souhaitez l'exécuter localement avec Python
Cloner le dépôt
git clone https://github.com/olizimmermann/s3dns.git
cd s3dns
Installer les dépendances
(L'utilisation d'un environnement virtuel est recommandée)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
🧪 Utilisation
Exécuter avec Python
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
- Si vous construisez l'image vous-même, assurez-vous de la taguer comme la version Docker Hub pour la cohérence :
docker build -t ozimmermann/s3dns:latest .
Utiliser Docker
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
Construire et exécuter avec Docker
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 :
- Dans le terminal, et/ou
- Dans
./bucket_findings/
Dépannage
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
🌐 Utiliser S3DNS en reconnaissance
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.
⚙️ Configuration
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.
Drapeaux en ligne de commande
Exécutez python s3dns.py -h pour la liste complète :
| 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) |
Exemple :
sudo python s3dns.py -l 0.0.0.0 -u 1.1.1.1 --rate-limit 200 --no-azure-ip-ranges
Variables d'environnement
| 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é) |
⚠️ Note sur les plages IP Azure
É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
Ajouter des motifs personnalisés
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.
Mode débogage
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
Exemple de sortie

Contribuer
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
Licence MIT — Libre d'utilisation, d'amélioration et de partage.
⚠️ Avertissement
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.