Zurück zu den Updates
New releaseAug 3, 2026

s3dns v0.2.24

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.

Teilen

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: 1000 Einträge, auf 0 setzen zum Deaktivieren).
  • Ratenbegrenzung — Pro-Client-IP-Anforderungsratenbegrenzung, um Missbrauch zu verhindern. Konfigurierbar über RATE_LIMIT (Standard: 100 Anfragen/s, auf 0 setzen zum Deaktivieren).
  • Erkennung von Subdomain-Übernahmen — Wenn eine Domain zu einem Cloud-Speicher-Muster passt, aber 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.
  • 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=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-Muster müssen mit regex_ beginnen.
  • 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:

  1. Extrahiert die angefragte Domain
  2. Prüft den Antwort-Cache — wenn eine gültige zwischengespeicherte Antwort existiert, wird sie sofort zurückgegeben
  3. 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
  4. 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.com zeigt 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:

FlagEntsprechende UmgebungsvariableBeschreibung
-h, --helpHilfe anzeigen und beenden
--versionVersion anzeigen und beenden
-d, --debugDEBUGAusführliche Debug-Ausgabe aktivieren
-l, --listen IPLOCAL_DNS_SERVER_IPLokale Schnittstelle zum Lauschen
-u, --upstream IPREAL_DNS_SERVER_IPUpstream-DNS-Resolver zum Weiterleiten
-b, --bucket-file PFADBUCKET_FILEPfad zum Schreiben entdeckter Bucket-Domains
--aws-ip-ranges / --no-aws-ip-rangesAWS_IP_RANGESAWS S3-IP-Bereichsprüfungen ein-/ausschalten
--azure-ip-ranges / --no-azure-ip-rangesAZURE_IP_RANGESAzure Storage-IP-Bereichsprüfungen ein-/ausschalten
--rate-limit NRATE_LIMITMax. DNS-Anfragen/s pro Client-IP (0 = deaktiviert)
--cache-size NCACHE_SIZEMax. zwischengespeicherte DNS-Antworten (0 = deaktiviert)
--max-cname-depth NMaximale 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

VariableStandardBeschreibung
DEBUGfalseAusführliche Debug-Ausgabe aktivieren
AWS_IP_RANGEStrueAWS S3-IP-Bereichsprüfungen aktivieren
AZURE_IP_RANGEStrueAzure Storage-IP-Bereichsprüfungen aktivieren
REAL_DNS_SERVER_IP1.1.1.1Upstream-DNS-Resolver für die Weiterleitung von Anfragen
LOCAL_DNS_SERVER_IP0.0.0.0Lokale Schnittstelle zum Lauschen
BUCKET_FILEbuckets.txtPfad zum Schreiben entdeckter Bucket-Domains
RATE_LIMIT100Max. DNS-Anfragen pro Sekunde pro Client-IP (0 = deaktiviert)
CACHE_SIZE1000Max. 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

Beispielausgabe Docker


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.

Kategorien