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