
خادم DNS سلبي يكتشف حاويات تخزين سحابية مكشوفة (AWS S3، GCP، Azure) عن طريق حل استعلامات DNS، وتتبع سلاسل CNAME، والإبلاغ عن عمليات استيلاء محتملة على النطاقات الفرعية أثناء عملية الاستطلاع.
s3dns هو خادم DNS خفيف الوزن يساعد في اكتشاف حاويات التخزين السحابية (AWS S3 و Google Cloud Storage و Azure Blob) عن طريق تحليل طلبات DNS، وتتبع سجلات CNAME، ومطابقة أنماط عناوين الحاويات المعروفة.
إنها أداة مفيدة لـ مختبرين الاختراق، صيادي الثغرات، و محللي أمن السحابة الذين يرغبون في التقاط حاويات سحابية مكشوفة أثناء تحليل حركة 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
- حاوية 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
نظرًا لأن Microsoft لا تسمي نطاقات Azure Blob Storage IP بشكل صريح، يستخدم S3DNS جميع عناوين Azure Storage IP المتاحة علنًا. قد يؤدي هذا إلى نتائج إيجابية خاطئة. ضع في اعتبارك تعطيل هذا الفحص إذا واجهت مشكلات:
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 = معطل) |