
s3dns v0.2.23
Passiver DNS-Server, der exponierte Cloud-Speicher-Buckets (AWS S3, GCP, Azure) erkennt, indem er DNS-Anfragen auflöst, CNAME-Ketten verfolgt und während der Erkundung potenzielle Subdomain-Übernahmen markiert.
S3DNS
s3dns ist ein schlanker DNS-Server, der hilft, Cloud-Speicher-Buckets (AWS S3, Google Cloud Storage und Azure Blob) aufzuspüren, indem er DNS-Anfragen auflöst, CNAMEs verfolgt und bekannte Bucket-URL-Muster abgleicht.
Es ist ein nützlicher Begleiter für Pentester, Bug-Bounty-Jäger und Cloud-Sicherheitsanalysten, die bei der DNS-Datenverkehrsanalyse offengelegte Cloud-Buckets aufspüren möchten.
Wenn S3DNS dir Zeit in einer Recon-Session spart, ziehe in Betracht, ihm einen ⭐️ zu geben – das hilft anderen, das Projekt zu finden.
🆕 Update 2026/03/06
- TCP/53-Unterstützung — S3DNS lauscht jetzt sowohl auf UDP als auch auf TCP-Port 53. Clients, die nach einer abgeschnittenen UDP-Antwort über TCP wiederholen, werden korrekt behandelt, wobei die Anfrage über TCP an den Upstream weitergeleitet wird, um die vollständige Antwort abzurufen.
- Größerer DNS-Puffer — Der UDP-Empfangspuffer wurde von 512 auf 4096 Bytes erhöht. EDNS0-Optionen des Clients werden unverändert an den Upstream-Resolver weitergegeben.
- Antwort-Cache — TTL-basierter LRU-Cache für DNS-Antworten, der sowohl von UDP- als auch von TCP-Pfaden gemeinsam genutzt wird. Reduziert Upstream-Last und Latenz während aktiver Recon-Sessions. Konfigurierbar über
CACHE_SIZE(Standard:1000Einträge, auf0setzen zum Deaktivieren). - Ratenbegrenzung — Pro-Client-IP-Anforderungsratenbegrenzung, um Missbrauch zu verhindern. Konfigurierbar über
RATE_LIMIT(Standard:100Anfragen/s, auf0setzen zum Deaktivieren). - Erkennung von Subdomain-Übernahmen — Wenn eine Domain zu einem Cloud-Speicher-Muster passt, aber
NXDOMAINzurückgibt, markiert S3DNS dies als mögliche Domain-Übernahme. Dies deutet auf einen hängenden DNS-Eintrag hin, der auf ein nicht beanspruchtes Bucket verweist, das ein Angreifer registrieren könnte. - IPv6-IP-Bereichsprüfungen — AAAA-Einträge werden jetzt ebenfalls aufgelöst und gegen bekannte IP-Bereiche von Cloud-Speichern geprüft. AWS IPv6 S3-Präfixe werden zusammen mit IPv4-Bereichen geladen.
- CNAME-Tiefenbegrenzung — Die rekursive Verfolgung von CNAME-Ketten ist jetzt begrenzt (Standard: 10 Hops), um Endlosschleifen bei konstruierten oder zyklischen Einträgen zu verhindern. Konfigurierbar über den Parameter
max_cname_depth.
Update 2025/08/19
- Offline-AWS-IP-Bereiche als JSON-Datei hinzugefügt.
- Offline-Azure-Storage-IP-Bereiche als JSON-Datei hinzugefügt.
- Option hinzugefügt, die IP-Bereichsprüfung für einen der Dienste zu deaktivieren über:
AZURE_IP_RANGES=falseoderAWS_IP_RANGES=false(Standard ist true).
regex_patternsund hartcodierte Muster in den Ordnerpatternsals YAML-Dateien verschoben. Du kannst eigene Muster hinzufügen.- Regex-Muster müssen mit
regex_beginnen.
- Regex-Muster müssen mit
- Mehrere weitere Cloud-Anbieter hinzugefügt:
- IBM Cloud Object Storage
- Oracle Object Storage
- Alibaba OSS
- Backblaze B2
- Linode Object Storage
- Scaleway Object Storage
- Vultr Object Storage
- Cloudflare R2
Update 2025/06/21
- AWS GovCloud-Unterstützung hinzugefügt.
Update 2025/04/16
- Regex-Muster aktualisiert.
- Ausgabe für bessere Sichtbarkeit aktualisiert (Anzeige der ursprünglichen Domain für CNAMEs, der Client-IP und IP-Bereichsindikatoren).
- Automatisches Herunterladen von IP-Bereichen von AWS — jetzt werden auch diese überprüft!
- Option zum Hinzufügen eigener IP-Bereiche (manuelle Anpassung der Muster oder IP-Bereiche in der Klasse).
Update 2025/04/14
- Regex-Unterstützung für Google Cloud Storage- und Azure Blob Storage-Buckets hinzugefügt.
🚀 Funktionen
- Läuft als DNS-Server auf Port 53 (UDP und TCP)
- Erkennt potenzielle Cloud-Speicher-Buckets in DNS-Anfragen:
- AWS S3 (virtuell gehosteter und Pfad-Stil, inklusive GovCloud)
- GCP-Buckets
- Azure-Blob-Container
- DigitalOcean Spaces, Wasabi, IBM COS, Oracle Object Storage, Alibaba OSS, Backblaze B2, Linode, Scaleway, Vultr, Cloudflare R2
- Verfolgt CNAME-Ketten rekursiv (konfigurierbare Tiefenbegrenzung), um maskierte Cloud-Bucket-Links zu erkennen
- Markiert potenzielle Subdomain-Übernahmen — Cloud-Speicher-Muster, die NXDOMAIN zurückgeben
- Prüft aufgelöste IPs (sowohl A als auch AAAA) gegen bekannte AWS S3- und Azure-Storage-IP-Bereiche
- TTL-bewusster Antwort-Cache zur Reduzierung von Latenz und Upstream-Last während der Recon
- Pro-IP-Ratenbegrenzung zur Verhinderung von Missbrauch
- Protokolliert alle Ergebnisse auf der Konsole und in einer Datei
- Container-freundlich
⚙️ Funktionsweise
S3DNS lauscht auf Port 53 (UDP und TCP) auf DNS-Anfragen. Für jede Anfrage:
- Extrahiert die angefragte Domain
- Prüft den Antwort-Cache — wenn eine gültige zwischengespeicherte Antwort existiert, wird sie sofort zurückgegeben
- Leitet die Anfrage an einen echten DNS-Resolver weiter (z. B.
1.1.1.1) — über UDP für UDP-Clients, über TCP für TCP-Clients - Gibt die gültige DNS-Antwort an den Client zurück
Parallel dazu:
- Prüft auf Cloud-Speicher-Bucket-Muster (Regex und hartcodierte Hostnamen-Muster)
- Prüft aufgelöste IPs gegen bekannte AWS S3- und Azure-Storage-Bereiche (IPv4 und IPv6)
- Verfolgt CNAME-Ketten rekursiv bis zur konfigurierten Tiefe
- Markiert NXDOMAIN-Treffer bei gematchten Mustern als mögliche Subdomain-Übernahmekandidaten
- Protokolliert alle Ergebnisse auf der Konsole und in
s3dns.log
⚡ Verwende dies als deinen DNS während der Recon, und es werden passiv Cloud-Buckets und Übernahmekandidaten für jede Domain angezeigt, die deine Tools oder dein Browser auflösen.
🧱 Voraussetzungen
Du benötigst nur eines der folgenden:
- Python 3.11+
- Docker (optional, aber empfohlen)
🔧 Installation
Nur erforderlich, wenn du es lokal mit Python ausführen möchtest
Repository klonen
git clone https://github.com/olizimmermann/s3dns.git
cd s3dns
Abhängigkeiten installieren
(Die Verwendung einer virtuellen Umgebung wird empfohlen)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
🧪 Verwendung
Mit Python ausführen
Port 53 erfordert erhöhte Rechte:
sudo python s3dns.py
Wenn sudo ein fehlendes Modul meldet, versuche: sudo venv/bin/python s3dns.py
- Wenn du das Image selbst baust, stelle sicher, dass es denselben Tag wie die Docker-Hub-Version erhält:
docker build -t ozimmermann/s3dns:latest .
Mit Docker
Der einfachste Weg, mit S3DNS zu starten.
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
Mit Docker bauen und ausführen
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
Ergebnisse werden gespeichert:
- Im Terminal, und/oder
- In
./bucket_findings/
Fehlerbehebung
Wenn du S3DNS auf demselben Rechner verwendest, auf dem du die Analyse durchführst, kann es hilfreich sein, das --network host-Flag zu setzen:
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--network host \
--name "s3dns" \
ozimmermann/s3dns:latest
Da Port 53 erhöhte Rechte erfordert, benötigen einige Benutzer (z. B. Mac-Benutzer) möglicherweise sudo:
sudo docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--name "s3dns" \
ozimmermann/s3dns:latest
🌐 S3DNS in der Recon verwenden
Setze den DNS-Resolver deines Systems oder Tools auf deine S3DNS-Instanz.
Während du dein Ziel durchsuchst oder fuzzst, analysiert S3DNS jede Domain und teilt dir mit, ob sie auf Folgendes aufgelöst wird:
- Einen AWS S3-Bucket
- Einen GCP-Bucket
- Einen Azure-Blob-Container
- Jeden der 13 anderen unterstützten Cloud-Speicheranbieter
Es verfolgt CNAMEs, sodass es, wenn eine Domain auf
cdn.example.comzeigt und diese wiederum auf ein Cloud-Bucket, dies ebenfalls erkannt wird.Es markiert auch potenzielle Subdomain-Übernahmen — wenn eine Domain einem Cloud-Speicher-Muster entspricht, das Ziel jedoch nicht existiert (NXDOMAIN), wird der hängende Eintrag als möglicher Übernahmekandidat hervorgehoben.
Verwende es passiv, während du eine Seite analysierst, um offengelegte Buckets und Übernahmemöglichkeiten zu entdecken, ohne aktiv zu testen.
⚙️ Konfiguration
Du kannst das Verhalten über Befehlszeilen-Flags, Umgebungsvariablen oder durch Ändern von s3dns.py anpassen.
Die Priorität für jede Option ist: Befehlszeilen-Flag > Umgebungsvariable > interaktive Eingabeaufforderung / Standard. Ohne Flags verhält es sich genau wie zuvor.
Befehlszeilen-Flags
Führe python s3dns.py -h aus, um die vollständige Liste zu sehen:
| Flag | Entsprechende Umgebungsvariable | Beschreibung |
|---|---|---|
-h, --help | – | Hilfe anzeigen und beenden |
--version | – | Version anzeigen und beenden |
-d, --debug | DEBUG | Ausführliche Debug-Ausgabe aktivieren |
-l, --listen IP | LOCAL_DNS_SERVER_IP | Lokale Schnittstelle zum Lauschen |
-u, --upstream IP | REAL_DNS_SERVER_IP | Upstream-DNS-Resolver zum Weiterleiten |
-b, --bucket-file PFAD | BUCKET_FILE | Pfad zum Schreiben entdeckter Bucket-Domains |
--aws-ip-ranges / --no-aws-ip-ranges | AWS_IP_RANGES | AWS S3-IP-Bereichsprüfungen ein-/ausschalten |
--azure-ip-ranges / --no-azure-ip-ranges | AZURE_IP_RANGES | Azure Storage-IP-Bereichsprüfungen ein-/ausschalten |
--rate-limit N | RATE_LIMIT | Max. DNS-Anfragen/s pro Client-IP (0 = deaktiviert) |
--cache-size N | CACHE_SIZE | Max. zwischengespeicherte DNS-Antworten (0 = deaktiviert) |
--max-cname-depth N | – | Maximale CNAME-Kettentiefe (Standard: 10) |
Beispiel:
sudo python s3dns.py -l 0.0.0.0 -u 1.1.1.1 --rate-limit 200 --no-azure-ip-ranges
Umgebungsvariablen
| Variable | Standard | Beschreibung |
|---|---|---|
DEBUG | false | Ausführliche Debug-Ausgabe aktivieren |
AWS_IP_RANGES | true | AWS S3-IP-Bereichsprüfungen aktivieren |
AZURE_IP_RANGES | true | Azure Storage-IP-Bereichsprüfungen aktivieren |
REAL_DNS_SERVER_IP | 1.1.1.1 | Upstream-DNS-Resolver für die Weiterleitung von Anfragen |
LOCAL_DNS_SERVER_IP | 0.0.0.0 | Lokale Schnittstelle zum Lauschen |
BUCKET_FILE | buckets.txt | Pfad zum Schreiben entdeckter Bucket-Domains |
RATE_LIMIT | 100 | Max. DNS-Anfragen pro Sekunde pro Client-IP (0 = deaktiviert) |
CACHE_SIZE | 1000 | Max. zwischengespeicherte DNS-Antworten (0 = deaktiviert) |
⚠️ Hinweis zu Azure-IP-Bereichen
Da Microsoft die IP-Bereiche für Azure Blob Storage nicht explizit benennt, verwendet S3DNS alle öffentlich bereitgestellten Azure Storage-IP-Adressen. Dies kann zu Fehlalarmen führen. Erwäge, diese Prüfung zu deaktivieren, falls Probleme auftreten:
AZURE_IP_RANGES=false
Eigene Muster hinzufügen
Füge YAML-Dateien zum Verzeichnis patterns/ hinzu. Dateien mit dem Präfix regex_ werden als Regex-Muster behandelt; alle anderen als Teilzeichenfolgen-Suche.
Debug-Modus
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
Mehrere Umgebungsvariablen in Docker setzen:
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
Beispielausgabe

Mitwirken
Beiträge sind willkommen – neue Cloud-Anbieter-Muster, Fehlerbehebungen und Verbesserungen. Siehe CONTRIBUTING.md für Richtlinien.
Musterdateien befinden sich in patterns/. Die Unterstützung für einen neuen Anbieter hinzuzufügen ist so einfach wie das Hinzufügen eines YAML-Eintrags – kein Python erforderlich.
📄 Lizenz
MIT-Lizenz – Frei verwendbar, verbesserbar und teilbar.
⚠️ Haftungsausschluss
Verwende es verantwortungsvoll. Scanne nur Domains, die dir gehören oder für die du ausdrückliche Erlaubnis zur Analyse hast.
Unbefugter Zugriff oder Testen kann illegal sein.