
सरल DNS Rebinding सेवा
सरल DNS रीबाइंडिंग सेवा
rbndr एक बहुत ही सरल, गैर-अनुरूपण वाला नेम सर्वर है जो DNS रीबाइंडिंग कमजोरियों के विरुद्ध सॉफ्टवेयर का परीक्षण करने के लिए है। सर्वर क्वेरी का जवाब देने के लिए होस्टनाम में निर्दिष्ट पतों में से यादृच्छिक रूप से एक पता चुनता है और उसे बहुत कम TTL के साथ उत्तर के रूप में लौटाता है।
https://en.wikipedia.org/wiki/DNS_rebinding
DNS रीबाइंडिंग TOCTOU (समय की जाँच, समय के उपयोग) कमजोरी का एक रूप है। आप इसका उपयोग तब करेंगे जब आपके पास कोई ऐसी सेवा हो जो सुरक्षा गुणों को संशोधित करने के लिए "preflight" जाँचों का गलत उपयोग करती है। उदाहरण के लिए, एक (काल्पनिक) ब्राउज़र प्लगइन पर विचार करें जिसमें इस प्रकार का API हो:
AllowUntrustedAccess("foobar.com");
SendArbitraryRequests("foobar.com");
और AllowUntrustedAccess() बस होस्ट को एक preflight HTTP अनुरोध भेजता है:
GET /CanIDisableSecurity HTTP/1.1
यदि सेवा 200 लौटाती है, तो प्लगइन होस्टपेज को उस होस्टनाम तक पूर्ण पहुँच प्रदान करता है। यह एक सुरक्षा भेद्यता हो सकती है, क्योंकि आप एक rbndr होस्टनाम निर्दिष्ट कर सकते हैं जो आपके नियंत्रण वाले होस्ट और जिस पर आपका नियंत्रण नहीं है, के बीच स्विच करेगा। प्लगइन एक मनमाने IP पते (जैसे, आंतरिक सेवा या localhost) तक पूर्ण पहुँच की अनुमति दे सकता है, भले ही वह सेवा सामान्य रूप से preflight जाँच की अनुमति न दे।
यह अवास्तविक लग सकता है, लेकिन ठीक इसी तरह Adobe Flash, Oracle Java और कई अन्य उत्पाद अतीत में काम करते थे, और कई अन्य उत्पाद अभी भी इसी तरह काम करते हैं।
यहाँ पढ़ें कि कैसे Adobe ने Flash में इस समस्या को हल करने का प्रयास किया, https://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html
इस प्रकार के हमले के प्रति संवेदनशील सॉफ्टवेयर के लिए, rbndr /etc/hosts को संशोधित किए बिना या स्वयं का नेमसर्वर स्थापित किए बिना परीक्षण करने का एक आसान तरीका है। यदि सॉफ्टवेयर परिणाम को केवल से जोड़ता है, न कि होस्टनाम और IP पते से, तो आप स्वयं को किसी भी IP पते तक पहुँच प्रदान कर सकते हैं।
होस्टनाम का प्रारूप बस इस प्रकार है:
<ipv4 in base-16>.<ipv4 in base-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
जैसा कि आप देख सकते हैं, सर्वर यादृच्छिक रूप से पतों में से एक लौटाता है। आप कुछ इस प्रकार कर सकते हैं (सूडो-कोड में):
// Keep calling api until it resolves to the address you control and you get granted access
while (AllowUntrustedAccesss("7f000001.c0a80001.rbndr.us") != true)
;
// Access granted, now wait for it to re-bind
while (ConnectToPort("7f000001.c0a80001.rbndr.us", 123) != true)
;
// Now you have access to localhost:123 even though localhost did not opt-in to reduced security.
SomethingEvil();