tko-subs
تتيح هذه الأداة:
-
التحقق مما إذا كان يمكن الاستيلاء على نطاق فرعي بسبب:
- سجل CNAME معلق يشير إلى مزود CMS (Heroku، Github، Shopify، Amazon S3، Amazon CloudFront، إلخ) يمكن الاستيلاء عليه.
- سجل CNAME معلق يشير إلى اسم نطاق غير موجود.
- سجل NS واحد أو أكثر خاطئ/مكتوب بشكل خاطئ يشير إلى خادم أسماء يمكن للمهاجم الاستيلاء عليه للتحكم في سجلات DNS للنطاق الفرعي.
-
الاستيلاء فعليًا على تلك النطاقات الفرعية عن طريق توفير علم -takeover. حاليًا، الاستيلاء مدعوم فقط لـ Github Pages و Heroku Apps، ووظيفة الاستيلاء معطلة بشكل افتراضي.
-
تحديد مزودي CMS الخاصين بك والتحقق منهم عبر ملف providers-data.csv. في ذلك الملف، ستذكر اسم CMS، قيمة CNAME الخاصة به، السلسلة النصية التي تريد البحث عنها، وما إذا كان يعمل فقط عبر HTTP أم لا. اطلع عليه لبعض الأمثلة.
إخلاء مسؤولية: لا تكن وغدًا!
لا داعي للذكر، يرجى استخدام هذه الأداة بحذر شديد جدًا. لن يتحمل المؤلفون أي مسؤولية عن أي عواقب.
بشكل افتراضي، لا تسمح هذه الأداة بالاستيلاء على النطاقات الفرعية. إذا كنت ترغب في القيام بذلك، فحدد فقط علم -takeover.
المتطلبات الأساسية
نحتاج إلى تثبيت Go. بمجرد حصولك على Go، اكتب go get github.com/anshumanbh/tko-subs لتنزيل الأداة.
بمجرد تنزيل الأداة، اكتب tko-subs -h.
الشيء التالي الذي نحتاج إلى فعله هو الحصول على المعلومات التالية:
- رمز الوصول الشخصي لـ Github - تأكد من أن هذا الرمز لديه صلاحيات لإنشاء المستودعات، المراجع، المحتويات، إلخ. يمكنك إنشاء هذا الرمز هنا - https://github.com/settings/tokens
- اسم مستخدم Heroku ومفتاح API
- اسم تطبيق Heroku - يمكنك إنشاء تطبيق ثابت على Heroku بأي شيء تريد عرضه على صفحته الرئيسية باتباع التعليمات هنا - https://gist.github.com/wh1tney/2ad13aa5fbdd83f6a489. بمجرد إنشاء هذا التطبيق، استخدم اسم ذلك التطبيق في العلم (انظر أدناه). سنستخدم هذا التطبيق للاستيلاء على النطاق (مع CNAME المعلق لتطبيق Heroku آخر).
ملاحظة - تحتاج هذه القيم فقط إذا كنت ترغب في الاستيلاء على النطاقات الفرعية. بشكل افتراضي، هذا غير مطلوب.
حزم Go المطلوبة للبناء.
go get github.com/bgentry/heroku-go
go get github.com/gocarina/gocsv
go get github.com/google/go-github/github
go get github.com/olekukonko/tablewriter
go get golang.org/x/net/publicsuffix
go get golang.org/x/oauth2
go get github.com/miekg/dns
كيفية التشغيل؟
بمجرد تثبيت كل شيء، انتقل إلى الدليل واكتب:
tko-subs -domains=domains.txt -data=providers-data.csv -output=output.csv
إذا كنت ترغب أيضًا في الاستيلاء، فسيكون الأمر:
tko-subs -domains=domains.txt -data=providers-data.csv -output=output.csv -takeover -githubtoken=<github-token> -herokuusername=<heroku-username> -herokuapikey=<heroku-api-key> -herokuappname=<heroku-app-name>
إذا كنت تريد فقط التحقق من نطاق واحد، اكتب:
tko-subs -domain <domain-name>
إذا كنت تريد فقط التحقق من نطاقات متعددة، اكتب:
tko-subs -domain <domain-name-1>,<domain-name-2>
بشكل افتراضي:
- علم
domains مضبوط على domains.txt
- علم
data مضبوط على providers-data.csv
- علم
output مضبوط على output.csv
- علم
takeover غير مضبوط، لذا لا يوجد استيلاء افتراضيًا
- علم
domain غير مضبوط، لذا سيتحقق دائمًا من جميع النطاقات المذكورة في ملف domains.txt. إذا تم ذكر علم domain، فسيتحقق فقط من ذلك النطاق ويتجاهل ملف domains.txt، حتى لو كان موجودًا
- علم
threads مضبوط على 5
لذا، تشغيل tko-subs ببساطة سيعمل بالقيم الافتراضية المذكورة أعلاه.
كيف يتم تنسيق ملف providers-data.csv؟
name,cname,string,http
- name: اسم المزود (مثل github)
- cname: CNAME المستخدم لربط موقع ويب بمحتوى المزود (مثل github.io)
- string: رسالة الخطأ التي يتم إرجاعها لنطاق فرعي غير مُطالب به (مثل "There isn't a GitHub Pages site here")
- http: ما إذا كان سيتم استخدام http (وليس https، وهو الافتراضي) للاتصال بالموقع (true/false)
كيف يتم تنسيق المخرجات؟
Domain,CNAME,Provider,IsVulnerable,IsTakenOver,Response
- Domain: النطاق الذي تم التحقق منه
- CNAME: CNAME للنطاق
- Provider: المزود الذي تم العثور على النطاق يستخدمه
- IsVulnerable: ما إذا كان النطاق قد وجد ضعيفًا أم لا (true/false)
- IsTakenOver: ما إذا كان قد تم الاستيلاء على النطاق أم لا (true/false)
- Response: الرسالة التي تم التحقق من النطاق الفرعي مقابلها
إذا تم العثور على سجل DNS ميت، يُترك Provider فارغًا.
إذا تم العثور على خادم أسماء غير صحيح السلوك، يُترك Provider و CNAME فارغين.
ماذا يحدث تحت الغطاء؟
سيتكرر هذا على جميع النطاقات (بالتزامن باستخدام GoRoutines) في ملف subdomains.txt وسيقوم بما يلي:
- التحقق مما إذا كان لديهم خادم أسماء موثوق غير صحيح السلوك؛ إذا كان الأمر كذلك، نضع علامة على هذا النطاق على أنه ضعيف.
- التحقق مما إذا كان لديهم سجلات CNAME معلقة (سجلات DNS ميتة)؛ إذا كان الأمر كذلك، نضع علامة على هذا النطاق على أنه ضعيف.
- إذا اجتاز نطاق فرعي هذين الاختبارين، يحاول تنفيذ curl عليه والحصول على رد، ثم يحاول معرفة ما إذا كان هذا الرد يطابق أيًا من سلاسل مزود البيانات المذكورة في ملف providers-data.csv.
- إذا تطابق الرد، نضع علامة على هذا النطاق على أنه ضعيف.
- بعد ذلك، اعتمادًا على ما إذا كان علم
takeover مذكورًا أم لا، سيحاول الاستيلاء على ذلك النطاق الفرعي الضعيف.
- على سبيل المثال، للاستيلاء على صفحة Github، سيقوم الكود بما يلي:
- إنشاء مستودع
- إنشاء فرع
gh-pages في ذلك المستودع
- رفع
CNAME و index.html إلى فرع gh-pages في ذلك المستودع. هنا، يحتوي CNAME على النطاق الذي يجب الاستيلاء عليه. يحتوي index.html على النص "This domain is temporarily suspended" الذي سيتم عرضه بمجرد الاستيلاء على النطاق.
- وبالمثل، لتطبيقات Heroku، سيقوم الكود بما يلي:
- إضافة النطاق المعلق إلى تطبيق Heroku الخاص بك (الذي ستقدم اسمه في ملف .env)
- وهذا كل شيء!
العمل المستقبلي
أخذ اسم CMS والتعبير النمطي من المستخدم أو ملف .env ثم ربطهم تلقائيًا بالأداة لتتمكن من العثور عليه. تم
- إضافة عمليات استيلاء لـ CMS إضافية
- إضافة المزيد من مزودي CMS
الإشادات
- شكرًا لـ Luke Young (@TheBoredEng) لمساعدتي في مكتبة go-github.
- شكرًا لـ Frans Rosen (@fransrosen) لمساعدتي في فهم التفاصيل الفنية المطلوبة لبعض عمليات الاستيلاء.
- شكرًا لـ Mohammed Diaa (@mhmdiaa) لأخذه الوقت لتنفيذ وظيفة بيانات المزود وتطوير الكود.
- شكرًا لـ high-stakes لتحديث الكود الضروري.
سجل التغييرات
5/27
- تمت إضافة Dockerfile جديد يقلل حجم الصورة
- تمت إضافة ملف domains.txt نموذجي للاختبار عليه
- أضاف mhmdiaa منطق عمليات الاستيلاء على DNS الميت. تم تحديث التوثيق. شكرًا جزيلاً!
11/6
- أصدر high-stakes طلب سحب مع مجموعة جديدة من الكود الذي يصلح بعض الأخطاء ويجعل الكود أنظف
9/22
- تمت إضافة علم اختياري للتحقق من نطاق واحد
- أصبح تثبيت وتشغيل الأداة أسهل
6/25
- تم جعل الكود أسرع بكثير من خلال تنفيذ goroutines
- بدلاً من التحقق باستخدام وظيفة LookupCNAME من حزمة net الخاصة بـ Golang، تم جعلها تستخدم dig فقط لأنها تعطيك أيضًا سجلات DNS الميتة. سطح هجوم أكبر!!