米乐游戏下载:Goby 运用内存马中的一些技能细节

   刊发时间:2023-04-10 07:37:25   来源:乐米体育彩票 作者:米6体育官方网站

  投稿在 Goby 社区的内存马文章现已写了两篇,在第一篇《Shell 中的鬼魂王者 -JAVAWEB 内存马【认知篇】》中介绍了 JavaWeb 内存马技能的前史演化、分类,从认知层面临常见的 JavaWeb 内存马技能进行了介绍;第二篇《用 Goby 通过反序列化缝隙一键打入内存马【运用篇】》中首要介绍了怎么将内存马与缝隙进行开始结合,使 Goby 能够通过反序列化缝隙一键打入内存马,并与 Goby 的 PoC、插件体系交融,运用者只需求害点点就能够完结一键化缝隙的打入。

  本篇作为 Goby 社区内存马文章的第三篇,首要从技能方面介绍一下,在前两篇文章的基础上,在运用 Goby 通过反序列化缝隙一键打入内存马的进程中,所运用的一些技能细节。

  当然,在运用 Goby PoC 进行打入的进程中,运用者无需知道这些细节,可是了解和学习技能有助于把握一些通用的思路。

  本文首要分为三个部分: 前置缝隙的运用 、 内存马的生成 以及 内存马的运用 ,给咱们共享一些 Goby 中相关的技能点和其间的细节或坑,欢迎咱们一同评论。

  这儿简略演示一下相关的技能的一些运用作用,以下视频演示了运用 Goby 通过反序列化一键注入 Filter 型内存马,并通过自界说 URLClassLoader 带着虚伪信息,来逃避安全人员的排查,而且通过铲除日志来到达无痕的意图。

  首要来说下前置缝隙运用部分,之前的文章说到,作为实战化缝隙运用、兵器化开发的视角,咱们更倾向于在缝隙运用进程中,一键化打入内存马,而不是先拿到 JSP webshell 再转为内存马,因而,这儿需求考虑在缝隙运用进程中怎么直接履行内存马的植入动作。

  在现在大多数的缝隙运用中,假如想要履行杂乱的歹意进犯逻辑,一般都是运用新建 URLClassLoader、当时线程的类加载器、自界说类加载器等来进行歹意类字节码的装载及初始化。

  在不同的运用场景下,能够看状况选取不同的类加载器来完成,但也有的时分没办法挑选,需求看状况进行调整:

  新建自界说类加载器,一般是界说一个通过字节码进行类加载的办法,就相当于封装一个 public 的 defineClass 办法;

  在不同状况下,运用不同的 ClassLoader 加载歹意类,将会面临不同的问题:

  运用当时线程的上下文类加载器,或无法控制类加载器时,或许存在同一类名无法加载两次的状况,需求额定处理;

  在运用例如 BCEL ClassLoader 等特别的 ClassLoader 时,因为跨类加载加载的问题,需求通过纯反射对一些类和接口进行拜访和调用,面临比较大的膂力作业。

  在缝隙运用的进程中进行动态类加载时,遍及的状况是需求人为的打破双亲派遣机制,将歹意类注入到体系中。

  与类加载休戚相关的便是类的初始化,通常在歹意代码中,会写一些初始化的歹意逻辑,一般能够写在 static 句子块或 public 无参结构办法中:

  public 无参结构办法在类初始化的时分进行调用,每次新建类实例会调用。

  在 Goby 反序列化打入内存马的插件上线后,我对缝隙库中反序列化缝隙的运用均进行了增强与批改。

  了解 Goby 的朋友或许知道,Goby 关于缝隙运用的检测分为 PoC 与 EXP,在面临 Java 原生反序列化时,本来的检测和运用程序为:

  EXP 运用 YSOSERIAL 的字节码,动态替换指令履行部分的 hex 值,进行指令履行的写入。

  运用上述逻辑缝隙的检出,是大部分人员面临反序列化缝隙的检测办法,技能上这种检测办法并没有问题,可是实践履行中会遇到如下问题:

  1. 因为网络或 DNSLOG 渠道不稳定,或许导致收不到 DNSLOG 的问题,或许 DNSLOG 有较长的延时;

  2. 缝隙运用只是进行指令履行,经常无法得知缝隙运用是否成功,也无法知道缝隙履行的成果;

  3. 在不出网的状况下,无法进行反弹 shell,也无法履行更高档的动作,对实战来说,实用性很差。

  因而,为了处理实战化的可用性问题,在后续更新的缝隙运用 PoC 均采用了回显的技能,将指令履行的成果回来 response 中;而 EXP 中则是直接打入内存马,节省了中心的许多进程。

  src=在结构回显时,则涉及到要害 request 的定位,查找内存等技能点,而内存马的打入,则又需求针对缝隙环境预备高可用的内存马,有了这些技能加持,能够处理上面说到的问题,无需第三方 dnslog、OOB 等,直接进行缝隙的高精准检测与运用。

  缝隙品种有十分多,能供给恣意代码履行的品种也十分多,例如 Java 原生反序列化缝隙、Fastjson/Jackson/XStream 反序列化缝隙、SpEL/Ognl 等表达式注入等。但有许多状况需求额定的运用办法,才干打通缝隙运用的流程,这儿以原生反序列化运用为例,罗列一些运用链的改造,使其直接能够进行内存马的打入。

  src=BeanShell 运用链,尽管 Bsh 支撑悉数 Java 语法及许多松懈写法,可是说到底仍是脚本语言的解析,假如运用了这些写法或脚本中运用了数组等,在反序列化进程中会调用相关完成类的相关办法,或许用到 Interpreter 方针,报空指针,因而仍是能够运用 ScriptEngineManager 解析 JS 的办法履行内存马。

  src=这儿随意举了几个反序列化运用链串联到内存马的技能思路,除此之外还有更多的缝隙运用状况,能够酌情进行 曲线救国 ,考虑到行文的篇幅,这儿就不在赘述更多的思路。

  说过了前置的缝隙运用方向,接下来,讲下在内存马生成进程中涉及到的一些技能细节。

  考虑到不同缝隙运用点,不同的缝隙运用场景和需求,不同人员的习气不平等,在实践环境中,内存马的内容不能是原封不动的,需求根据种种装备进行动态生成。

  因而,这儿运用 javassist 进行内存马歹意类字节码的动态生成与写入。在内存马的预备进程中,将会面临一些的一些需求:

  缝隙运用办法是固定的,例如指令履行、常用的冰蝎、哥斯拉或许自研的 webshell 交互东西,根本都是可复用的自界说缝隙运用办法;

  内存马能够自界说 URL 、自界说暗码,除了常见的 AES 密钥,还能够设置额定的鉴权机制;

  能够随意选用恣意一种内存马技能,运用恣意一种运用办法,均能够快速动态生成。

  因而,我这儿将要害逻辑终究笼统成一个相同的办法,这个办法的前两个参数分别是 Request 和 Response 方针,无论是指令履行、冰蝎、哥斯拉等等,都能够在这个办法下注入自己的逻辑。关于不同的中心件,因为封装和完成和不同,在进入要害逻辑前进行额定的断定以及处理,使终究处理逻辑共同。

  src=在确认了运用的参数后,则能够根据不同的内存马类型、不同的运用办法进行字节码的拼装,将要害办法顺次刺进歹意类,终究构成一个完好的内存马。

  之前说到了在歹意类的动态加载和初始化时,要考虑 ClassLoader 的选取问题,这儿在内存马加载也相同,有关 ClassLoader 的问题需求额定留意。 第一种状况,作为内存马文件本身,一般需求将本身的实例放在处理路由的要害方位中,如大局上下文的某个 Map 成员变量中,这种状况就需求传递一个实例的引证,只需在内存马歹意类初始化时将本身方针的一个实例注册在体系内要害方位即可。 可是也有破例,例如在 Struts2 结构中,要害方位中贮存的不是类实例,而是类名,在处理路由时,假如找到映射,则动态创立类实例并调用其 execute 办法进行处理,因而,在进行歹意内存马的注入时,不该单单进行类名和路由的映射,还应该将内存马本身类加载到要害上下文中,使其在实例化类时能够找到咱们注入的歹意类。 在运用办法上,除了指令履行回显外,内存马的要害逻辑仍旧仍是通过传递类字节码来完成的。涉及到类加载的部分,除了之前说到的 URLClassLoader、自界说 ClassLoader、线程上下文类加载器之外,仍旧能够玩出许多的把戏:

  也能够运用一些封装类,这些封装类或许调用一些不常见的 ClassLoader 等:

  关于内存马运用办法,最常见的三种运用便是,指令履行回显、冰蝎及哥斯拉,三种各有各的优势:

  除了惯例的 Webshell 运用办法,最近比较盛行的便是地道马的打入。进犯人员在获取 Webshell 之后,往往进行的下一步动作将会是运用这个机器作为跳板,进行进一步的内网浸透,此刻就需求一条打通的流量地道。 在曾经的做法通常是在方针服务器上上传一个流量转发东西如 FRP 等,借由这个东西进行流量转发。若在网络层面不是全端口映射,还要牵扯到端口复用等技能。 但有了内存马,则能够直接一键打入地道马,直接运用相应的客户端进行衔接,真实完成 一把梭 。

  由 rebeyond 师傅完成的 AgentNoFile 技能,给咱们供给了无需供给 Agent.jar 或许 Agent.so 来直接调用 JVMTI 接口的才能,凭借这种才能,咱们能够完成无需文件落地进行 Agent 型内存马的注入。

  在内存马的完成上,则是通过向方针环境不落地的注入一个 Javassist 依靠 jar,并动态修正方针要害类,注入歹意逻辑,完成 Agent 马的动态修正,例如下图是完成了一个对 ApplicationFilterChain 的 doFilter 办法进行 Hook 的逻辑,完成冰蝎内存马的注入,并从服务器 dump 出来的 class。

  通过缝隙直打内存马的问题处理了,内存马的生成和运用办法的问题处理了,接下来要处理的问题便是在内存马运用进程中遇到的问题。

  之前的文章中说到,内存马技能的提出首要为了对立落地文件会有安全防护设备发现告警的问题,因而,内存马技能从一诞生,就面临并承担着与各种防护才能进行对立的责任和使命。

  首要面临的是流量侧设备的绕过,这部分实践上是 WebShell 办理端和内存马之间通讯协议的流量特征。因为干流运用 AES 加解密,少部分运用 DES 加解密等,以及在行为方面会有规矩,例如在衔接 WebShell 时会发几个包,根据这两项会有一些检测 webshell 衔接的手法。因而无论是冰蝎仍是哥斯拉,假如没有通过魔改,在流量上的根本特征都会被发现。

  可是根本上咱们都有魔改的习气,因而流量层的特征仍是不容易一致防护的,而且最新的冰蝎客户端现已支撑了自界说的通讯协议加解密程序,这样进犯者能够将冰蝎流量伪装为相似事务数据的流量,如 Restful API 回来数据,或相似 base64 图片资源回来数据等。

  其次是主机层面的绕过,在主机层面,或许面临着一些 EDR 设备等主机层的防护,这部分防护或许会对 Java 进程调用体系资源进行监控,但大多数时分来讲,这一层的防护简直无法辨认 Java 层面的操作是否归于灵敏操作。

  最终是 Java 层面的绕过,在 Java 层面,或许面临一些 RASP 产品的防护,或自研安全规矩的防护。这些防护办法在一些灵敏函数履行的方位进行 Hook ,并根据仓库或行为等办法阻拦可疑行为。

  此刻咱们能够通过反射来进行绕过,无论是通过反射调用更深层次的代码乃至 native 办法,仍是反射获取体系里面临指定办法有封装的方针去履行,意图都是为了打乱仓库或行为调用链条,使 Java 层面的防护无法判别你是歹意操作仍是体系行为,以此来绕过检测逻辑。

  src=在或许运用 unsafe 这样的 API 来进行歹意类的创立,都有或许绕过必定的安全防护:

  src=除了安全防护,内存马再运用上还有一些风趣的方向能够重视,例如能够运用 Websocket 型的内存马以创立长衔接的办法来绕过负载均衡,避免打进去的马找不到的问题。

  在之前的内存马文章也说到过,许多东西现已供给了扫描指定方位来检查是否存在内存马的检测手法,此刻检查会包括一些维度的判别,相同的,咱们需求再这些维度进步行进行必定的处理,来进行防检测,例如:

  1. 歹意类名、包名的检测:关于一些防护手法,会制止一些已知的歹意包名、类名的加载,因而这儿通过动态拼接和生成歹意类包名的办法来利诱防护体系或办理员。

  src=2. 从 ClassLoader 里检查文件是否落地的检测:能够通过自界说 ClassLoader 带着虚伪信息或运用体系类加载器加载歹意类的办法使歹意类的类加载器为空来绕过检测逻辑。

  src=3. 体系要害方位的检测:有些检测东西能够获取要害方位的信息,并辅佐人工排查,例如部分东西获取体系内悉数 Filter 型内存马,并进行展现。此刻能够通过发掘十分规内存马的办法来进行躲避,在之前我共享的关于 JavaWeb 内存马的 PPT 上层说到过,在 web 恳求处理进程中,悉数运用责任链规划方法的组件,都能用来作为内存马的发掘运用方向,因而在各个 web 中心件中,再发掘一种新的内存马也并非难事。

  src=4. 许多东西会供给 dump class 的功用,通过将内存中的类字节码 dump 出来进行排查,因而能够通过修正 Java 类在 JVM 中的存在方法 InstanceKlass 数据结构中的相关信息的缓存,如 _cached_class_file 等,来使 dump 出来的 class 是不包括风险代码的类,进行诈骗和躲藏的意图。

  5. 一些 RASP 还会运用 redefineClasses 将歹意类、歹意函数的要害办法内容置为空,来到达在运转的体系中铲除内存马的意图,此刻能够通过修正歹意类的函数修饰符、新增成员变量、办法等办法来使其报错,因为 redefineClasses 不允许类结构和签名的改动。

  6. 现在大多数的内存马查杀、防护手法,是通过 Java Agent 技能来完成的,因而避免新的 Agent 注入,也是防检测的要点思路,在第一篇中也说到过,能够通过删去 java pid 文件来阻挠 JVM 进程通讯,也能够通过阻挠后续的 ClassFileTransformer 加载的办法阻挠其他 Java Agent 加载来避免检测。

  首要内存马现已到达了文件不落地的状况,还能不能做什么再次藏匿自己呢?答案是必定的。

  那便是中心件拜访日志的铲除,在进行拜访恳求时,中心件会记载日志,这个日志通常会作为后续检查、应急的根据,假如在内存马拜访时,能铲除拜访日志,岂不是做到无痕阅读?

  有了思路,履行也很简略,那便是找到中心件中担任记载日志的组件,将其清空,以 Tomcat 为例。

  最终一个问题便是耐久化的问题,需求考虑在服务重启乃至操作体系重启后能否从头康复内存马的注入:

  若方针环境面临或许被 kill -9 的操作,能够发动一个 看护进程 重视服务器上的 Java 进程;

  关于操作体系的重启,能够提早将要害歹意操作注册成为守时使命等办法进行耐久化。

  因为这部分的动作是作为内存马技能的延伸,而且为了到达耐久化的意图或许会有 Jar 包、资源文件的篡改和落地,有点违反运用内存马的初衷,所以这部分不再展开评论,等待更高雅的思路。

  以上部分简略罗列了一些实战运用内存马技能中所运用的一些技能问题和遇到的一些坑的处理方案,在通过对以上技能的研讨和处理后,在实战上快速运用内存马根本上就没有什么问题了。

  尽管咱们评论的是 JavaWeb 内存马技能,但实践能够看到,对立的思路和技能早现已不单单在 Java 层,而是延伸到了 native 层、内存层面。这仍然是实战化运用中的沧海一粟。在实践环境的运用中,因为操作体系不同、中心件版别不同、JDK 发行版、版别不平等等差异状况、安全约束、安全防护等等杂乱的状况,还会遇到种种难题,因而,多研讨,多调试,堆集思路,才干在实战化的运用中高效、快速运用内存马。

  面临内存马技能,表面上是技能与技能的对立,实践上仍是人与人的对立,思路与思路的对立,我在这儿抛砖引玉,希望能激起更多奇妙的思路,欢迎咱们评论。

 

版权所有: 米乐游戏下载_乐米体育彩票_米6官方网站 

京ICP备05050114号      400-160-1670