出题人碎碎念

“学 CTF 挺好的,但是不要目光只放在 Misc 上,面临流量分析的时候你也要接触一定的 PHP 基础,懂得 Webshell 和 Sql 注入等一般网站攻击常规手段;面对取证分析的时候,你也要接触数据库取证解密方案,也要去了解基本的程序逆向流程,这些说是 Web 和 Reverse 的流程,但是 Misc 本来就是主打一个 Misc,不可能 Misc 手生涯中就盯着隐写、编码、套娃不放,Misc 手的生涯,注定是不断学习,不断扩宽自己视野的过程”——by 橘墨师傅

由于前段时间的毕设跟Shiro反序列化相关,那段时间Shiro反序列化漏洞看的比较多,尤其是细看了SummerSec大佬经典的ShiroAttack工具源码,对工具的漏洞利用方式了解的比较透彻,便以此为契机,打算出一道利用工具攻击Shiro框架的流量分析题。

之后就是考虑flag藏哪的问题,Shiro反序列化漏洞最大特征就是rememberMe变量,因此我将一半的flag通过自定义包名方式隐藏起来,并修改了Shiro默认密钥,剩下的半个flag通过分析命令执行与对应回显得到。

(为了增加些许难度,)同时我修改了Shiro名以及框架里常见的变量名(shiro->miaoro、rememberMe->nekoMiao、deleteMe->nikoMiao),但是不妨碍知道Shiro反序列化漏洞的师傅一眼丁真。

看到群里有师傅吐槽,打CTF的为什么都这么喜欢猫猫。

确实啊,确实。

解题步骤

1、流量包看到访问了miaoroAttack,根据题目描述以及请求包和响应包的特征,猜测被攻击的网站使用的是修改了特征的shiro框架,并且这一步是已经探测到了shiro框架特征(rememberMe=deleteMe)

2、按照攻击思路接下来应该是爆破密钥,发现之后的一个tcp流连续发了很多包,使用默认shiro密钥可以解密第一个请求包中的nekoMiao(即原rememberMe),是构造了一个SimplePrincipalCollection的空对象,根据响应包的回显来判断密钥,显然第一个响应包返回Set-Cookie: nekoMiao=nikoMiao,说明框架用的不是默认密钥

发现该TCP流的最后一个响应包没有Set-Cookie: nekoMiao=nikoMiao,说明爆破密钥成功,密钥爆破字典有多种渠道获得——例如根据访问页面miaoroAttack,对shiro比较熟悉的师傅可以直接想到ShiroAttack工具,可以在该项目得到字典;或者直接搜索引擎搜索shiro常见密钥等关键词,也能在网上找到相关密钥字典。

如果是用ShiroAttack工具自带的字典,可以根据该TCP流密钥爆破次数,直接找到第十个密钥,即MTIzNDU2Nzg5MGFiY2RlZg==,其他字典写脚本遍历即可(该密钥应该也在靠前的位置)

3、得到密钥下一步就是爆破利用链,ShiroAttack判断利用链是否能够利用是通过响应包是否返回Host字段,从第6个tcp流可见一共爆破了三次利用链,最后一次成功

并且通过aes解密可从序列化字符串中看到flag1,DASCTF{B916CFEB-C40F-45D6-A7BC-

4、后续的tcp流都是命令执行部分,输入的命令以base64编码形式放在请求头GWHT属性后,执行结果也是同样以base64编码在响应包返回

其中一个流发现执行了echo命令,得到密码Th15_11111111s_pP@sssssw000rd!!!

接着发现另一个流下载打印了secret.txt

将响应包中的base64编码复制(因为每次传输最大长度为2000,因此要注意去除字符串中的长度标识),查看结尾发现是zip的逆序,提取ascii部分逆序后得到加密压缩包

5、利用前面获取的密码解密得到flag2.jpg,发现长宽被修改了,将长宽修改成一样

得到

观察样式和数量,猜测是某字母演变的,上网搜索猫猫字母表等关键词可以发现,最后一个字符猜测是}

得到flag2,EBOFDELQDIAA},结合flag1得到完整flag,DASCTF{B916CFEB-C40F-45D6-A7BC-EBOFDELQDIAA}

写在最后

连续三年参与羊城杯出题了,有因为平台部署问题导致题目出现非预期,也有因为个人原因导致比赛时发现题目有点小问题,这次赛后看到有几个师傅反馈我的题目出的还行,还是有点小开心。

发表回复