
Пассивный DNS-сервер, который обнаруживает открытые облачные хранилища (AWS S3, GCP, Azure) путем разрешения DNS-запросов, трассировки цепочек CNAME и выявления потенциальных захватов поддоменов во время разведки.
s3dns — это легковесный DNS-сервер, который помогает обнаруживать облачные бакеты для хранения данных (AWS S3, Google Cloud Storage и Azure Blob) путем обработки DNS-запросов, отслеживания CNAME-записей и сопоставления с известными шаблонами URL-адресов бакетов.
Это удобный инструмент для пентестеров, охотников за багами и аналитиков облачной безопасности, которые хотят выявлять открытые облачные бакеты при анализе DNS-трафика.
Если S3DNS экономит ваше время во время разведки, поставьте ему ⭐️ — это поможет другим найти проект.
CACHE_SIZE (по умолчанию: 1000 записей; установите 0 для отключения).RATE_LIMIT (по умолчанию: 100 запросов/с; установите 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 bucket
- GCP bucket
- Azure Blob container
- Любой из 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
Поскольку Microsoft не называет явно свои IP-диапазоны Azure Blob Storage, S3DNS использует все публично предоставляемые IP-адреса Azure Storage. Это может привести к ложным срабатываниям. Рекомендуется отключить эту проверку при возникновении проблем:
AZURE_IP_RANGES=false
Добавьте YAML-файлы в директорию patterns/. Файлы с префиксом regex_ обрабатываются как 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 | Включение/отключение проверки IP-диапазонов AWS S3 |
--azure-ip-ranges / --no-azure-ip-ranges | AZURE_IP_RANGES | Включение/отключение проверки IP-диапазонов Azure Storage |
--rate-limit N | RATE_LIMIT | Макс. количество DNS-запросов/сек на IP клиента (0 = отключено) |
--cache-size N | CACHE_SIZE | Макс. количество кэшированных DNS-ответов (0 = отключено) |
--max-cname-depth N | – | Макс. глубина отслеживания цепочки CNAME (по умолчанию: 10) |
| Переменная | По умолчанию | Описание |
|---|
DEBUG | false | Включить подробный отладочный вывод |
AWS_IP_RANGES | true | Включить проверку IP-диапазонов AWS S3 |
AZURE_IP_RANGES | true | Включить проверку IP-диапазонов Azure Storage |
REAL_DNS_SERVER_IP | 1.1.1.1 | Вышестоящий DNS-резолвер для пересылки запросов |
LOCAL_DNS_SERVER_IP | 0.0.0.0 | Локальный интерфейс для прослушивания |
BUCKET_FILE | buckets.txt | Путь для записи обнаруженных доменов бакетов |
RATE_LIMIT | 100 | Макс. количество DNS-запросов/сек на IP клиента (0 = отключено) |
CACHE_SIZE | 1000 | Макс. количество кэшированных DNS-ответов (0 = отключено) |