转载

Weblogic t3 协议回显穿透 nat 以及获取内网地址

作者:宽字节安全

本文为作者投稿,Seebug Paper 期待你的分享,凡经采用即有礼品相送!

投稿邮箱:paper@seebug.org

简介

环境:Weblogic 12.1.3

实战中,大多数weblogic都部署在内网环境中,通过Nat协议使处于外网的用户访问。对于正常用户访问来说没有问题,对于攻击者使用T3协议回显或者攻击,则会出现很大问题,会提示如下

Weblogic t3 协议回显穿透 nat 以及获取内网地址

对于该问题,网上的解释如下 Weblogic t3 协议回显穿透 nat 以及获取内网地址

解决方案是启动weblogic时,添加一个参数 -Dweblogic.rjvm.enableprotocolswitch=true 。但是我们不可能奢求被攻击者开启这个参数,所以我们就需要通过其他方式去解决这个问题。 下图错误堆栈 Weblogic t3 协议回显穿透 nat 以及获取内网地址

我们可以看出,需要想办法修改t3发送的内容,将其中的公网地址和端口换为weblogic内网地址与端口。由此,延申出两个问题

  1. 如何修改发送内容
  2. 如何根据weblogic的公网地址与端口,得到weblogic的内网地址与端口

1. 如何修改发送的协议内容

还是上图,在 WLInitialContextFactoryDelegate 中,调用 var10.FindOrCreateRJVM 。最终会调用 weblogic.rjvm.ConnectionManager.bootstrap ,根据提供的公网url与port去创建一个JVMID。如图:

Weblogic t3 协议回显穿透 nat 以及获取内网地址

随后会调用 weblogic.rjvm.ConnectionManager.findOrCreateConnection 。 这里与发包的函数主要如下:

Weblogic t3 协议回显穿透 nat 以及获取内网地址

首先根据连接字符串,向待连接的 weblogic 服务器发送t3握手报文,返回一个 MsgAbbrevJVMConnection 类。

Weblogic t3 协议回显穿透 nat 以及获取内网地址

随后调用 this.createIdentifyMsg 去生成t3协议报文,然后调用 MsgAbbrevJVMConnection.sendMsg 将协议内容通过t3协议发送给weblogic服务器。 weblogic.rjvm.ConnectionManager.createIdentifyMsg 的函数如下图

Weblogic t3 协议回显穿透 nat 以及获取内网地址

Weblogic t3 协议回显穿透 nat 以及获取内网地址

我们从这里可以看出,会将 JVMID var1 的值,作为t3协议的header。

我们继续回到 ConnectionManager 函数中,然后调用 MsgAbbrevJVMConnection.sendMsg 函数,最终发送断点截图如下

Weblogic t3 协议回显穿透 nat 以及获取内网地址

所以,如果想解决T3穿透nat,我们只需要魔改 JVMIDhostAddres s与 dnsName 以及一切与地址有关的东西,还有ports的值即可完成Nat内网穿透的任务。 最简单的办法,魔改JVMID即可。我们可以本地创建一个 JVMID ,修改里面的逻辑。

如图所示

Weblogic t3 协议回显穿透 nat 以及获取内网地址

修改之后,重新执行一下,完美执行命令

Weblogic t3 协议回显穿透 nat 以及获取内网地址

2. 获取weblogic内网地址与端口

这里我们需要回顾iiop协议穿透内网的知识。iiop在创建context的时候,会根据服务端返回的内网地址与端口,创建context。随后通过context与weblogic交互时,会直接连接context中的内网地址。

Weblogic t3 协议回显穿透 nat 以及获取内网地址

在途中我们可以很明显的看出,iiop协议会直接连接内网IP与端口,所以会爆出timeout错误。

在这里,我们可以通过iiop创建与服务器的连接,然后获取其中的内网ip与port,如图

Weblogic t3 协议回显穿透 nat 以及获取内网地址

自动获取weblogic内网地址与端口的任务至此成功完成

Weblogic t3 协议回显穿透 nat 以及获取内网地址

原文  https://paper.seebug.org/1180/
正文到此结束
Loading...