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:
- 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.