webshell之字节码免杀

字节码生成

javac生成字节码

这种方式简单的说就是用ideal将java文件编程成class文件,然后将class读取出来用base64编码即可,这种方式比较方便简单,不需要会使用ASM,javassist等字节码框架。

webshell之字节码免杀_第1张图片

Shell.java

webshell之字节码免杀_第2张图片

javassist生成字节码

javassist是生成修改字节码的框架,使用比ASM更简洁,但是并非jvm自带的库,也是笔者非常喜欢的一个框架。

webshell之字节码免杀_第3张图片

ASM生成字节码

ASM相比javassist操作更复杂,但是jvm自带,利用面非常广

webshell之字节码免杀_第4张图片

这里由于ASM操作比较复杂,就先生成一个简单的字节码(前面javac和javassist笔者写的回显都是在字节码这,这ASM回显的内容就先不放在ASM中生成),由于runs函数的返回值为Process,我们只需要在后面的jsp处理中拿出来用即可。

webshell之字节码免杀_第5张图片

webshell之字节码免杀_第6张图片

免杀修改

webshell之字节码免杀_第7张图片

webshell之字节码免杀_第8张图片

defindClass免杀

webshell之字节码免杀_第9张图片

免杀效果:

webshell之字节码免杀_第10张图片

webshell之字节码免杀_第11张图片

虽然用原始的defindClass虽然能到达免杀效果,但是由于没有重写loadClass,findClass,没有打破双亲委派,导致恶意的字节码被加载后,再次访问网页的时候,类不会被生成,导致不能正常使用

自定义classloader免杀

webshell之字节码免杀_第12张图片

webshell之字节码免杀_第13张图片

webshell之字节码免杀_第14张图片

免杀效果:

webshell之字节码免杀_第15张图片

webshell之字节码免杀_第16张图片

BCEL字节码免杀

Apache Commons BCEL被包含在了JDK的原生库中,BCEL库提供了一系列用于分析、创建、修改Java Class文件的API用于处理字节码,但是com.sun.org.apache.bcel.internal.util.ClassLoader这个类加载器由于安全问题,在JDK7以上版本被移除,导致BCEL字节码的利用变得很局限。

 
  

webshell之字节码免杀_第17张图片

webshell之字节码免杀_第18张图片

TemplatesImpl 加载字节码

TemplatesImpl是fastjson反序列化漏洞中常用的对象之一,但是由于在TemplatesImpl触发漏洞点只是调用个无参构造,导致恶意类的类方法无法被调用,只能将恶意代码插入到无参构造方法,或者静态代码块中。

webshell之字节码免杀_第19张图片

注意:

这里的类必须继承自AbstractTranslet

webshell之字节码免杀_第20张图片

在这里由于不能调用恶意类的类方法和有参构造,导致无法动态的执行命令,虽然如此但依旧可能利用ASM,javassist这些字节码框架来动态生成恶意类,进行动态的调用命令,在本文先不在探讨如何利用, 利用的方式将会在后期文章中讲解。

webshell之字节码免杀_第21张图片

webshell之字节码免杀_第22张图片

URLClassLoader本地加载

URLClassLoader一般有两种利用方式,一种是远程加载class文件,一种是本地加载class文件。

远程加载class文件免杀:

直接利用远程在家class文件的好处是代码量少,特征少。但是由于需要一个外网主机作为服务器,远程可能存在着被溯源的可能性。

webshell之字节码免杀_第23张图片

webshell之字节码免杀_第24张图片

这里讲解一下服务端如何搭建:

第一步:在一个文件夹中使用python开启一个http服务

python -m  http.server

第二步:将编译好的class文件,根据全限定类名创建相应的文件夹,并导入class文件

webshell之字节码免杀_第25张图片

以上两步即可完成搭建

免杀效果:

webshell之字节码免杀_第26张图片

webshell之字节码免杀_第27张图片

JavaCompiler本地class文件免杀:

该免杀方式为先写入一个java马,利用JavaCompiler将其在jvm运行时编译成class文件,及javac动态编译,在利用urlclassloader加载编译好的class文件,为了消除特征以下的base64编码的内容就是之前写好的webshell代码。由于这种方式会创建java,class文件,为了隐蔽性,在这里将删除的文件在进行了删除处理。

webshell之字节码免杀_第28张图片

webshell之字节码免杀_第29张图片

webshell之字节码免杀_第30张图片

免杀效果:

webshell之字节码免杀_第31张图片

webshell之字节码免杀_第32张图片

总结:

如果大家学过shellcode的免杀,我想都会有一种似曾相识的感觉,没错,这里的字节码类似与shellcode,而类加载器类似于shellcode加载器。这里讲解了最常用的生成字节码的方式,以及利用类加载器加载字节码达到免杀效果。

你可能感兴趣的:(web安全,网络,安全,学习,java)