蓝军反治系列之打造weblogic的持久化内存马后门 – 作者:宽字节安全实验室

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

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

看完各大安全厂商发布的蓝队锦囊就感觉挺扯淡,攻防本质在于人对于底层的理解,而不是随便写点东西

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

1. startUpClass

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

在我测试后发现,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);
}
}
}
returnlist;

1.2 注册内存马

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

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

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

image-20210402154333144image-20210402154333144image-20210402154350734image-20210402154350734

2. 如何添加修改startUpClass?

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

image-20210402154719355image-20210402154719355

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

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

image-20210402154842674image-20210402154842674

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

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

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

image-20210402155629393image-20210402155629393

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

3. 查杀

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

4. 效果

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

image-20210402160118153image-20210402160118153

工具在这里我就不放了,有兴趣的同学加入我们团队的知识星球来获取工具的下载

我正在「宽字节安全」和朋友们讨论有趣的话题,你⼀起来吧? https://t.zsxq.com/qJe2JEi

来源:freebuf.com 2021-04-07 09:54:54 by: 宽字节安全实验室

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论