严峻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站长网) |
相关内容
网友评论
推荐文章
热点阅读