MENU

一些对Shiro反序列化的探索

September 15, 2021 • Read: 202 • vulhub阅读设置

一些对Shiro反序列化的探索

在渗透测试的过程中,经常会遇到Shiro反序列化的漏洞,一直不知道其中的原理,今天打算一探究竟。

靶机环境

我选择使用vulhub项目的docker环境搭建靶机,在./shiro/CVE-2016-4437/目录中执行docker-compose up -d即可完成靶机搭建。

漏洞复现

  1. 打开靶机,勾选remember me,用户名密码为admin/vulhub,使用burpsuite抓包,发现靶机返回数据包中包含rememberMe字段
  2. 在返回的数据包中只要出现了Set-Cookie: rememberMe=deleteMe字段即可认定为使用了Shiro框架

    Shiro框架中,收到rememberMe后会完成如下操作

    • base64解码
    • 使用Shiro硬编码在代码中的密钥与base64解码后的数据AES解密得到序列化内容
    • 使用Shiro中的方法反序列得到用户信息
  3. 编写脚本解码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()
  4. 使用SerializationDumper工具来对解密后的序列化数据反序列化,但是该工具报错
  5. 经过查询相关资料,发现该工具只能反序列化以ac ed 00 05开头的序列化数据,其中AES解密后的数据第一行为IV(16字节),所以需要删除前16字节的数据,使用010 Editor编辑remember文件,删除前16字节数据,重新保存
  6. 重新使用SerializationDumper工具反序列化,获得正常数据
  7. 在正常数据中搜索admin,发现存在
  8. 使用shiro_attack工具,检测构造链和回显方式后直接执行代码,通过Wireshark获取rememberMe字段的值,使用上述方法查看构造链和回显方法,发现看不懂,遂罢。
  9. 接下来分析一下这个Shiro漏洞检测工具的流量
  10. 使用shiro_attack执行命令whoami后,在Wireshark中发现请求头中出现c: d2hvYW1p,经过base64解码,发现为执行的命令,同时经过多次测试,发现在请求头中的User-Agent使用百度爬虫UA
  11. 同样在返回数据包中发现存在$$$开头和结尾的数据,在对$$$包裹的数据进行base64解码后,发现为whoami命令执行结果

总结

  1. 大概了解了Shiro反序列化漏洞的一些原理,但是没能理解构造链和回显。
  2. 分析了shiro_attack的流量特征,发现该工具流量特征及其明显,非常容易检测。
Archives QR Code Tip
QR Code for this page
Tipping QR Code