Apache ActiveMQ 是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。
ActiveMQ中,经过身份验证的用户默认情况下可以通过/api/jolokia/接口操作MBean,其中FlightRecorder可以被用于写Jsp WebShell,从而造成远程代码执行漏洞。
FlightRecorder存在于Jdk 11+,具体类名:jdk.management.jfr.FlightRecorderMXBeanImpl
影响范围
- Apache ActiveMQ before 5.16.6
- Apache ActiveMQ 5.17.0 before 5.17.4
- Apache ActiveMQ 5.18.0 unaffected
- Apache ActiveMQ 6.0.0 unaffected
环境构建
在CVE-2022-41678目录下执行如下命令启动一个Apache ActiveMQ 5.17.3服务器:
|
|

服务启动后,访问http://your-ip:8161/后输入账号密码admin和admin,即可成功登录后台。

原理分析
漏洞入口在【 http://localhost:8161/api/jolokia/】 ,⚠️注意需要带上Origin头才可以访问

主要问题出在FlightRecorder这个Mbean,功能是记录内存,gc,调用栈等。
漏洞用到的方法主要是以下几个:
newRecording:新建记录setConfiguration:更改配置startRecording:开始录制stopRecording:结束录制copyTo:导出录制文件
漏洞思路是通过setConfiguration修改配置,把一些键名改成jsp代码,记录的数据就会包含该jsp代码,录制完成后,通过copyTo导出到web目录即可
代码位置在 jdk.management.jfr.FlightRecorderMXBeanImpl#setConfiguration

漏洞复现
首先,访问/api/jolokia/list这个API可以查看当前服务里所有的MBeans:
|
|

这其中有两个点可以被用来执行任意代码。
途径一
第一个方法是使用org.apache.logging.log4j.core.jmx.LoggerContextAdminMBean,这是由Log4j2提供的一个MBean。

攻击者使用这个MBean中的setConfigText操作可以更改Log4j的配置,进而将日志文件写入任意目录中。

使用【POC】脚本来复现完整的过程:
|
|

Webshell被写入在/admin/shell.jsp文件中:

这个方法受到ActiveMQ版本的限制,因为Log4j2是在5.17.0中才引入Apache ActiveMQ。
途径二
第二个可利用的Mbean是jdk.management.jfr.FlightRecorderMXBean。

FlightRecorder是在OpenJDK 11中引入的特性,被用于记录Java虚拟机的运行事件。利用这个功能,攻击者可以将事件日志写入任意文件。
使用【POC】脚本来复现完整的过程(使用--exploit参数指定使用的方法):
|
|

Webshell被写入在/admin/shelljfr.jsp文件中:

修复建议
- AMQ-9201 - Update Jolokia default access configuration · apache/activemq@6120169
GitHub: https://github.com/apache/activemq/commit/6120169e5)
附录
参考文献
版权信息
本文原载于 Ranch’s Blog,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。