如何控制开放HTTPS服务的weblogic服务器

标签: web安全 | 发表时间:2016-03-17 15:46 | 作者:z_zz_zzz
出处:http://drops.wooyun.org

0x00 前言


目前在公开途径还没有看到利用JAVA反序列化漏洞控制开放HTTPS服务的weblogic服务器的方法,已公布的利用工具都只能控制开放HTTP服务的weblogic服务器。我们来分析一下如何利用JAVA反序列化漏洞控制开放HTTPS服务的weblogic服务器,以及相应的防护方法。

建议先参考 修复weblogic的JAVA反序列化漏洞的多种方法中关于weblogic的JAVA反序列化漏洞的分析。

0x01 HTTPS服务的架构分析


如果某服务器需要对公网用户提供HTTPS服务,可以在不同的层次实现。

使用SSL网关提供HTTPS服务

当使用SSL网关提供HTTPS服务时,网络架构如下图所示(无关的设备已省略,下同)。

SSL网关只会向后转发HTTP协议的数据,不会将T3协议数据转发至weblogic服务器,因此在该场景中,无法通过公网利用weblogic的JAVA反序列化漏洞。

使用负载均衡提供HTTPS服务

当使用负载均衡提供HTTPS服务时,网络架构如下图所示。

安全起见,负载均衡应选择转发HTTP协议而不是TCP协议,因此在该场景中,也无法通过公网利用weblogic的JAVA反序列化漏洞。

使用web代理提供HTTPS服务

当使用web代理(如apache、nginx等)提供HTTPS服务时,网络架构如下图所示。

web代理只会向后转发HTTP协议的数据,因此在该场景中,也无法通过公网利用weblogic的JAVA反序列化漏洞。

使用weblogic提供HTTPS服务

当使用weblogic提供HTTPS服务时,网络架构如下图所示。

weblogic能够接收到利用SSL加密后的T3协议数据,因此在该场景中,通过公网能够利用weblogic的JAVA反序列化漏洞。

根据上述分析,仅当HTTPS服务由weblogic提供时,才能够利用其JAVA反序列化漏洞。

0x02 weblogic开放SSL服务时的T3协议格式分析


利用weblogic的JAVA反序列化漏洞时,必须向weblogic发送T3协议头。为了能够利用提供SSL服务的weblogic的JAVA反序列化漏洞,需要首先分析当weblogic提供SSL服务时的T3协议格式。

SSL数据包为加密的形式,无法直接进行分析,需要进行解密。当已知SSL私钥时,可以利用Wireshark对SSL通信数据进行解密。

weblogic可以使用演示SSL证书提供SSL服务,也可以使用指定SSL证书提供SSL服务。

可以使用两种方法进行分析,一是使用weblogic提供的演示SSL证书进行分析,二是使用自己生成的SSL证书进行分析。

使用weblogic演示证书进行分析(方法一)

使用weblogic演示证书开放SSL服务

登录weblogic控制台,将AdminServer的“启用SSL监听端口”钩选,并填入SSL监听端口号。

查看AdminServer的密钥库配置,确认为“演示标识和演示信任”(Demo Identity and Demo Trust),可以看到演示密钥库的文件名为“DemoIdentity.jks”,演示信任密钥库文件名为“DemoTrust.jks”。

查看AdminServer的SSL配置,可以看到演示密钥库的私钥别名为“DemoIdentity”。

使用HTTPS方式登录weblogic控制台,确认可以正常登录。

生成weblogic演示证书的私钥文件

以下为weblogic演示密钥库的密码信息。

Property Value
Trust store location DemoTrust.jks文件,可在控制台查看
Trust store password DemoTrustKeyStorePassPhrase
Key store location DemoIdentity.jks文件,可在控制台查看
Key store password DemoIdentityKeyStorePassPhrase
Private key password DemoIdentityPassPhrase
Private Key Alias DemoIdentity,可在控制台查看

使用以下命令生成weblogic演示密钥库的私钥文件。

set keystore=DemoIdentity.jks
set tmp_p12=tmp.p12

set storepass=DemoIdentityKeyStorePassPhrase
set keypass=DemoIdentityPassPhrase
set alias=DemoIdentity
set pwd_new=123456

keytool -importkeystore -srckeystore %keystore% -destkeystore %tmp_p12% -srcstoretype JKS -deststoretype PKCS12 -srcstorepass %storepass% -deststorepass %pwd_new% -srcalias %alias% -destalias %alias% -srckeypass %keypass% -destkeypass %pwd_new%

set out_pem=tmp.rsa.pem
set final_pem=final.key

openssl pkcs12 -in %tmp_p12% -nodes -out %out_pem% -passin pass:%pwd_new%
openssl rsa -in %out_pem% -check > %final_pem% 

最终生成的final.key即为weblogic演示密钥库的私钥文件。final.key的密钥格式为

  -----BEGIN RSA PRIVATE KEY-----  
......  
-----END RSA PRIVATE KEY-----  

修改weblogic停止脚本

需要修改weblogic的停止脚本“stopWebLogic.xx”,将ADMIN_URL字段的“t3”改为“t3s”,并在java调用weblogic.WLST类的JVM启动参数中加入“-Dweblogic.security.TrustKeyStore=DemoTrust”,使weblogic在调用停止脚本时使用演示证书,否则会出现证书不被信任的错误。

使用自定义证书进行分析(方法二)

生成自定义密钥库

使用以下命令生成自定义密钥库。

set keystore=keystore.jks
set alias=server
set pwd=123456
set url=url-test
set validity=7300

keytool -genkey -alias %alias% -keyalg RSA -keysize 2048 -keystore %keystore% -storetype jks -storepass %pwd% -keypass %pwd% -dname "CN=%url%, OU=companyName, O=companyName, L=cityName, ST=provinceName, C=CN" -validity %validity%

生成的密钥库名称为keystore.jks,密钥库密码与私钥密码均为“123456”。

使weblogic使用指定的密钥库

将上述步骤生成的密钥库文件keystore.jks复制到weblogic的domain目录中。

登录weblogic控制台,在AdminServer的密钥库界面,选择密钥库类型为“定制标识和 Java 标准信任”(Custom Identity and Java Standard Trust),定制标识密钥库输入“keystore.jks”,定制标识密钥库类型输入“JKS”,定制标识密钥库密码短语与确认定制标识密钥库密码短语输入“123456”,保存上述修改。

在AdminServer的SSL界面,私有密钥别名输入“server”,私有密钥密码短语与确认私有密钥密码短语输入“123456”。

使用HTTPS对应的URL打开weblogic控制台,确保可以正常登录,查看证书信息如下。

将自定义证书导入java信任密钥库中

在上一步骤中可以看到Java标准信任密钥库对应的文件为weblogic的JDK目录中的“jdk\jre\lib\security\cacerts”文件,密钥类型也是JKS。

当weblogic作为SSL客户端连接服务器时,会检查服务器的证书链是否与weblogic的JDK目录中的cacerts文件匹配。

需要将自定义证书的公钥导入weblogic的JDK目录中的cacerts文件中,否则在调用weblogic停止脚本时,会由于证书不受信任而失败。

使用以下命令导出自定义证书的公钥。

set keystore=keystore.jks
set alias=server
set pwd=123456
set exportcert=export.cer

keytool -export -alias %alias% -keystore %keystore% -file %exportcert% -storepass %pwd%

导出的公钥文件为export.cert。

使用以下命令将公钥导入weblogic的JDK目录的cacerts文件中,在导入前需要备份cacerts。cacerts密钥库的默认密码为changeit,可进行修改。

set keystore=cacerts
set alias=server
set pwd=changeit
set cert=export.cer

keytool -import -alias %alias% -keystore %keystore% -trustcacerts -storepass %pwd% -file %cert%

生成自定义证书的私钥文件

使用以下命令生成自定义证书的私钥文件。

set keystore=keystore.jks
set tmp_p12=tmp.p12

set storepass=123456
set keypass=123456
set alias=server
set pwd_new=123456

keytool -importkeystore -srckeystore %keystore% -destkeystore %tmp_p12% -srcstoretype JKS -deststoretype PKCS12 -srcstorepass %storepass% -deststorepass %pwd_new% -srcalias %alias% -destalias %alias% -srckeypass %keypass% -destkeypass %pwd_new% 

set out_pem=tmp.rsa.pem
set final_pem=final.key

openssl pkcs12 -in %tmp_p12% -nodes -out %out_pem% -passin pass:%pwd_new%
openssl rsa -in %out_pem% -check > %final_pem% 

最终生成的final.key即为自定义证书的私钥文件。

修改weblogic停止脚本

需要修改weblogic的停止脚本“stopWebLogic.xx”,将 ADMIN_URL字段的“ t3”改为“ t3s”,并在java调用weblogic.WLST类的JVM启动参数中加入“ -Dweblogic.security.TrustKeyStore=DemoTrust”。

除了以上修改外,还需在停止脚本的JVM启动参数中加入“ -Dweblogic.security.SSL.ignoreHostnameVerification=true”,避免因自定义证书中的地址与停止脚本实际访问的ssl服务的地址不一致而出现错误。

调用weblogic停止脚本并抓包

前文中已将weblogic的停止脚本“stopWebLogic.xx”中的访问链接改为t3s协议,会使用SSL协议进行通信。

需要调用weblogic的停止脚本并进行抓包。由于停止脚本会与同一台机器的weblogic通信,在Linux环境中抓包较为方便,需要使用tcpdump对Loopback对应的网卡进行抓包。

使用Wireshark解密SSL通信数据

前文已生成了weblogic的私钥文件,并对weblogic停止脚本调用过程进行了抓包,可以使用Wireshark解密对应的SSL通信数据。

首先在Wireshark中设置需要使用的私钥文件,打开Wireshark菜单的“Edit->Preferences”,打开“Protocols->SSL”,点击“RSA keys list”旁的“Edit”按钮,如下图。

添加一行配置,IP为weblogic服务器的IP,Port为weblogic的SSL监听端口,Protocol为tcp,Key File为之前已生成的weblogic的SSL证书的私钥文件。

使用Wireshark打开抓包文件,可以看到原本为加密形式的通信数据有部分已被解密,找到T3协议头相关数据,可以看到停止脚本向weblogic发送的T3协议头以“t3s”开头。

服务器返回的数据如下。

费了老大的劲,才发现原来 weblogic开放HTTPS服务后,t3协议头的前几个字节由“t3”变成了“t3s”

以上步骤在Linux环境的weblogic 10.3.4测试成功。

JAVA反序列化漏洞调用过程

当weblogic开放HTTPS服务时,JAVA反序列化漏洞的调用过程如下。

at org.apache.commons.collections.functors.InvokerTransformer.transform(InvokerTransformer.java:132)  
at org.apache.commons.collections.functors.ChainedTransformer.transform(ChainedTransformer.java:122)  
at org.apache.commons.collections.map.TransformedMap.checkSetValue(TransformedMap.java:203)  
at org.apache.commons.collections.map.AbstractInputCheckedMapDecorator$MapEntry.setValue(AbstractInputCheckedMapDecorator.java:191)  
at sun.reflect.annotation.AnnotationInvocationHandler.readObject(AnnotationInvocationHandler.java:334)  
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
at java.lang.reflect.Method.invoke(Method.java:597)  
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)  
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)  
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)  
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)  
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)  
at weblogic.rjvm.InboundMsgAbbrev.readObject(InboundMsgAbbrev.java:65)  
at weblogic.rjvm.InboundMsgAbbrev.read(InboundMsgAbbrev.java:37)  
at weblogic.rjvm.MsgAbbrevJVMConnection.readMsgAbbrevs(MsgAbbrevJVMConnection.java:283)  
at weblogic.rjvm.MsgAbbrevInputStream.init(MsgAbbrevInputStream.java:210)  
at weblogic.rjvm.MsgAbbrevJVMConnection.dispatch(MsgAbbrevJVMConnection.java:498)  
at weblogic.rjvm.t3.MuxableSocketT3.dispatch(MuxableSocketT3.java:330)  
at weblogic.socket.BaseAbstractMuxableSocket.dispatch(BaseAbstractMuxableSocket.java:298)  
at weblogic.socket.SSLFilterImpl.dispatch(SSLFilterImpl.java:258)  
at weblogic.socket.SocketMuxer.readReadySocketOnce(SocketMuxer.java:950)  
at weblogic.socket.SocketMuxer.readReadySocket(SocketMuxer.java:898)  
at weblogic.socket.PosixSocketMuxer.processSockets(PosixSocketMuxer.java:130)  
at weblogic.socket.SocketReaderRequest.run(SocketReaderRequest.java:29)  
at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:42)  
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:145)  
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:117)

0x03 如何控制开放HTTPS服务的weblogic服务器


如何发送T3协议数据

利用weblogic的JAVA反序列化漏洞时,必须向weblogic发送T3协议头。 当weblogic开放HTTPS服务时,向其发送的T3协议头应以“t3s”开头。向weblogic发送数据时应使用SSL协议,且不应对服务器的证书进行验证。

无论weblogic开放HTTP服务还是HTTPS服务,在向weblogic发送利用JAVA反序列化漏洞的序列化数据时,数据内容不需要改变。

如何调用weblogic的RMI服务

可以利用weblogic的JAVA反序列化数据使weblogic在服务器生成指定的jar文件并加载,在jar文件中开启weblogic的RMI服务,可以从公网直接调用,能够控制服务器。

当weblogic开放HTTPS服务时,调用weblogic的RMI服务时有几点需要进行修改。

  1. 在调用weblogic的RMI服务时,使用的URL应改为以“t3s”开头;
  2. 在调用weblogic的RMI服务时,客户端需要引入weblogic.jar。使用t3s协议时,weblobic.jar会尝试从当前目录读取weblogic授权文件license.bea,需要保证weblogic.jar能正确地读取该文件;
  3. weblogic.jar中会对服务器证书进行验证,判断其是否为可信证书。由于可能遇到服务器的证书未经过CA认证,因此需要修改证书验证的相关代码,忽略证书未经认证的问题;
  4. JVM启动参数需要增加“ -Dweblogic.security.SSL.ignoreHostnameVerification=true”,避免因自定义证书中的地址与停止脚本实际访问的ssl服务的地址不一致而出现错误。

0x04 可行的漏洞修复方法

将SSL服务转移至其他设备

将SSL服务转移至weblogic服务器外层的设备实现,如SSL网关、负载均衡、单独部署的web代理等,将HTTP请求转发至weblogic,可以修复JAVA反序列化漏洞。

优点 缺点
对系统影响小,不需测试对现有系统功能的影响 需要对SSL证书进行格式转换;需要购买设备;无法防护从内网发起的JAVA反序列化漏洞攻击

将SSL服务转移至weblogic服务器的web代理

在weblogic所在服务器安装web代理应用,如apache、nginx等,将SSL服务转移至web代理应用,使web代理监听原有的weblogic监听端口,并将HTTP请求转发给本机的weblogic,可以修复JAVA反序列化漏洞。

优点 缺点
对系统影响小,不需测试对现有系统功能的影响;不需要购买设备 需要对SSL证书进行格式转换;无法防护从内网发起的JAVA反序列化漏洞攻击;会增加服务器的性能开销

将SSL服务转移至weblogic服务器的web代理并修改weblogic的监听IP

将weblogic的监听地址修改为“127.0.0.1”或“localhost”,只允许本机访问weblogic服务。

在weblogic所在服务器安装web代理应用,如apache、nginx等,将SSL服务转移至web代理应用,使web代理监听原有的weblogic监听端口,并将HTTP请求转发给本机的weblogic,可以修复JAVA反序列化漏洞。web代理的监听IP需设置为“0.0.0.0”,否则其他服务器无法访问。

需要将weblogic停止脚本中的ADMIN_URL参数中的IP修改为“127.0.0.1”或“localhost”,否则停止脚本将不可用。

优点 缺点
对系统影响小,不需测试对现有系统功能的影响;不需要购买设备;能够防护从内网发起的JAVA反序列化漏洞攻击 需要对SSL证书进行格式转换;会增加服务器的性能开销

修改weblogic的代码

weblogic处理T3S协议的类为“weblogic.rjvm.t3.MuxableSocketT3S”,继承自“weblogic.rjvm.t3.MuxableSocketT3”类,且MuxableSocketT3S类中没有对dispatch方法进行重写,因此可以采用与 修复weblogic的JAVA反序列化漏洞的多种方法中“修改weblogic的代码”部分相同的修复方法。具体步骤略。

优点 缺点
不需要对SSL证书进行格式转换;对系统影响小,不需测试对现有系统功能的影响;不需要购买设备;能够防护从内网发起的JAVA反序列化漏洞攻击;不会增加服务器的性能开销 存在商业风险,可能给oracle的维保带来影响

0x05 结束


无论weblogic服务器开放HTTP服务还是HTTPS服务,都是有可能利用JAVA反序列化漏洞控制服务器的。JAVA反序列化漏洞的影响,应该会持续很长的时间。

相关 [控制 开放 https] 推荐:

如何控制开放HTTPS服务的weblogic服务器

- - WooYun知识库
目前在公开途径还没有看到利用JAVA反序列化漏洞控制开放HTTPS服务的weblogic服务器的方法,已公布的利用工具都只能控制开放HTTP服务的weblogic服务器. 我们来分析一下如何利用JAVA反序列化漏洞控制开放HTTPS服务的weblogic服务器,以及相应的防护方法. 建议先参考 修复weblogic的JAVA反序列化漏洞的多种方法中关于weblogic的JAVA反序列化漏洞的分析.

https协议

- - 互联网 - ITeye博客
SSL 协议的握手过程   .       为了便于更好的认识和理解 SSL 协议,这里着重介绍 SSL 协议的握手协议. SSL 协议既用到了公钥加密技术(非对称加密)又用到了对称加密技术,SSL对传输内容的加密是采用的对称加密,然后对对称加密的密钥使用公钥进行非对称加密. 这样做的好处是,对称加密技术比公钥加密技术的速度快,可用来加密较大的传输内容,公钥加密技术相对较慢,提供了更好的身份认证技术,可用来加密对称加密过程使用的密钥.

Go和HTTPS

- - Tony Bai
近期在构思一个产品,考虑到安全性的原因,可能需要使用到 HTTPS协议以及双向数字证书校验. 之前只是粗浅接触过HTTP( 使用Golang开 发微信系列). 对HTTPS的了解则始于那次 自行搭建ngrok服务,在那个过程中照猫画虎地为服务端生成了一些私钥和证书,虽然结果是好 的:ngrok服务成功搭建起来了,但对HTTPS、数字证书等的基本原理并未求甚解.

Google https被屏蔽

- - 月光博客
  根据Google透明度报告 显示,从上周(5月27日)开始,Google的部分服务开始被屏蔽,其中最主要的是HTTPS搜索服务和Google登录服务,所有版本的Google都受到影响,包括Google.hk和Google.com等.   此次屏蔽的方法主要屏蔽Google部分IP地址的443端口,包括google.com.hk,accounts.google.com的部分IP的443端口被封,导致部分中国用户无法访问Google搜索和Gmail,由于Google的IP地址非常多,而被屏蔽的只是其中部分IP,因此只有部分用户受到了影响.

HTTPS的二三事

- - 细语呢喃
前几篇博文都是有关HTTPS的东西,有人可能会问,什么是HTTPS. 因此,本文主要来解答这些疑惑. Alice和Bob是情人,他们每周都要写信. Alice 写好后,送到邮局,邮局通过若干个快递员到Bob,Bob回信过程类似. 这是可以看成的简单的http的传输. 有一天,Alice觉得,要是写的信中途被人拆开了呢.

HTTPS劫持研究

- - FreeBuf互联网安全新媒体平台
这篇文章描述了我们对哈萨克斯坦政府实施的电信级HTTPS劫持的分析. 哈萨克斯坦政府最近开始使用一个假的根证书颁发机构,对包括Facebook,Twitter和Google等网站在内的HTTPS连接进行中间人(MitM)攻击,在此文中,我们给出了还在进行中的研究的初步结果,以及哈萨克劫持系统中新的技术细节.

手机抓包HTTPS

- -
之前也介绍过 Charles 抓包神器,详细可以看这篇文章: 抓包神器. 这个神器主要是解决在开发过程中快速定位异常,到底是界面展示 Bug 还是接口数据异常. 这样借助这个神器,基本上在开发过程中就能解决很多问题了. 学会手机抓包也能解决开发中很多问题,不仅如此,还能解锁去广告、白嫖 VIP 等骚操作.

最新网址 https://72.52.124.208

- chanjw - 电驴下载基地
精彩世界 cmule.com 我们传递.

最新网址 https://72.52.124.209

- Asker - 电驴下载基地
精彩世界 cmule.com 我们传递.

Google升级HTTPS加密

- 请叫我火矞弟 - Solidot
民不拜天又不拜孔子留此膝何为 写道 "Google 修改了启用HTTPS服务的加密方法,以应对未来技术发展后可能造成的解密行为. 这项升级适用于Gmail、Docs和Google+. 现在的HTTPS实现借助于只有域名主人所掌握的私钥生成的session key来加密服务器和客户端之间的流量. 这种方法使得连接可能被所谓“追溯式解密攻击”(retrospective decryption attack)破解.