
s3dns v0.2.22
خادم DNS سلبي يكتشف حاويات تخزين سحابية مكشوفة (AWS S3، GCP، Azure) عن طريق حل استعلامات DNS، وتتبع سلاسل CNAME، والإبلاغ عن عمليات استيلاء محتملة على النطاقات الفرعية أثناء عملية الاستطلاع.
S3DNS
s3dns هو خادم DNS خفيف الوزن يساعد في اكتشاف حاويات التخزين السحابية (AWS S3 و Google Cloud Storage و Azure Blob) عن طريق تحليل طلبات DNS، وتتبع سجلات CNAME، ومطابقة أنماط عناوين الحاويات المعروفة.
إنها أداة مفيدة لـ مختبرين الاختراق، صيادي الثغرات، و محللي أمن السحابة الذين يرغبون في التقاط حاويات سحابية مكشوفة أثناء تحليل حركة DNS.
إذا وفر لك S3DNS وقتًا في جلسة استطلاع، فكر في منحه ⭐️ — فهذا يساعد الآخرين على العثور على المشروع.
🆕 تحديث 2026/03/06
- دعم TCP/53 — يستمع S3DNS الآن على كل من المنفذين UDP و TCP 53. يتم التعامل بشكل صحيح مع العملاء الذين يعيدون المحاولة عبر TCP بعد استجابة UDP مبتورة، حيث يتم إعادة توجيه الاستعلام عبر TCP إلى المحلل العلوي لاسترداد الإجابة الكاملة.
- مخزن DNS أكبر — زيادة مخزن استقبال UDP من 512 إلى 4096 بايت. يتم تمرير خيارات EDNS0 من العميل إلى المحلل العلوي دون تغيير.
- ذاكرة تخزين مؤقت للاستجابات — ذاكرة تخزين مؤقت LRU تعتمد على TTL لاستجابات DNS مشتركة عبر مسارات UDP و TCP. يقلل الحمل على المحلل العلوي ويقلل زمن الانتقال أثناء جلسات الاستطلاع النشطة. قابل للتكوين عبر
CACHE_SIZE(الافتراضي:1000إدخال، اضبط على0لتعطيل). - تحديد معدل الطلبات — حد لمعدل طلبات DNS لكل عنوان IP للعميل لمنع إساءة الاستخدام. قابل للتكوين عبر
RATE_LIMIT(الافتراضي:100طلب/ثانية، اضبط على0لتعطيل). - اكتشاف استيلاء النطاق الفرعي — عندما يتطابق نطاق مع نمط تخزين سحابي ولكنه يعيد
NXDOMAIN، يقوم S3DNS بوضع علامة عليه كـ استيلاء محتمل على النطاق. يشير هذا إلى سجل DNS معلق يشير إلى حاوية غير مسجلة يمكن للمهاجم تسجيلها. - فحوصات نطاق IPv6 — يتم الآن أيضًا تحليل سجلات AAAA والتحقق منها مقابل نطاقات IP للتخزين السحابي المعروفة. يتم تحميل بادئات AWS S3 IPv6 جنبًا إلى جنب مع نطاقات IPv4.
- حد عمق CNAME — تم الآن وضع حد أقصى لتتبع سلسلة CNAME المتكررة (الافتراضي: 10 قفزات) لمنع الحلقات اللانهائية على السجلات المصطنعة أو الدائرية. قابل للتكوين عبر المعلمة
max_cname_depth.
تحديث 2025/08/19
- إضافة نطاقات AWS IP دون اتصال كملف JSON.
- إضافة نطاقات Azure Storage IP دون اتصال كملف JSON.
- إضافة خيار تعطيل فحص نطاق IP لأي من الخدمات باستخدام:
AZURE_IP_RANGES=falseأوAWS_IP_RANGES=false(الافتراضي هو true).
- نقل
regex_patternsوالأنماط المضمنة إلى مجلدpatternsكملفات YAML. يمكنك إضافة أنماطك الخاصة.- يجب أن تبدأ الأنماط regex بـ
regex_.
- يجب أن تبدأ الأنماط regex بـ
- إضافة العديد من مزودي الخدمات السحابية الآخرين
- IBM Cloud Object Storage
- Oracle Object Storage
- Alibaba OSS
- Backblaze B2
- Linode Object Storage
- Scaleway Object Storage
- Vultr Object Storage
- Cloudflare R2
تحديث 2025/06/21
- إضافة دعم AWS GovCloud.
تحديث 2025/04/16
- تحديث أنماط regex.
- تحديث المخرجات لتحسين الرؤية (عرض النطاق الأصلي لسجلات CNAME، وعنوان IP الخاص بالعميل، ومؤشرات نطاق IP).
- التنزيل التلقائي لنطاقات IP من AWS — الآن يتم التحقق منها أيضًا!
- خيار إضافة نطاقات IP الخاصة بك (ضبط الأنماط أو نطاقات IP يدويًا في الفصل).
تحديث 2025/04/14
- إضافة دعم regex لـ Google Cloud Storage و Azure Blob Storage.
🚀 الميزات
- يعمل كخادم DNS على المنفذ
53(UDP و TCP) - يكتشف حاويات التخزين السحابية المحتملة في طلبات DNS:
- AWS S3 (أسلوب الاستضافة الافتراضية والمسار، بما في ذلك GovCloud)
- حاويات GCP
- حاويات Azure Blob
- DigitalOcean Spaces، Wasabi، IBM COS، Oracle Object Storage، Alibaba OSS، Backblaze B2، Linode، Scaleway، Vultr، Cloudflare R2
- يتتبع سلاسل CNAME بشكل متكرر (حد عمق قابل للتكوين) لالتقاط روابط الحاويات السحابية المخفية
- يضع علامة على استيلاءات النطاق الفرعي المحتملة — أنماط التخزين السحابي التي تعيد NXDOMAIN
- يتحقق من عناوين IP التي تم حلها (كل من A و AAAA) مقابل نطاقات AWS S3 و Azure Storage IP المعروفة
- ذاكرة تخزين مؤقت للاستجابات تعتمد على TTL لتقليل زمن الانتقال والحمل على المحلل العلوي أثناء الاستطلاع
- تحديد معدل الطلبات لكل IP لمنع إساءة الاستخدام
- يسجل جميع النتائج في وحدة التحكم وملف
- صديق للحاويات
⚙️ كيف يعمل
يستمع S3DNS على المنفذ 53 (UDP و TCP) لاستعلامات DNS. لكل طلب يقوم بـ:
- استخراج النطاق المطلوب
- التحقق من ذاكرة التخزين المؤقت للاستجابات — إذا وجدت إجابة مخزنة صالحة، يتم إرجاعها فورًا
- إعادة توجيه الطلب إلى محلل DNS حقيقي (مثل
1.1.1.1) — عبر UDP للعملاء UDP، وعبر TCP للعملاء TCP - إرجاع استجابة DNS الصالحة للعميل
بالتوازي، يقوم بـ:
- التحقق من أنماط حاويات التخزين السحابي (مطابقة regex واسم المضيف المضمن)
- التحقق من عناوين IP التي تم حلها مقابل نطاقات AWS S3 و Azure Storage المعروفة (IPv4 و IPv6)
- تتبع سلاسل CNAME بشكل متكرر حتى العمق المكوّن
- وضع علامة على إصابات NXDOMAIN في الأنماط المتطابقة كمرشحين محتملين لاستيلاء النطاق الفرعي
- تسجيل جميع النتائج في وحدة التحكم و
s3dns.log
⚡ استخدم هذا كـ DNS الخاص بك أثناء الاستطلاع، وسيكشف بشكل سلبي عن الحاويات السحابية ومرشحي الاستيلاء لكل نطاق تحله أدواتك أو متصفحك.
🧱 المتطلبات الأساسية
ستحتاج فقط إلى أحد ما يلي:
- Python 3.11+
- Docker (اختياري، لكن موصى به)
🔧 التثبيت
مطلوب فقط إذا كنت تريد تشغيله محليًا باستخدام Python
استنساخ المستودع
git clone https://github.com/olizimmermann/s3dns.git
cd s3dns
تثبيت التبعيات
(يوصى باستخدام بيئة افتراضية)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
🧪 الاستخدام
التشغيل باستخدام Python
يتطلب المنفذ 53 صلاحيات مرتفعة:
sudo python s3dns.py
إذا ادعى sudo وجود وحدة مفقودة، جرب: sudo venv/bin/python s3dns.py
- إذا قمت ببناء الصورة بنفسك، تأكد من وضع علامة عليها بنفس إصدار Docker Hub للاتساق:
docker build -t ozimmermann/s3dns:latest .
استخدام Docker
أسهل طريقة للبدء مع 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
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
🌐 استخدام S3DNS في الاستطلاع
قم بتعيين محلل DNS الخاص بنظامك أو أداتك إلى مثيل S3DNS الخاص بك.
أثناء التصفح أو الفحص العشوائي لهدفك، يقوم S3DNS بتحليل كل نطاق ويخبرك إذا كان يحل إلى:
- حاوية AWS S3
- حاوية GCP
- حاوية Azure Blob
- أي من 13 مزود تخزين سحابي آخر مدعوم
يقوم بتتبع سجلات CNAME، لذلك إذا كان نطاق يشير إلى
cdn.example.com، والذي بدوره يشير إلى حاوية سحابية، فسيلتقط ذلك أيضًا.كما أنه يضع علامة على استيلاءات النطاق الفرعي المحتملة — إذا كان نطاق يطابق نمط تخزين سحابي ولكن الهدف غير موجود (NXDOMAIN)، يتم تمييز السجل المعلق كمرشح محتمل للاستيلاء.
استخدمه بشكل سلبي أثناء تحليل موقع لاكتشاف الحاويات المكشوفة وفرص الاستيلاء دون استجواب نشط.
⚙️ التكوين
يمكنك تعديل السلوك عبر أعلام سطر الأوامر، أو متغيرات البيئة، أو عن طريق تعديل s3dns.py.
الأولوية لكل خيار هي: علم سطر الأوامر > متغير البيئة > المطالبة التفاعلية / الافتراضي. التشغيل بدون أعلام يعمل تمامًا كما كان من قبل.
أعلام سطر الأوامر
قم بتشغيل python s3dns.py -h للحصول على القائمة الكاملة:
| العلم | متغير البيئة المكافئ | الوصف |
|---|---|---|
-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) |
مثال:
sudo python s3dns.py -l 0.0.0.0 -u 1.1.1.1 --rate-limit 200 --no-azure-ip-ranges
متغيرات البيئة
| المتغير | الافتراضي | الوصف |
|---|---|---|
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 = معطل) |
⚠️ ملاحظة حول نطاقات Azure IP
نظرًا لأن 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 — مجاني للاستخدام والتحسين والمشاركة.
⚠️ إخلاء المسؤولية
استخدم بمسؤولية. قم بفحص النطاقات التي تملكها فقط أو لديك إذن صريح لتحليلها.
قد يكون الوصول غير المصرح به أو الاستجواب غير قانوني.