小研究 - 面向 Java 的高对抗内存型 Webshell 检测技术(三)

news2025/1/24 14:36:01

由于 Web 应用程序的复杂性和重要性, 导致其成为网络攻击的主要目标之一。攻击者在入侵一个网站后, 通常会植入一个 Webshell, 来持久化控制网站。但随着攻防双方的博弈, 各种检测技术、终端安全产品被广泛应用, 使得传统的以文件形式驻留的 Webshell 越来越容易被检测到, 内存型 Webshell 成为新的趋势。本文面向 Java 应用程序, 总结内存型 Webshell 的特征和原理, 构建内存型Webshell 威胁模型, 定义了高对抗内存型 Webshell, 并提出一种基于RASP(Runtime application self-protection, 运行时应用程序自我保护)的动静态结合的高对抗内存型 Webshell 检测技术。实验表明, 与其他检测工具相比, 本文方法检测内存型 Webshell 效果最佳, 准确率为 96.45%, 性能消耗为 7.74%,具有可行性, 并且根据检测结果可以准确定位到内存型Webshell 的位置。

       目录

3 内存型 Webshell 威胁模型

3.1 内存型 Webshell 原理

3.2 形式化定义

3.3 威胁模型


3 内存型 Webshell 威胁模型
3.1 内存型 Webshell 原理

内存型 Webshell 是无文件攻击的一种, 是将恶意代码注入到内存中, 利用中间件的进程执行某些
恶意代码, 没有文件落地, 即服务器上不存在可远程访问的 Webshell 文件。其原理如图 1 所示, 攻击者首先构造与请求处理相关的恶意代码, 包括注册恶意组件的代码、修改已有类逻辑的代码, 通过漏洞等场景执行恶意代码, 成功添加恶意组件到 JVM 进程或修改内存中已有类的逻辑, 将恶意代码驻留在系统内存中, 因此得名内存型 Webshell。注入成功后,攻击者通过访问特定(带参数的)URL, 达到命令执行、文件操作、数据库操作等远程控制 Web 服务器的目的。Java 的反射机制和Instrumentation 机制为内存型 Webshell 提供了良好的植入方式。根据内存型Webshell 的利用技术不同, 将其分为两类, 一类是组件类(也称为非 Agent 类), 一类是 Agent 类。

(1) 组件类
组件类的内存型 Webshell 主要是通过动态注册一个包含恶意代码的组件到运行内存中, 将恶意代
码长期驻留在内存中。常见的组件包括 Java Web 的三大组件, 分别为 Filter、Servlet、Listener。除此之外, 还包括特定框架和容器的特有组件, 例如 Spring框架的 Controller、Interceptor 组件, Tomcat 容器的Valve 组件等。

利用场景一般通过反序列化等漏洞直接注入恶意组件到内存, 或通过文件上传漏洞上传一个 JSP
文件(包含恶意组件注入程序), 执行后删除文件, 达到无文件 Webshell 的效果。该类型 Webshell 要求目标环境可以执行任意 Java 代码, 对目标环境依赖性较强, 通用性差。

其实现过程如图 2 所示。首先创建一个组件, 添加恶意逻辑到其中, 然后通过反序列化、代码执行等漏洞将注册组件代码执行, 注入到特定环境的目标应用程序中, 最后通过访问固定 URL 或带固定参数的 URL 来执行 Payload, 达到 Webshell 的特权状态。

(2) Agent 类
Agent 类的内存型 Webshell 主要是利用 JavaAgent 技术动态修改 JVM 中加载的类文件, 将恶意代码注入其中, 该类在磁盘上还是正常文件, 只有在运行内存中才会包含恶意代码, 达到无文件落地。

 Agent 类的内存型 Webshell 也包括 premain 和agentmain 两种注入方式, 但是实际环境中, 目标应
用程序一般都是已启动状态, 只能使用 agentmain 的方式注入。利用场景通常是通过漏洞上传一个 Jar 文件, 执行成功后删除该文件。该类型 Webshell 在 Java虚拟机层操作, 通用性强。

其实现过程如图 3 所示。首先通过漏洞上传一个 Jar 包, 用于加载 Java Agent 程序, 将 Jar 包注入到目标程序运行内存后, 就可以删除该文件。然后通过访问固定 URL 或带固定参数的 URL, 恶意逻辑会利用 Agent 技术修改类字节码, 再执行 Payload, 达到Webshell 的特权状态。

(3) 两种类型异同组件类和Agent类的内存型Webshell, 相同之处都是利用漏洞将恶意程序注入目标程序内存中, 然后通过访问特定的请求连接 Webshell, 执行 Payload,达到各种控制服务器的特权状态的目的。

不同之处在于, 前者有创建并注册组件的动态过程, 新增了一个组件, 组件中包含恶意逻辑; 而后者是利用 Agent 技术直接修改 JVM 中已经存在的类的逻辑, 不产生新的类。

3.2 形式化定义

内存型 Webshell 是一种网站后门, 根据研究人员对后门的定义, 可以将后门分为输入源、触发器、攻击载荷、特权状态 4 个组件。本节从这 4 个组件出发, 结合内存型Webshell的原理, 对其进行形式化定义。

如图4所示, 目标程序中存在内存型Webshell(θ)可表示为:

θ = (S, i, e, t, Σ, p), i∈S 且 e∈S

S 表示目标程序的全部有限状态集合。I 表示输入源, 即初始状态集合, I S ⊆ 。E 表示内存型 Webshell触发后到达的特权状态集合, E S ⊆ 。t 表示状态转移函数, 也是触发器, 有 t(I, c) = S, c 表示状态转移条件。Σ 表示后门触发条件。p 为攻击载荷, 表示为达到特权状态而采用的有效代码。特别地, 当存在 i∈I, c = Σ, e∈E, 且攻击载荷 p 被执行, 使得 t(i, Σ) = e时, 表示后门被触发, 存在内存型 Webshell。n 表示后门没有被触发时的正常转移状态, n∈S。

输入源表示激活后门触发器的输入来源。内存型 Webshell 的输入源 I 包括:

(1)Java Web 组件, 例如servlet、filter、listener 等;

(2)Java 容器组件, 例如tomcat valve 组件、weblogic 的组件;

(3)Java 框架组件, Java的框架有很多, 包括spring、springboot等, 例如 spring 框架的 controller 组件;

(4)二进制, 例如Agent 类内存型 Webshell 的字节码。

3.3 威胁模型

内存型 Webshell 具有持久性、隐蔽性, 并且将在上节提到的 4 个组件中不断增强, 本节从攻击载荷、触发器两方面进行分析。

(1) 攻击载荷
目前公开的内存型 Webshell 样本基本都是明文的 Payload, 主要关注点在 Webshell 存在于内存中而非磁盘上, 过于关注输入源、触发器的状态, 而忽略了攻击载荷的形态。随着无文件检测技术的不断发展和提升, 内存型 Webshell 将会在 Payload 上做更多的变形。

(2) 触发器
我们假设攻击者在植入组件类高对抗内存型Webshell 时, 触发器的场景包括 1)通过反序列化漏洞等注入恶意字节码, 2)通过 RMI、LDAP 等远程方法调用恶意类, 3)通过文件上传等漏洞注入恶意 JSP
文件。前两种方式是无文件攻击, 目标应用程序的磁盘没有恶意文件落地, 但是也考虑攻击者故意写入磁盘文件的情况, 以绕过无文件这一特性。第三种方式的 JSP 文件在执行过程中, 会先被编译成 class 文件, 然后再执行程序, 即使执行完可以删除文件达到无文件攻击, 但动态检测是在执行过程中进行的,执行过程中不可避免的有文件落地。检测时需针对以上情况分别考虑。

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

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

相关文章

浅谈一下自动化运维优点和缺点,哪款工具好?

面对越来越复杂的业务,以及越来越多样化的用户需求,IT运维的要求也越来越高,IT运维人员工作也越来越繁琐复杂,因此如何又快又安全的保障IT服务是重中之重。这个时候就需要用到自动化运维了。今天我们就来一起简单聊聊什么是自动化…

Linux中的动态库与静态库

文章目录 软链接与硬链接动态库与静态库静态库动态库 动静态库的区别 软链接与硬链接 软链接 当我们不在本地路径下运行时,运行目标二进制文件一般要写明该程序路径. 但是这样运行对于路径较为复杂的程序极为耗费时间,为了简便操作,我们可以将该可执行程序的路径设置为软链接.…

SQL函数和高级语句

目录 一、常用函数 1.聚合函数 2.数学函数 3.字符串函数 二、sql高级语句 1. SELECT(显示表格中指定字段或所有记录) 2.DISTINCT(不显示指定字段数据重复的记录) 3.WHERE(指定条件查询) 4.AND、OR…

(五)「消息队列」之 RabbitMQ 主题(使用 .NET 客户端)

0、引言 先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口(5672)上运行。如果您使用了不同的主机、端口或凭证,则要求调整连接设置。 获取帮助 如果您在阅读本教程时遇到问题,可以通过邮件列表或者 RabbitMQ 社区…

【树链+EXGCD】杭电多校第一场 A

1001 Hide-And-Seek Game (hdu.edu.cn) 题意: 给定一棵树和两条路径,每条路径都有起点和终点,起始时起点有人,每隔一秒都会往终点走一步,会从起点走向终点再会起点这样不断地周期性地走,让你求一点&#…

线上 OOM 频发,MyBatis 有坑...

继上次线上 CPU 出现了报警,这次服务又开始整活了,风平浪静了没几天,看生产日志服务的运行的时候,频繁的出现 OutOfMemoryError,就是我们俗称的 OOM,这可还行! 频繁的 OOM 直接会造成服务处于一…

编程小白的自学笔记十(python爬虫入门二+实例代码详解)

系列文章目录 编程小白的自学笔记九(python爬虫入门代码详解) 编程小白的自学笔记八(python中的多线程) 编程小白的自学笔记七(python中类的继承) 编程小白的自学笔记六(python中类的静态方法…

pandas 笔记:pivot_table 数据透视表

1 基本使用方法 pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean, fill_valueNone, marginsFalse, dropnaTrue, margins_nameAll, observedFalse, sortTrue)2 主要参数 dataDataFramevalues要进行聚合的列index在数据透视表索引(index…

flask基本用法小白教程+按钮跳转到指定页面+python和pip安装(后附)

一、flask学习教程: 1.1 基本程序: 大家可以在pycharm中复制如下代码,先感受一下flask的基本用法: 点击链接可进入浏览器查看程序运行的结果,在127.0.0.1:5000后面添上/test1/等设定的文字,可查看不同函…

Python生成exe文件运行出现黑框闪退如何查看运行bug?

cmd进行回车 第一:进入到可执行exe文件目录,如下图所示 第二:输入可执行文件名,然后就会出现报错提示

(转载)BP神经网络的非线性系统建模(matlab实现)

1案例背景 在工程应用中经常会遇到一些复杂的非线性系统,这些系统状态方程复杂,难以用数学方法准确建模。在这种情况下,可以建立BP神经网络表达这些非线性系统。方法把未知系统看成是一个黑箱,首先用系统输入输出数据训练BP神经网络,使网络能够表达该未知函数,然后用训练好的 B…

【外卖系统】环境的搭建

搭建数据库 1.创建数据库,名字叫reiggie 2.导入数据库 创建Maven项目 1.创建项目 2.检查项目新建的是否有问题 3.导入pom.xml文件 4.导入application.yml文件 在从gittee上down的代码的基础上,修改一下端口号,数据库的名称什么的 …

(数组与矩阵) 剑指 Offer 29. 顺时针打印矩阵 ——【Leetcode每日一题】

❓ 剑指 Offer 29. 顺时针打印矩阵 难度:简单 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输…

DP转HDMI方案芯片-CS5218/CS5263/CS5363/CS5463详细参数对比说明

CS5218/CS5263/CS5363/CS5463都可用于设计DP转HDMI转接线方案,但几者间不管封装还是功能参数都有差异,如下介绍对比下: CS5218 DP to HDMI(4K30HZ) ,CS5218管脚定义参数说明和设计电路图: ​ ​ CS5263 DP to HDMI 4…

Kubernetes_1.27.3_Harbor结合Nacos实战

Nacos 实战 作者:行癫(盗版必究) 一:Nacos简介 1.简介 ​ Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台;Nacos 致力于帮助您发现、配置和管理微服务;Nacos 提供了一组简单易用的特…

计讯物联5G千兆网关TG463在电力智能巡检机器人的应用功能解析

项目背景 随着国家智能电网建设加速推进,投资规模持续扩大,我国电网智能化、信息化不断提高,传统的电力运维与管理模式早已不能满足智能电网快速发展的需求。因此,在5G无线通信、人工智能、物联网、云计算、大数据、电力等前沿技术…

Error: The client is unauthorized due to authentication failure.解决办法

进入到neo4j的安装目录 修改neo4j.conf配置文件 把红框的注释#去掉保存后,重新运行neo4j,问题解决

【Python统计与数据分析实战_01】位置与分散程度的度量

数据描述性分析 1.描述统计量1.1 位置与分散程度的度量1.1.1 例子一 单维数组1.1.2 例子二 多维数组 1.2 关系度量1.3 分布形状的度量1.3.1 统计量:偏度和峰度 1.4 数据特性的总括 1.描述统计量 数据的统计分析分为统计描述和统计推断两部分。前者通过绘制统计图、…

Vue3.0的设计目标是什么?做了哪些优化?

一、设计目标 不以解决实际业务痛点的更新都是耍流氓,下面我们来列举一下Vue3之前我们或许会面临的问题 随着功能的增长,复杂组件的代码变得越来越难以维护 缺少一种比较「干净」的在多个组件之间提取和复用逻辑的机制 类型推断不够友好 bundle的时间太久了 而 Vue3 经过长达…

RuoYi-Vue/vue项目访问 webpack 中定义的变量

前言 RuoYi-Vue 3.8.4 webpack 中定义的变量 vue.config.js 中定义的 webpack 的变量 在html页面中&#xff0c;如何访问 webpack 的变量 <title><% webpackConfig.name %></title>参考&#xff1a;ruoyi-ui/public/index.html 文件