
من إزالة تشويش code.js إلى الجذر، CVE-2023-0386
.env يحتوي على بيانات اعتماد قاعدة البيانات، وبسبب إعادة استخدام كلمة المرور يمكن للمهاجمين تسجيل الدخول كمستخدم admin على الجهاز. كما تبين أن نواة النظام قديمة ويمكن استخدام CVE-2023-0386 للحصول على شل بصلاحية الجذر| المنفذ | الخدمة | التفاصيل |
|---|---|---|
| 22/tcp | ssh | syn-ack ttl 63 OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0) |
| 80/tcp | http | syn-ack ttl 63 nginx 2million.htb |
أضفت 2million.htb إلى ملف /etc/hots الخاص بي
قمت باكتشاف المسارات عبر 2million.htb باستخدام gobuster
أثناء الاستكشاف، اكتشفت نقطة النهاية /invite

بعد الانتقال إلى صفحة /invite

أثناء فحص الصفحة، لاحظت أنها تحمّل ملف JavaScript باسم inviteapi.min.js يحتوي على كود مُعمّى:
eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1 i(4){h 8={"4":4};$.9({a:"7",5:"6",g:8,b:\'/d/e/n\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}1 j(){$.9({a:"7",5:"6",b:\'/d/e/k/l/m\',c:1(0){3.2(0)},f:1(0){3.2(0)}})}',24,24,'response|function|log|console|code|dataType|json|POST|formData|ajax|type|url|success|api/v1|invite|error|data|var|verifyInviteCode|makeInviteCode|how|to|generate|verify'.split('|'),0,{}))
قمت بفك تعمية الكود باستخدام de4js، وأنتج الكود التالي بلغة JavaScript يمكن قراءتها:

function verifyInviteCode(code) {
var formData = {
"code": code
};
$.ajax({
type: "POST",
dataType: "json",
data: formData,
url: '/api/v1/invite/verify',
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
}
function makeInviteCode() {
$.ajax({
type: "POST",
dataType: "json",
url: '/api/v1/invite/how/to/generate',
success: function (response) {
console.log(response)
},
error: function (response) {
console.log(response)
}
})
}
makeInviteCode() : يُنشئ رمز دعوة جديد
verefyInviteCode(code) : يتحقق مما إذا كان الرمز صالحًا
ولفهم أكثر، اعترضت طلب التحقق:

يستخدم API استجابات JSON
انتقلت إلى وحدة تحكم المتصفح ونفّذت makeInviteCode()

لاحظت أن البيانات كانت مشفرة بشيفرة ROT13

بعد فك التشفير، وجدت نقطة النهاية /api/v1/invite/generate، ثم قمت بتوليد رمز الدعوة

فك تشفير Base64

المفتاح
تم إدخال المفتاح 2F4BN-YI8OH-B0SCL-L8OE6 وتم قبوله بنجاح

التسجيل

الصفحة الرئيسية

صفحة Access
لا تعمل الكثير من صفحات هذا الموقع بشكل صحيح، وصفحة Access هي حيث تصبح الأمور مثيرة للاهتمام

استكشاف نقاط نهاية API
قمت برفع ملف VPN بالنقر على زر connection pack، واعترضت طلب GET

ثم نفّذت طلب curl بخياري verbose و silent لاستكشاف نقاط نهاية API المتاحة


استجاب الخادم بقائمة JSON من API endpoints
كان لدى المسؤول 3 نقاط نهاية API بأساليب GET و POST و PUT
عندما حاولت توليد مفتاح المسؤول من نقطة نهاية المسؤول /api/v1/admin/vpn/generate، لم يتم توليد المفتاح لأنني لم أكن المسؤول، وأكّدت نقطة نهاية المسؤول الأولى /api/v1/admin/auth ذلك


بعد اكتشاف الصيغة الصحيحة لـ طلب PUT مع Content-Type: application/json والمعاملات المطلوبة، نجحت في رفع مستخدمي إلى مسؤول









قمت بحقن ;whoami; في حقل اسم المستخدم، ووقع اشتباهي على دوال exec() أو system() في PHP، وهي شائعة في الميزات المخصصة للمسؤول وغالبًا ما تفتقر إلى التنقية المناسبة
على سبيل المثال، من المحتمل أن يكون الكود الضعيف مشابهًا لهذا:
$username = $json->username;
exec("/usr/bin/cat /var/www/html/VPN/user/$username.ovpn");
كانت نقطة النهاية POST /api/v1/admin/vpn/generate ضعيفة، وتم تنفيذ حقن أوامر نظام التشغيل بنجاح



نظرًا لأن التطبيق كان يحتوي على قيود تمنع الأحرف الخاصة، قمت بتشفير أمر حمولة الشل العكسي بـ base64 لتجاوز هذا القيد

قمت بحقن الحمولة في معامل username، وتوجيهها إلى base64 -d | bash لفك التشفير والتنفيذ:


تم تنفيذ الحمولة بنجاح، وأعادت شلًا عكسيًا كـ www-data user

حاولت القيام بـ حركة جانبية من مستخدم www-data إلى مستخدم admin باستخدام تقنيات مختلفة
أثناء فحص مجلد /var/www/html اكتشفت ملف .env يحتوي على بيانات اعتماد قاعدة البيانات:

تمت إعادة استخدام كلمة المرور المكتشفة بنجاح للمصادقة عبر SSH و MySQL
SSH

MySQL

بعد الحصول على الوصول الأولي كمستخدم admin، قمت بجمع معلومات النظام لتحديد نواقل تصعيد الصلاحيات المحتملة
جربت أكثر حيل تصعيد الصلاحيات شيوعًا مثل ثنائيات SUID، والصلاحيات (capabilities)، وحقوق sudo، ومهام cron، ولم ينجح أي منها. لذا فحصت متغيرات البيئة بحثًا عن اختطاف PATH أو متغير حساس، ووجدت MAIL variable يشير إلى /var/mail/admin

ذهبت لفحص محتوى البريد ولاحظت أنه تم تحذير المسؤول من تحديث النواة لمعالجة ثغرة OverlayFS/FUSE

إصدار النواة

إصدار نظام التشغيل

لم يتم تحديث النواة أبدًا، مما يؤكد أن المسؤول تجاهل تحذير الأمان أو نسيه
كشف فحص النواة عن الإصدار 5.15.70-051570-generic، وهو عرضة لثغرة CVE-2023-0386 OverlayFS/FUSE لتصعيد الصلاحيات محليًا
بعد تأكيد الثغرة، انتقلت إلى الحصول على استغلال POC عام
قمت باستنساخ الـ POC ونقله إلى الجهاز المستهدف
ثم قمت بتنفيذه ونجحت في الحصول على صلاحيات الجذر


CVE-2023-0386 - CVE-2023-0386 - حقن أوامر نظام التشغيل
إخلاء مسؤولية: تم اختراق هذا الجهاز في بيئة اختبار اختراق مصرح بها
| المرحلة | التقنية | الهدف | النتيجة |
|---|
| 1. الاستطلاع | فحص المنافذ | 22 (SSH), 80 (HTTP) | اكتشاف الخدمات |
| اكتشاف المسارات | /invite | تم العثور على صفحة الدعوة | |
| فك تعمية JavaScript | inviteapi.min.js | تم كشف نقاط نهاية API | |
| 2. الوصول الأولي | توليد رمز الدعوة | POST /api/v1/invite/generate | رمز دعوة صالح |
| التسجيل | POST /api/v1/user/register | تم إنشاء مستخدم عادي | |
| 3. تصعيد الصلاحيات عبر الويب | استكشاف API | GET /api/v1 | تم اكتشاف نقاط نهاية المسؤول |
| التصعيد العمودي | PUT /api/v1/admin/settings/update | is_admin: 0 -> 1 | |
| 4. الوصول إلى النظام | حقن الأوامر | POST /api/v1/admin/vpn/generate | username=test;id; |
| الشل العكسي | حمولة مشفرة بـ Base64 | شل www-data | |
| 5. الحركة الجانبية | اكتشاف الملفات | /var/www/html/.env | admin:SuperDuperPass123 |
| إعادة استخدام SSH | ssh [email protected] | الوصول إلى مستخدم admin | |
| 6. تصعيد صلاحيات الجذر | فحص النواة | uname -r -> 5.15.70 | تم تحديد CVE-2023-0386 |
| تحذير البريد الإلكتروني | /var/mail/admin | تم تأكيد OverlayFS/FUSE | |
| تنفيذ الاستغلال | ./fuse && ./exp | شل الجذر |