一些对Shiro反序列化的探索
在渗透测试的过程中,经常会遇到Shiro反序列化的漏洞,一直不知道其中的原理,今天打算一探究竟。
靶机环境
我选择使用vulhub项目的docker环境搭建靶机,在./shiro/CVE-2016-4437/目录中执行docker-compose up -d即可完成靶机搭建。
漏洞复现
- 打开靶机,勾选
remember me,用户名密码为admin/vulhub,使用burpsuite抓包,发现靶机返回数据包中包含rememberMe字段
在返回的数据包中只要出现了
Set-Cookie: rememberMe=deleteMe字段即可认定为使用了Shiro框架在
Shiro框架中,收到rememberMe后会完成如下操作- base64解码
- 使用Shiro硬编码在代码中的密钥与base64解码后的数据AES解密得到序列化内容
- 使用Shiro中的方法反序列得到用户信息
编写脚本解码
rememberMe字段中的内容,获得用户信息,其中红框ac ed 00 05是Java序列化的标志,绿框admin是储存的用户信息
脚本如下:import base64 from Crypto.Cipher import AES cookie = ""#登录成功后返回的rememberMe key = ""#该系统使用的Shiro框架的硬编码Key key = base64.b64decode(key) cookie = base64.b64decode(cookie) mode = AES.MODE_CBC IV = b' ' * 16 re = AES.new(key, mode, IV=IV) re123 = re.decrypt(cookie) # 将AES解密后的值存入文件 with open('remember', 'wb') as fp2: fp2.write(re123) fp2.close()- 使用SerializationDumper工具来对解密后的序列化数据反序列化,但是该工具报错
- 经过查询相关资料,发现该工具只能反序列化以
ac ed 00 05开头的序列化数据,其中AES解密后的数据第一行为IV(16字节),所以需要删除前16字节的数据,使用010 Editor编辑remember文件,删除前16字节数据,重新保存
- 重新使用
SerializationDumper工具反序列化,获得正常数据
- 在正常数据中搜索admin,发现存在
- 使用shiro_attack工具,检测构造链和回显方式后直接执行代码,通过Wireshark获取
rememberMe字段的值,使用上述方法查看构造链和回显方法,发现看不懂,遂罢。 - 接下来分析一下这个Shiro漏洞检测工具的流量
- 使用
shiro_attack执行命令whoami后,在Wireshark中发现请求头中出现c: d2hvYW1p,经过base64解码,发现为执行的命令,同时经过多次测试,发现在请求头中的User-Agent使用百度爬虫UA
- 同样在返回数据包中发现存在
$$$开头和结尾的数据,在对$$$包裹的数据进行base64解码后,发现为whoami命令执行结果
总结
- 大概了解了Shiro反序列化漏洞的一些原理,但是没能理解构造链和回显。
- 分析了
shiro_attack的流量特征,发现该工具流量特征及其明显,非常容易检测。
《一些对Shiro反序列化的探索》链接:https://www.xdym11235.com/archives/91.html
具体版权规定详见侧栏版权说明页面