
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 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.
CACHE_SIZE (Standard: 1000 Einträge, auf 0 setzen zum Deaktivieren).RATE_LIMIT (Standard: 100 Anfragen/s, auf 0 setzen zum Deaktivieren).NXDOMAIN zurü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.max_cname_depth.AZURE_IP_RANGES=false oder AWS_IP_RANGES=false (Standard ist true).regex_patterns und hartcodierte Muster in den Ordner patterns als YAML-Dateien verschoben. Du kannst eigene Muster hinzufügen.
regex_ beginnen.S3DNS lauscht auf Port 53 (UDP und TCP) auf DNS-Anfragen. Für jede Anfrage:
1.1.1.1) — über UDP für UDP-Clients, über TCP für TCP-ClientsParallel dazu:
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.
Du benötigst nur eines der folgenden:
Nur erforderlich, wenn du es lokal mit Python ausführen möchtest
git clone https://github.com/olizimmermann/s3dns.git
cd s3dns
(Die Verwendung einer virtuellen Umgebung wird empfohlen)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
Port 53 erfordert erhöhte Rechte:
sudo python s3dns.py
Wenn sudo ein fehlendes Modul meldet, versuche: sudo venv/bin/python s3dns.py
docker build -t ozimmermann/s3dns:latest .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
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:
./bucket_findings/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
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.
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.
Führe python s3dns.py -h aus, um die vollständige Liste zu sehen:
Beispiel:
sudo python s3dns.py -l 0.0.0.0 -u 1.1.1.1 --rate-limit 200 --no-azure-ip-ranges
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
Füge YAML-Dateien zum Verzeichnis patterns/ hinzu. Dateien mit dem Präfix regex_ werden als Regex-Muster behandelt; alle anderen als Teilzeichenfolgen-Suche.
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

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.
MIT-Lizenz – Frei verwendbar, verbesserbar und teilbar.
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.
| 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) |
| 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) |