
PoC basado en C para CVE-2019-5736
Este repositorio contiene un exploit de prueba de concepto basado en C para CVE-2019-5736.
Esta vulnerabilidad permite que un contenedor Docker malicioso sobrescriba el binario runc del host y ejecute comandos arbitrarios en el host con privilegios de root, comprometiendo por completo el sistema host.
Inspirado en el PoC original basado en Go de Frichetten
Este código es solo con fines educativos. No lo ejecutes en ningún sistema que no poseas o para el que no tengas permiso de prueba. El uso indebido puede tener consecuencias legales.
.
├── docker/
│ └── Dockerfile
├── lib/
│ └── exploit.h
├── scripts/
│ ├── build_docker.sh
│ ├── purge_docker_installation.sh
│ ├── setup_env.sh
│ ├── start_docker.sh
│ └── trigger_exploit.sh
├── src/
│ ├── exploit.c
│ └── main.c
├── LICENSE
├── Makefile
└── README.md
Este exploit ha sido probado en:
sudo ./scripts/install_dependencies.sh
Nota: Puedes omitir esto sin problema si ya tienes instalados
wgetybuild-essential.
sudo ./scripts/setup_env.sh
Este script instala Docker sin systemd ni activación por socket. Es ideal para laboratorios con máquinas virtuales.
sudo dockerd
Nota: Necesitarás una segunda terminal para ejecutar esto en segundo plano.
sudo ./scripts/build_docker.sh
Este script compila el exploit y crea una imagen de Docker con el binario dentro.
Nota: También puedes compilar manualmente el binario del exploit ejecutando
make.
Puedes eliminar Docker por completo y restaurar el sistema a un estado previo a la instalación:
sudo ./scripts/purge_docker_installation.sh
Primero iniciamos nuestro contenedor del exploit. Puedes usar este comando:
sudo docker run -it --name exp --rm runc_exploit
o el script de shell incluido:
sudo ./scripts/start_docker.sh
Dentro del contenedor ya podemos iniciar nuestro binario del exploit:
./exploit -c "$COMAND"
El binario acepta tres argumentos:
-hmuestra el mensaje de uso y-cdefine la cadena de comando que queremos ejecutar en el host. El último argumento,-d, activa las impresiones de depuración durante la ejecución. (p. ej., análisis de información de/proc)
Nota: Si no se proporciona el argumento
-c, el exploit ejecutarácp /etc/shadow > /tmp/pwned && chmod 644 /tmp/pwned.
El exploit ahora espera a que un proceso runc entrante en el host ejecute
sudo ./scripts/trigger_exploit.sh
Este script abrirá un nuevo proceso dentro del contenedor ejecutando bin/sh y, por lo tanto, desencadenará el exploit.
Nota: También podrías desencadenar el exploit ejecutando manualmente
docker execen el host, pero el tiempo es crítico para que la versión actual del PoC funcione. Así que podría requerir varios intentos...
Si runc fue explotado con éxito, deberías ver una salida similar:

Ahora podemos abrir nuestro archivo shadow comprometido:
