设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 服务器 > 安全 > 正文

严峻Web对抗环境下的Webshell

发布时间:2021-12-13 09:28 所属栏目:53 来源:互联网
导读:引言 随着攻防对抗的强度越来越高,各大厂商流量分析、EDR等专业安全设备已广泛使用,对于Webshell的检测能力愈发成熟,对于攻击方来说,传统落地文件型的Webshell生存空间越来越
引言
随着攻防对抗的强度越来越高,各大厂商流量分析、EDR等专业安全设备已广泛使用,对于Webshell的检测能力愈发成熟,对于攻击方来说,传统落地文件型的Webshell生存空间越来越小。如何在实战演练过程中完成高隐匿和持续性的Web权限维持,成为了Web对抗技术的研究重点,Webshell逐渐涌现出来一些新的利用方式。
 
Webshell 变迁
传统 Webshell 都是基于文件类型,攻击者可以通过文件上传、任意文件写入等漏洞将Webshell植入到目标机器的Web目录下,从而达到权限维持的目的,由于需要在目标机器上执行写入操作,防守方可以通过静态检测的方式对文件中所使用的关键词、敏感函数、文件创建/修改时间、文件权限、文件所有者等多个维度的特征进行检测,传统Webshell生存空间被逐渐压缩,内存型Webshell应运而生。内存型 Webshell(MemWebshell)利用代码执行等方式,直接将恶意的代码注入到Web应用进程当中,具备无文件落地的特性更加符合OPSEC的原则,给检测带来巨大难度,适用于严苛的Web对抗场景。
 
MemWebshell 分类
MemWebshell 从注入方式和运行原理的角度上划分为两个大类:
 
1. 基于Servlet规范利用:利用反序列化等具备任意代码执行能力的漏洞,动态注册符合Servlet规范的自定义恶意组件到Web容器的 Context 中,包括 Servlet、Filter、Listener 等,攻击者通过请求特定的路由实现与MemWebshell的通信;
 
2. 基于 Java Instrumentation 利用:利用 Java Instrumentation 技术(JDK 5.0引入),动态修改 JVM 中Class 的字节码,包括类的属性、方法等内容,攻击者利用该技术 Hook 已有容器或 Servlet 代码逻辑,使用动态字节码操作类库实现自定义恶意代码逻辑的插入或修改;
 
动态注册 MemWebshell
在日常项目开发当中有两种标准的注册方式,使用「XML配置文件」或「注解配置」,其本质是描述目标实例对象所需的配置信息,例如:路由信息、类信息等,最终底层都由 Web 容器来获取 XML 或者注解中的配置,完成 Servlet 实例对象的初始化,并注册到容器相应的 Context 中。其中,主要利用了 Servlet API 提供的动态注册机制,该机制是在 Servlet 3.0 中发布,为 Servlet、Filter、Listener 在 javax.servlet.ServletContext 接口中都提供了相应的注册方法,攻击者可利用该特性完成 MemWebshell 的动态注册。
Filter MemWebshell 注册思路:
 
1. 获取 ApplicationContext 实例,并调用 addFilter 等方法进行 Filter 的注册以及URL匹配模式的绑定;
 
2. 利用反射动态的对容器运行状态进行 修改 和 恢复,辅助 Filter 的注册添加。
 
注册 Servlet MemWebshell
 
Servlet 为 Server Applet 的简称,即:服务端程序,Servlet 用于读取处理客户端发送的数据,并响应结果。通过将自定义的 Servlet 与 URL 匹配模式注册到容器中,实现 Servlet MemWebshell。
 
Servlet 的动态注册相比于上述 Filter 比较类似,同样是使用 Tomcat ApplicationContext 中的 addServlet 方法进行实现,直接使用该方法进行 Servlet 的注册会出现异常,主要会受到容器运行状态的影响,可以仿照 Filter 注册的方式,动态的对运行状态进行修改,这里会使用更加“优雅”的方式进行注册,下面是核心的注册逻辑:
 
Wrapper wrapper = standardContext.createWrapper();
wrapper.setName("MemWebshellServlet");
wrapper.setServlet(servletTest);
standardContext.addChild(wrapper);
standardContext.addServletMappingDecoded("/memwebshell-servlet", "MemWebshellServlet");
Servlet MemWebshell注册思路:
 
1. 获取 standardContext 实例,创建 Servlet 容器;
 
2. 设置待注册 Servlet Name 以及 Servlet 类;
 
3. 注册 Servlet 容器到 standardContext 中;
 
4. 增加 URL 匹配模式与 Servlet 的对应关系。
 
通过分析 ApplicationContext#addServlet 方法的实现,利用上述思路,使用更加精简的代码完成 Servlet MemWebshell 的注册,省去了对容器运行状态的修改。
 
注册 Listener MemWebshell
 
Listener 为 Servlet 的监听器,可以监听客户端的请求、服务端的操作。可以在 application、session、request 对象创建、销毁或者增改删属性事件发生时,自动执行代码的功能组件,同样也可以在其中进行 MemWebshell 的注入。
 
通过实现 ServletRequestListener 接口的 requestInitialized 和 requestDestroyed 方法,在请求创建或者销毁时调用。通过分析 Tomcat ApplicationContext#addListener 方法的 Listener 注册,底层实际调用 StandardContext#addApplicationEventListener 方法将自定义的 Listener 添加到了 applicationEventListenersList 属性中。

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读