一些对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://xdym11235.com/archives/91.html
具体版权规定详见侧栏版权说明页面