# 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>

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET 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?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
