复盘Weblogic ssrf(cve-2014-4210)漏洞挖掘过程

华为星云防护实验室 发表于 2019/01/10 11:36:39 2019/01/10
【摘要】 本文通过扫描weblogic服务器,分析weblogic日志信息,逆向weblogic java二进制类,java源码分析等步骤,重现了weblogic ssrf类漏洞的发现过程。根据漏洞复现过程,总结了weblogic类漏洞挖掘的一般思路。

作者:杨应军 星云安全防护实验室(Cloud BU)

本文通过扫描weblogic服务器,分析weblogic日志信息,逆向weblogic java二进制类,java源码分析等步骤,重现了weblogic ssrf类漏洞的发现过程。根据漏洞复现过程,总结了weblogic类漏洞挖掘的一般思路。

1. 建立weblogic漏洞研究环境

使用vulhub漏洞环境(git clone https://github.com/vulhub/vulhub.git下载漏洞的docker环境,操作系统使用ubuntu14.04

进入vulhub/weblogic/CVE-2017-10271,运行如下命令:

docker-compose up > 日志文件名 (将weblogic控制台产生的日志保存到日志文件)

weblogic server启动完毕,如下图:

weblogic_ssrf_1.jpg

Weblogic日志信息会自动写入日志文件。

2. 访问weblogic uudiexplorer 

手动或工具扫描:http://IP:7001/uddiexplorer/

当访问url:

http://IP:7001/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=输入数据产生日志中会出现类似信息(信息作用后续细说)

weblogic_ssrf_2.jpg

3.  逆向weblogic jar包文件

然后将wls10.3.6_generic.jar文件解压到wls10.3.6_generic目录,启动iotsploit框架进行wls10.3.6_generic文件夹内所有class文件进行自动逆向成java源码。框架中java_jar_dec插件会递归解压目录中jar包和war包,并递归逆向所有class文件成java文件。逆向文件以后用于源码分析。

weblogic_ssrf_3.jpg

weblogic_ssrf_4.jpg

4.  审查日志文件及静态代码分析结果发现ssrf漏洞

我们根据日志文件,发现程序运行异常点:

weblogic_ssrf_5.jpg

这说明在SearchPublicRegistries.jsp中与www-3.ibm.com值相关的参数触发了异常。首先找到SearchPublicRegistries.jsp发送请求的数据,可以看到异常由operator数据产生。

weblogic_ssrf_6.png

然后手工更改operator参数数据,看能否复现类似异常信息

http://IP:7001/uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http

复现异常信息后,根据异常点及异常后函数栈追踪信息。从web处理入口点,人工分析前面逆向的源码,查看外部数据传输流程。

在SearchPublicRegistries.jsp程序中可以看到程序将operator参数数据传递给search.java的代码如下:

search.setOperator(operator);

session.setAttribute("operator", operator);

  try

  {

             bl = search.getResponse(rdoSearch, name, key, sfor, option);

请求的后台类程序执行流程:

com.bea.uddiexplorer.Search.getResponse(Search.java:172)

com.bea.uddiexplorer.Search.findBusinessListByName(Search.java:325)

weblogic.uddi.client.service.Inquiry.findBusiness(Inquiry.java:101)

weblogic.uddi.client.service.UDDISoapMessage.sendMessage(UDDISoapMessage.java:115)

此后抛出异常信息。

分析search.java的代码发现:

search.setOperator(operator); 通过setUDDIInquiryURL完成使用外部输入的operator参数值对Inquiry类的URL属性赋值。

weblogic_ssrf_7.png

weblogic_ssrf_8.png

weblogic_ssrf_9.png

然后看findBusiness(weblogic.uddi.client.service Inquiry.java:101)函数,

weblogic_ssrf_10.png

调用了UDDISoapMessage类的sendMessage(在weblogic.uddi.client.service包的UDDISoapMessage.java类)函数,并将inquiry类的URL属性传递给sendMessage函数。也即将operater传递给了sendMessage函数。

然后看sendMessage(UDDISoapMessage.java)处代码:

weblogic_ssrf_11.png

sendMessage函数先将operator传递过来的数据,也就是inqueryURL属性,赋值给了BindingInfo的实例。然后通过BindingFactory工厂,使用Bindinfo实例创建了一个Binding实例。BindingFactory工厂提供了HttpClientBindingHttpsClientBindingHttp11ClientBindingHttp11ClientBindingJMSClientBinding接口,并通过operator参数的url协议关键字(httphttpshttp11jms)决定当前使用哪个接口。而接口的send方法将使用socket函数,及operator参数传入的url创建socket并发送请求。而这里调用socket产生了ssrf漏洞。

weblogic_ssrf_12.png

weblogic_ssrf_13.png

weblogic_ssrf_14.png

如果不清楚这里createSoket将产生哪类型的漏洞,可以使用iotsploitjava_src_audit java源码分析插件分析该处漏洞类型(可通过“HttpClientBinding.java  487”定位到漏洞类型)。插件使用方法:

 

 

 

 

 

 

  • iotploit\iotsploit\wordlists目录下有个java_src_path.txt文件,在这个文件里放置你要扫描的源码目录

  • 使用use scaners/java_src_vul_scan加载插件

  • 使用run运行插件(插件运行完毕结果存储在iotsploit目录的java_src_vul.txt文件中,由四列组成:漏洞类型 产生漏洞的函数 所在文件 在文件中的行号)

    如下图java_src_audit审计分析的漏洞类型及代码所在行:

    weblogic_ssrf_15.png


5.  Weblogic ssrf类漏洞挖掘方法总结

  1. 首先开启weblogic并将日志导出到日志文件。

  2. 使用扫描工具或手工访问web目录(web可访问路径或文件通过逆向后的web.xml文件或web目录下的文件获取)。

  3. 检查日志文件中的”exception”关键字,并确定异常入口点。

  4. 根据日志文件中找到的异常入口点确定产生异常的web请求,并手工修改对应输入参数数据复现。

  5. 根据日志文件中的异常函数栈调用信息,分析源码,定位异常产生过程及异常最终函数调用位置。根据最终触发异常的函数确定漏洞类型(可以把定位到的函数所在源文件,使用iotsploitjava_src_audit插件审计确定漏洞类型)。

  6. 根据漏洞类型,设计利用载荷,并进行利用实验,确定漏洞的可利用性。

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。