1. 程式人生 > 實用技巧 >Weblogic學習(1)

Weblogic學習(1)

前期準備

已知可傳送b't3 12.2.1\nAS:255\nHL:19\n\n'來觸發T3協議,所以可以寫一個小指令碼來重複傳送請求,方便分析:

import socket
from time import sleep

def send(ip, port, data):
    # data = data.encode("utf8")
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = (ip, int(port))
    try:
        sock.connect(server_address)
        sock.sendall(data)
        response = sock.recv(1024)
        sleep(1)
        print(response)
    except socket.error as e:
        print('[!] Socket Error')
    finally:
        sock.close()


if __name__ == '__main__':
    t3 = b"t3 12.2.1\nAS:255\nHL:19\n\n"
    while input("[*] Go?(Y/N):")[0].lower() == 'y':
        send('192.168.126.128', 7001, t3)

分析

分析的版本為10.3.6

Weblogic判斷協議過程

斷點下在server/lib/weblogic.jar/weblogic/socket/PosixSocketMuxer.class的第129行,如圖:

之後一直除錯,直到server/lib/weblogic.jar/weblogic/socket/SocketMuxer.class第643行var1.isMessageComplete(),如圖:

該方法經反編譯後的程式碼如下:

public boolean isMessageComplete() {
    int var1 = 0;

    for(int var2 = 0; var2 < this.handlers.length; ++var2) {
        ProtocolHandler var3 = this.handlers[var2];
        if (var3.claimSocket(this.head)) {
            this.claimedIndex = var2;
            break;
        }

        var1 = Math.max(var1, var3.getHeaderLength());
    }

    if (this.availBytes < var1) {
        return false;
    } else if (this.claimedIndex < 0) {
        SocketLogger.logConnectionRejected(this.channels[0].getChannelName());
        SocketMuxer.getMuxer().deliverHasException(this.getSocketFilter(), new ProtocolException("Incoming socket: '" + this.getSocket() + "' has unhandled protocol prefix"));
        return false;
    } else {
        return true;
    }
}

this.headers中儲存著weblogic規定的協議,this.head中儲存著我們傳送的資料,claimSocket方法用來判斷我們傳送的資料屬於哪種協議,其反編譯後的程式碼如下:

public boolean claimSocket(Chunk var1) {
    return this.claimSocket(var1, "GIOP");
}

GIOP就是協議的名字,this.claimSocket反編譯後的程式碼如下:

protected boolean claimSocket(Chunk var1, String var2) {
    int var3 = var2.length();
    if (var1.end < var3) {
        return false;
    } else {
        byte[] var4 = var1.buf;

        for(int var5 = 0; var5 < var3; ++var5) {
            if (var4[var5] != var2.charAt(var5)) {
                return false;
            }
        }

        return true;
    }
}

很簡單,大概意思就是比較前幾位是不是為指定的字元(比如判斷前4位是否為GIOP),根據判斷協議的不同,該函式也會變。

最後當傳送的資料不符合IIOP、T3、LDAP、SNMP所規定的形式時,就會被歸類到HTTP去

weblogic對T3協議的處理

在判斷了傳送的資料是什麼協議之後,會通過dispatch()server/lib/weblogic.jar/weblogic/socket/MuxableSocketDiscriminator,74行)去獲取真正的協議名:

然後在maybeFilter中根據系統設定判斷是否要更換一下協議名:

之後提取我們傳送的資訊中的版本號、AS、HL資訊(weblogic/rjvm/t3/MuxableSocketT3.classreadBootstrapMessage方法)

然後在weblogic/socket/Login.class中的connectReplyOK中構造我們看到的HELO等資訊,並將它們傳回來(可能會出現剛發完HELO就斷開連線的情況,可以視自己手速加一下sleep):