العودة إلى التحديثات
New releaseJul 21, 2026

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_.
  • إضافة العديد من مزودي الخدمات السحابية الآخرين
    • 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. لكل طلب يقوم بـ:

  1. استخراج النطاق المطلوب
  2. التحقق من ذاكرة التخزين المؤقت للاستجابات — إذا وجدت إجابة مخزنة صالحة، يتم إرجاعها فورًا
  3. إعادة توجيه الطلب إلى محلل DNS حقيقي (مثل 1.1.1.1) — عبر UDP للعملاء UDP، وعبر TCP للعملاء TCP
  4. إرجاع استجابة 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, --debugDEBUGتمكين مخرجات التصحيح المفصلة
-l, --listen IPLOCAL_DNS_SERVER_IPالواجهة المحلية للاستماع عليها
-u, --upstream IPREAL_DNS_SERVER_IPمحلل DNS العلوي لإعادة التوجيه إليه
-b, --bucket-file PATHBUCKET_FILEالمسار لكتابة نطاقات الحاويات المكتشفة
--aws-ip-ranges / --no-aws-ip-rangesAWS_IP_RANGESتبديل فحوصات نطاق IP لـ AWS S3
--azure-ip-ranges / --no-azure-ip-rangesAZURE_IP_RANGESتبديل فحوصات نطاق IP لـ Azure Storage
--rate-limit NRATE_LIMITالحد الأقصى لطلبات DNS/ثانية لكل IP عميل (0 = معطل)
--cache-size NCACHE_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

متغيرات البيئة

المتغيرالافتراضيالوصف
DEBUGfalseتمكين مخرجات التصحيح المفصلة
AWS_IP_RANGEStrueتمكين فحوصات نطاق IP لـ AWS S3
AZURE_IP_RANGEStrueتمكين فحوصات نطاق IP لـ Azure Storage
REAL_DNS_SERVER_IP1.1.1.1محلل DNS العلوي لإعادة توجيه الاستعلامات إليه
LOCAL_DNS_SERVER_IP0.0.0.0الواجهة المحلية للاستماع عليها
BUCKET_FILEbuckets.txtالمسار لكتابة نطاقات الحاويات المكتشفة
RATE_LIMIT100الحد الأقصى لطلبات DNS في الثانية لكل IP عميل (0 = معطل)
CACHE_SIZE1000الحد الأقصى لاستجابات 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

نموذج الإخراج

نموذج الإخراج Docker


المساهمة

المساهمات مرحب بها — أنماط جديدة لمزودي الخدمات السحابية، وإصلاحات الأخطاء، والتحسينات. راجع CONTRIBUTING.md للإرشادات.

ملفات الأنماط موجودة في patterns/. إضافة دعم لمزود جديد بسيطة مثل إضافة إدخال YAML — لا حاجة لـ Python.


📄 الترخيص

ترخيص MIT — مجاني للاستخدام والتحسين والمشاركة.


⚠️ إخلاء المسؤولية

استخدم بمسؤولية. قم بفحص النطاقات التي تملكها فقط أو لديك إذن صريح لتحليلها.

قد يكون الوصول غير المصرح به أو الاستجواب غير قانوني.

الفئات