• 注册
  • 威胁情报 威胁情报 关注:45 内容:46

    蓝军反治系列之打造weblogic的持久化内存马后门

  • 查看作者
  • 打赏作者
    • 威胁情报
    • 最近遇到个挺恼火的事,刚通过某漏洞拿下的weblogic服务器被应急响应的小同学给下线了。于是最近在思考,怎么才能更好地去隐藏我们的内存马,让应急响应的小同学无法查杀。为什么不用javaagent?第一,麻烦,适配难度高。第二,很容易被应急响应查杀,只需要看一下jvm的启动参数即可知道是否存在javaagent的后门。

      为啥公开了,因为我手里还有很多种方案的,包括tomcat,weblogic等等,发出来大家一起学习。大家努力,让应急响应的小同学今年全翻车。

      看完各大安全厂商发布的蓝队锦囊就感觉挺扯淡,攻防本质在于人对于底层的理解,而不是夸夸其谈。

      至于怎么查杀,琢磨琢磨,捉摸不透的话私信

      1. startUpClass

      简单来讲,就是weblogic在启动后,加载webapp之前,会根据你指定的startUpClass参数,去执行你指定的类。jar包位置只要在classpath中即可。当然,不懂的同学,可以去youtube上看一下印度老哥的一篇介绍,咖喱味口语还是很好玩的。 链接

      在我测试后发现,weblogic在执行到我们的startUpClass的时候,各种runtime已经建立好了。也就是说,我们完全可以在startUpClass中植入基于filter的内存马,做到持久化方案。

      所以,本小节的重点在于:

      1. 怎么找到所有context
      2. 怎么植入内存马

      1.1 找到所有context

      参考上一篇文章,在这里我就发一下代码了

      java.lang.reflect.Method m = Class.forName("weblogic.t3.srvr.ServerRuntime").getDeclaredMethod("theOne");
              m.setAccessible(true);
              ServerRuntime serverRuntime = (ServerRuntime) m.invoke(null);
              List<WebAppServletContext> list = new java.util.ArrayList();
              for (weblogic.management.runtime.ApplicationRuntimeMBean applicationRuntime : serverRuntime.getApplicationRuntimes()) {
                  java.lang.reflect.Field childrenF = applicationRuntime.getClass().getSuperclass().getDeclaredField("children");
                  childrenF.setAccessible(true);
                  java.util.HashSet set = (java.util.HashSet) childrenF.get(applicationRuntime);
                  for (Object key : set) {
                      if (key.getClass().getName().equals("weblogic.servlet.internal.WebAppRuntimeMBeanImpl")) {

                          Field contextF = key.getClass().getDeclaredField("context");
                          contextF.setAccessible(true);
                          WebAppServletContext context = (WebAppServletContext) contextF.get(key);
                          list.add(context);
                      }
                  }
              }
              return list;

      1.2 注册内存马

      在这里我是用另外一种方法,通过javaassist去组装一个内存马的filter类。为什么使用javaassist,主要基于以下几点考虑

      1. 相对于javaasm,javaassist简单易懂容易学习,编写的代码可读性非常高
      2. 相对于通过classloader直接加载类,javaasist可以做到可读性十分好,后期修改方便

      javaassist组装类的代码如下,组装完成后,调用context.registerFilter将我们的内存马注入到相应的web应用中。

      蓝军反治系列之打造weblogic的持久化内存马后门

      蓝军反治系列之打造weblogic的持久化内存马后门

      2. 如何添加修改startUpClass?

      这个功能原本在console控制台中,需要登陆才可以操作。但是既然我们已经有了weblogic服务器的权限,我们怎么可以跳过登录,直接操作修改某些参数呢?

      蓝军反治系列之打造weblogic的持久化内存马后门

      我们来大致跟踪一下这块代码,在这里我以weblogic 12.2.1.4 为例

      这一块的处理逻辑在com.bea.console.actions.core.classes.createclassdeployment.CreateClassDeployment#finish

      蓝军反治系列之打造weblogic的持久化内存马后门

      获取DomainBean,然后操作就可以了。但是,如果你根据图中函数的流程获取domainBean,你大概率是无法操作的。原因有以下几点

      1. 获取到的domainBean是动态代理的,很多方法都不支持调用
      2. 不允许直接调用createStartupClass,提示无权限

      又回到上面那段万能的获取context的源码了,稍微改造一下,即可获取未经动态代理的domainBean,让我们间接实现某些console控制台功能。再也不担心管理员删除console后无法操作某些功能了。这块代码大家用心去体会

      蓝军反治系列之打造weblogic的持久化内存马后门

      然后我们模拟创建startUpClass的流程,即可完成通过代码创建的工作。

      3. 查杀

      这玩意肯定是将某些配置写入到配置文件了,自己琢磨一下,毕竟是蓝军反治。

      4. 效果

      在这里我向所有的web应用都注入内存马了,防止失连掉线。效果如图

      蓝军反治系列之打造weblogic的持久化内存马后门

      本帖转自宽字节安全公众号,如有侵权请私聊删文

      请登录之后再进行评论

      登录
    • 发表内容
    • 做任务
    • 实时动态
    • 偏好设置
    • 帖子间隔 侧栏位置: