# Shiro 反序列化漏洞及漏洞工具流量浅析

最近因为打比赛碰到了没见过的流量,感觉这个蛮有意思的,就顺带自己打了下靶场抓取流量分析了下

# 原理

在抓取之前先简单了解下该漏洞的原理及其触发机制

Shiro 框架提供了记住我的功能(RememberMe)省去用户短时间内再次登录输入账号密码的操作,用户登录成功后会生成经过加密并编码的 cookie。cookie 的 key 为 RememberMe,cookie 的值是经过相关信息进行序列化,然后使用 AES 加密(对称),最后再使用 Base64 编码处理。服务端在接收 cookie 时:

检索 RememberMe Cookie 的值 Base 64 解码 AES 解密(加密密钥硬编码)进行反序列化操作(未过滤处理)

攻击者可以使用 Shiro 的默认密钥构造恶意序列化对象进行编码来伪造用户的 Cookie,服务端反序列化时触发漏洞,从而执行命令。

这段话把该漏洞进行了一个简单的说明,总结来说就是 shiro 框架存在一个功能叫做 rememberme,他能方便用户不用在短时间内进行重复多次登录,顾名思义就是被记住了。该过程是会把用户的信息进行序列化、编码,但是如果服务端在接收时没有做到有效过滤,那么攻击者就可以在 cookie 当中使用默认密钥进行构造,等到服务端进行反序列化时触发

# 抓包分析

在 vulfocus 起个环境

image-20240829182149303

这里分为两种情况,分别是勾选和不勾选 rememberme 选项,它的登录成功和登录失败都有什么不同。来逐一进行分析

# 不勾选

# 登录失败

image-20240829182857543

正确密码为 secret,我这多输了一个 1,能看到不勾选时,密码输入错误的情况下,返回包中的 set-cookie 字段也会有一个 rememberMe=deleteMe

# 登录成功

image-20240829183524024

同样会出现 rememberMe=deleteMe,但是状态码会变成 302 跳转

接下来看看勾选了 rememberme 选项之后的数据包有啥不同的

# 勾选

# 登录失败

image-20240829184435634

和没有勾选登录失败的情况一样

# 登录成功

image-20240829184557052

能很明显地发现勾选 rememberme 之后登录成功地 set-cookie 多了一段编码,登录成功之后的请求 cookie 中都会带有 rememberme 字段

可以得出结论登录返回包中出现了 rememberMe=deleteMe 就可以确认是 shiro 框架

# 分析工具流量

简单看了下登录的数据包,了解了大致流程以及原理,接下来直接上工具抓流量进行分析

image-20240829191935163

image-20240829191949757

image-20240829192016449

image-20240829192051023

以上是工具流程图展示,同时抓取了流量

可以看到成功爆破出利用链之后进行了三次命令执行,分别是 ls,pwd 和 whoami

接下来看看流量

image-20240829193335599

对比检测日志我们可以清晰的知道,在命令执行之前一共有五次和该工具有关的流量

一张张来看

image-20240829193756904

该流(第 18 流)对应检测出了 shiro 的框架

image-20240829193853504

在第 22 流中我们发现它的请求中已经带上了 rememberme 字段,证明该流就爆破出了密钥做到成功登录,而登录后所进行的请求都会带有 rememberme 字段

接下来的 48、49、50 流都带有超长 cookie 请求,便是在爆破利用链和回显(这里我就不一一放图了)

image-20240829194244291

由于我的流量抓的比较杂,所以下一个和 shiro 工具相关的流在第 70 流

image-20240829194526664

发现该流的特点除了 cookie 超长之外,请求和回复还多了两个字段

image-20240829194645761

根据之前工具的检测日志来看,这便是工具命令执行的特征了,分别解码看看,都是 base64 编码

image-20240829195023799

image-20240829195043320

证实了这便是我们第一条执行的命令以及回显,在我所抓取的整个流量包中,该流之后还找到两条与该 shiro 工具相关的流量,特征便和这第 70 流是一样的,也就是后面所输入的 pwd 和 whoami 两条命令以及回显

现在就该思考和好奇了,既然命令请求和回显都单独能够抓取到,那么 cookie 当中会隐藏些什么信息呢?

image-20240829195916332

这里为了提高效率在网上找了一个通过 rememberme 来爆破 key 的工具,这就可以帮助我们在不知道 key 的情况下通过能被抓取到的 rememberme 字段来爆破出 key。该工具的好处就是一把梭,一键解密了

至此,shiro 反序列化利用工具的流量已经简单分析完毕,总的来说分为四段:

1
2
3
4
5
6
7
第一段:检测

第二段:爆破密钥

第三段:爆破利用链及其回显

第四段:进行命令执行等操作

每一段的流量都有区别,特别是第四段的命令执行流量,会有特别的回显以及多出一个命令执行字段的请求,编码都是 base64

# 例题

拿最近某城杯这道作为例题吧

image-20240829201204169

这里可以看到在第 6 个流已经开始请求包的 cookie 中已经带上了 rememberme 字段了,并且十分冗长,证明这时候已经开始爆破利用链及其回显了

image-20240829201340165

发现流 6 的末尾回显为 0,并且没有出现 rememberMe=deleteMe 字样,这时候就需要注意了,它的流量十分连贯,但是这时候回显有变,可能是利用链爆破成功了

果不其然,在第七个流中我们就看到了不一样的回显以及请求包多出的字段,可以判断当前状态为利用链成功并且成功进行了第一次命令执行

image-20240829201555258

image-20240829201612368

第一次执行的是 whoami 命令,继续往下找

image-20240829201743077

在第 10 流中发现请求特别长并且回显为 0,解码看看

image-20240829201817134

得到了一个 pass

接着在第 13 流发现有大量的回显,解码请求发现是个 secret.txt 的内容

image-20240829201925351

将其中多余的 “2000” 和 “ad0” 去除,并利用脚本去除换行(前面这一步一定要注意最好用脚本,不然手动容易出错会影响最终写出的文件),解码得到一个 zip16 禁止倒序,reverse 一下写成 16 进制文件得到压缩包

image-20240829202245548

利用刚才的 pass 解压出 flag2.jpg 是个小猫字体的后半段 flag,网上搜一下对照出来就好

还剩个前半段,就藏在之前分析的请求中,利用工具一把梭

image-20240829202526071

这里看到有个目录名便是 flag1,拼接一下得到最终 flag

总结:shiro 反序列化利用工具的流量还是比较有意思的,因为漏洞原理和流程不同,所以每个对应工具的相应流量也会不一样,但分析了之后也会发现,到了命令执行那一步的时候所展示出来的流量和老套的 webshell 流量已经没有太大的区别了,还是很好分析的。当然,shiro 以及该 shiro 工具的流量特征还是特别明显的,学到了好多