freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

蓝军反治系列之打造weblogic的持久化内存马后门
FreeBuf_355817 2021-04-07 09:54:54 293052

最近遇到个挺恼火的事,刚通过某漏洞拿下的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

# web安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 FreeBuf_355817 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
2021攻防演习回顾
FreeBuf_355817 LV.4
这家伙太懒了,还未填写个人描述!
  • 24 文章数
  • 35 关注者
cve-2021-2394 weblogic反序列化漏洞分析
2021-07-26
[域渗透] SQLSERVER 结合中继与委派
2021-06-24
C# dump系统lsass内存和sam注册表
2021-06-22
文章目录