
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: `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 ```bash git clone https://github.com/olizimmermann/s3dns.git cd s3dns ``` ### Abhängigkeiten installieren (Die Verwendung einer virtuellen Umgebung wird empfohlen) ```bash python3 -m venv venv source venv/bin/activate pip install -r requirements.txt ``` --- ## 🧪 Verwendung ### Mit Python ausführen Port 53 erfordert erhöhte Rechte: ```bash 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.* ```bash 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 ```bash docker build -t ozimmermann/s3dns:latest . ``` ```bash 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: ```bash 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`: ```bash 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: | 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: ```bash 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: ```bash 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:** ```bash sudo su export DEBUG=true python s3dns.py ``` **Docker:** ```bash 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: ```bash 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](https://github.com/olizimmermann/s3dns/blob/main/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.