s3dns 是一个轻量级DNS服务器,通过解析DNS请求、追踪CNAME并匹配已知的存储桶URL模式,帮助发现云存储桶(AWS S3、Google Cloud Storage和Azure Blob)。
它是渗透测试人员、漏洞赏金猎人和云安全分析师的便捷工具,用于在DNS流量分析中捕获暴露的云存储桶。
如果S3DNS在侦察过程中为您节省了时间,请考虑给它一个⭐️——这有助于其他人找到该项目。
CACHE_SIZE 配置(默认:1000 条,设为 0 禁用)。RATE_LIMIT 配置(默认:100 req/s,设为 0 禁用)。NXDOMAIN 时,S3DNS将其标记为可能的域名劫持。这表示存在一个指向未声明存储桶的悬空DNS记录,攻击者可注册该存储桶。max_cname_depth 参数配置。AZURE_IP_RANGES=false 或 AWS_IP_RANGES=false(默认为true)。regex_patterns 和硬编码模式移到 patterns 文件夹中作为YAML文件。您可以添加自己的模式。
regex_ 开头。53(UDP 和 TCP)S3DNS在**端口53(UDP和TCP)**监听DNS查询。对于每个请求,它:
1.1.1.1)——对UDP客户端使用UDP,对TCP客户端使用TCP同时,它:
s3dns.log⚡ 在侦察期间将其用作您的DNS,它将被动地发现您的工具或浏览器解析的每个域名的云存储桶和劫持候选。
您只需要以下之一:
仅当您想使用Python本地运行时需要
git clone https://github.com/olizimmermann/s3dns.git
cd s3dns
(建议使用虚拟环境)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
端口53需要提升权限:
sudo python s3dns.py
如果 sudo 提示找不到模块,请尝试:sudo venv/bin/python s3dns.py
docker build -t ozimmermann/s3dns:latest .S3DNS最简便的入门方式。
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
发现结果保存在:
./bucket_findings/ 目录中当在与分析相同的机器上使用S3DNS时,设置 --network host 标志可能会有所帮助:
docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--network host \
--name "s3dns" \
ozimmermann/s3dns:latest
由于端口53需要提升权限,某些用户(例如Mac用户)可能需要 sudo:
sudo docker run --rm -p 53:53/udp -p 53:53/tcp \
-v "./bucket_findings/:/app/buckets/" \
--name "s3dns" \
ozimmermann/s3dns:latest
将您的系统或工具的 DNS解析器 设置为您的S3DNS实例。
在浏览或模糊测试目标时,S3DNS会分析每个域名,并告诉您它是否解析到:
- 一个 AWS S3存储桶
- 一个 GCP存储桶
- 一个 Azure Blob容器
- 其他13个受支持的云存储提供商中的任何一个
它会追踪CNAME,因此如果某个域名指向
cdn.example.com,而该域名又指向一个云存储桶,它也会捕获到。它还会标记潜在的子域名劫持——如果某个域名匹配云存储模式但目标不存在(NXDOMAIN),则会高亮显示悬空记录作为可能的劫持候选。
在分析网站时被动使用它,无需主动探测即可发现暴露的存储桶和劫持机会。
您可以通过命令行标志、环境变量或修改 s3dns.py 来调整行为。
每个选项的优先级为:命令行标志 > 环境变量 > 交互提示/默认值。不带标志运行时的行为与之前完全相同。
运行 python s3dns.py -h 查看完整列表:
示例:
sudo python s3dns.py -l 0.0.0.0 -u 1.1.1.1 --rate-limit 200 --no-azure-ip-ranges
由于微软并未明确命名其Azure Blob存储IP范围,S3DNS使用所有公开提供的Azure存储IP地址。这可能导致误报。如果遇到问题,请考虑禁用此检查:
AZURE_IP_RANGES=false
将YAML文件添加到 patterns/ 目录。以 regex_ 前缀的文件被视为正则表达式模式;其他所有文件被视为子串匹配。
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
在Docker中设置多个环境变量:
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

欢迎贡献——新的云提供商模式、错误修复和改进。请参阅 CONTRIBUTING.md 了解指南。
模式文件位于 patterns/ 目录。添加新提供商的支持只需添加一个YAML条目即可——无需Python。
MIT许可证——可自由使用、改进和分享。
请负责任地使用。仅扫描您拥有或已获得明确许可分析的域名。
未经授权的访问或探测可能违法。
| 标志 | 等效环境变量 | 描述 |
|---|
-h, --help | – | 显示帮助并退出 |
--version | – | 显示版本并退出 |
-d, --debug | DEBUG | 启用详细的调试输出 |
-l, --listen IP | LOCAL_DNS_SERVER_IP | 监听的本地接口 |
-u, --upstream IP | REAL_DNS_SERVER_IP | 转发的上游DNS解析器 |
-b, --bucket-file PATH | BUCKET_FILE | 写入发现的存储桶域名的路径 |
--aws-ip-ranges / --no-aws-ip-ranges | AWS_IP_RANGES | 切换AWS S3 IP范围检查 |
--azure-ip-ranges / --no-azure-ip-ranges | AZURE_IP_RANGES | 切换Azure存储IP范围检查 |
--rate-limit N | RATE_LIMIT | 每个客户端IP的最大DNS请求数/秒(0 = 禁用) |
--cache-size N | CACHE_SIZE | 最大缓存DNS响应数(0 = 禁用) |
--max-cname-depth N | – | 追踪的最大CNAME链深度(默认:10) |
| 变量 | 默认值 | 描述 |
|---|
DEBUG | false | 启用详细的调试输出 |
AWS_IP_RANGES | true | 启用AWS S3 IP范围检查 |
AZURE_IP_RANGES | true | 启用Azure存储IP范围检查 |
REAL_DNS_SERVER_IP | 1.1.1.1 | 转发查询的上游DNS解析器 |
LOCAL_DNS_SERVER_IP | 0.0.0.0 | 监听的本地接口 |
BUCKET_FILE | buckets.txt | 写入发现的存储桶域名的路径 |
RATE_LIMIT | 100 | 每个客户端IP每秒最大DNS请求数(0 = 禁用) |
CACHE_SIZE | 1000 | 最大缓存DNS响应数(0 = 禁用) |