Apache Jackrabbit RMI 远程代码执行漏洞分析(CVE-2023-37895)

Apache Jackrabbit RMI 远程代码执行漏洞分析(CVE-2023-37895)

船山信安 2023-11-28 00:02

简介

Apache Jackrabbit™ 内容存储库是完全符合 Java 技术 API 内容存储库(JCR,在 JSR 170 和 JSR 283 中指定)的实现。内容存储库是一个分层内容存储库,支持结构化和非结构化内容、全文搜索、版本管理、事务、观察等。

使用

要访问远程内容存储库,需要在应用程序中使用 jackrabbit-jcr-rmi 组件

使用 RMI registry访问版本库所需的代码是

或者使用URLRemoteRepository

漏洞详情

在Apache Jackrabbit webapp和standalone中使用了commons-beanutils组件,该组件包含一个可用于通过 RMI 远程执行代码的类。攻击者可利用该组件构造恶意的序列化对象,发送到服务端的RMI服务端口或者Web服务的/rmi路径,目标服务器对恶意对象反序列化导致RCEhttps://nvd.nist.gov/vuln/detail/CVE-2023-37895

影响版本

1.0.0 <= apache:jackrabbit < 2.20.112.21.0 <= apache:jackrabbit < 2.21.18

利用链

漏洞环境及利用

下载Apache Jackrabbit 2.20.10,编译并使用Tomcat部署https://github.com/apache/jackrabbit/releases/tag/jackrabbit-2.20.10客户端使用下面EXP,运行即可导致服务端RCE,弹出计算器

漏洞分析

在web.xml存在/rmi路由对应的Servlet

根据对应的servelet-class,可以找到对应的类org.apache.jackrabbit.servlet.remote.RemoteBindingServlet,这个类继承HttpServlet,负责对相关请求的处理,其doGet方法如下:

这段代码的作用是将远程存储库对象进行序列化,并将序列化后的对象以二进制流的形式作为响应发送给客户端.

进入getRemoteRepository方法详细查看

进入ServerAdapterFactory的getRemoteRepository方法

返回remote

在RemoteObject.toStub方法中将远程对象转换为远程引用的 Stub 对象

最后使用writeObject将其传输给客户端

客户端拿到Repository对象后,调用其login方法

进入重载方法

通过getRepository获取的是ClientRepository对象,调用其login方法这段代码是一个 login() 方法的实现,用于通过提供的凭据和工作空间登录到远程存储库,并返回一个会话(Session)对象

ServerRepository的login方法

这里的关键点是credentials是通过客户端传递过来的,而Credentials接口继承了Serializable接口

因此可以构造特殊的Credentials对象,从而在该对象反序列化过程中执行任意代码这里可以找到一个Credentials子类SimpleCredentials,它继承了Credentials,与此同时,它的attributes属性是一个HashMap对象

存在一个公有方法设置attributes属性

这里的value设置成恶意的对象,能够在反序列化的过程中触发RCE,具体设置成什么,则需要在Apache Jackrabbit寻找其他可利用的链

在整个项目web模块的maven配置文件中添加了如下依赖:

所以这里可以尝试使用CB链来构造恶意对象

接下来的过程就是调用远程ServerRepository的login方法,其参数是构造的恶意SimpleCredentials,其过程是服务端开启了一个RMI服务,客户端调用该服务并发送恶意对象,服务端反序列化恶意对象,触发RCE具体可参考https://xz.aliyun.com/t/12780#toc-7

服务端对客户端传递的数据经过解包、反序列化后导致命令执行

来到unmarshalValue,它用于从 ObjectInput 流中反序列化一个对象

接下来的过程就是对SimpleCredentials进行反序列化及CB链的过程,不详细展开。

函数调用栈

来自于服务端:

EXP

漏洞修复

在版本2.20.10和2.20.11的对比中,maven配置中删除了commons-beanutils依赖https://github.com/apache/jackrabbit/compare/jackrabbit-2.20.10…jackrabbit-2.20.11

来源:https://xz.aliyun.com/ 感谢【
Dili
 】