
خدمة بسيطة لإعادة ربط DNS
خدمة إعادة ربط DNS بسيطة
rbndr هو خادم أسماء بسيط جدًا وغير مطابق للمواصفات، لاختبار البرامج ضد ثغرات إعادة ربط DNS. يستجيب الخادم للاستعلامات عن طريق اختيار عشوائي لأحد العناوين المحددة في اسم المضيف وإعادتها كإجابة مع عمر افتراضي (TTL) منخفض جدًا.
https://en.wikipedia.org/wiki/DNS_rebinding
إعادة ربط DNS هي شكل من أشكال ثغرة TOCTOU (وقت التحقق، وقت الاستخدام). ستستخدمها إذا كان لديك خدمة تستخدم فحوصات "التحقق المسبق" بشكل غير صحيح لتعديل خصائص الأمان. على سبيل المثال، ضع في اعتبارك إضافة متصفح (خيالية) بها واجهة برمجة تطبيقات مثل هذه:
AllowUntrustedAccess("foobar.com");
SendArbitraryRequests("foobar.com");
و AllowUntrustedAccess() ببساطة ترسل طلب HTTP للتحقق المسبق إلى المضيف:
GET /CanIDisableSecurity HTTP/1.1
إذا أعادت الخدمة 200، فإن الإضافة تسمح لصفحة المضيف بالوصول الكامل إلى اسم المضيف هذا. قد تكون هذه ثغرة أمنية، لأنه يمكنك تحديد اسم مضيف rbndr سيتحول بين مضيف تتحكم فيه ومضيف لا تتحكم فيه. قد تسمح الإضافة بالوصول الكامل إلى عنوان IP عشوائي (مثل خدمة داخلية، أو localhost) حتى لو كانت تلك الخدمة لا تسمح عادةً بالفحص المسبق.
قد يبدو هذا غير واقعي، ولكن هذه هي بالضبط طريقة عمل Adobe Flash وOracle Java والكثير من المنتجات الأخرى في الماضي، ولا تزال العديد من المنتجات الأخرى تعمل بهذه الطريقة.
اقرأ حول كيفية محاولة Adobe حل هذه المشكلة في Flash هنا، https://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html
بالنسبة للبرامج الضعيفة لهذا النوع من الهجمات، فإن rbndr هي طريقة سهلة للاختبار دون الحاجة إلى تعديل /etc/hosts أو إعداد خادم أسماء خاص بك. إذا قام البرنامج بربط النتيجة باسم فقط وليس باسم المضيف وعنوان IP، فيمكنك منح نفسك حق الوصول إلى أي عنوان IP.
تنسيق أسماء المضيفين هو ببساطة
<ipv4 في الأساس 16>.<ipv4 في الأساس 16>.rbndr.us
لكن يمكنك استخدام هذا الموقع للتحويل من النقاط الرباعية إذا كنت تفضل:
على سبيل المثال، للتبديل بين 127.0.0.1 و 192.168.0.1 يمكنك ترميزهما ككلمات مزدوجة (dwords)، ثم استخدام:
7f000001.c0a80001.rbndr.us
دعنا نختبرها:
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 192.168.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 192.168.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 192.168.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 127.0.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 127.0.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 192.168.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 127.0.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 127.0.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 192.168.0.1
كما ترى، يقوم الخادم بإرجاع أحد العناوين بشكل عشوائي. يمكنك فعل شيء مثل هذا (في شبه كود):
// استمر في استدعاء api حتى يتم حله إلى العنوان الذي تتحكم فيه وتحصل على حق الوصول
while (AllowUntrustedAccesss("7f000001.c0a80001.rbndr.us") != true)
;
// تم منح الوصول، الآن انتظر حتى يعيد الربط
while (ConnectToPort("7f000001.c0a80001.rbndr.us", 123) != true)
;
// الآن لديك حق الوصول إلى localhost:123 حتى لو لم يوافق localhost على تخفيض الأمان.
SomethingEvil();