
PoC baseado em C para CVE-2019-5736
Este repositório contém um exploit de prova de conceito baseado em C para CVE-2019-5736.
Essa vulnerabilidade permite que um contêiner Docker malicioso sobrescreva o binário runc do host e execute comandos arbitrários no host com privilégios de root – comprometendo totalmente o sistema host.
Inspirado no PoC original baseado em Go por Frichetten
Este código é apenas para fins educacionais. Não o execute em nenhum sistema que você não possua ou para o qual não tenha permissão de teste. O uso indevido pode resultar em consequências legais.
.
├── 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 foi testado em:
sudo ./scripts/install_dependencies.sh
Nota: Você pode pular esta etapa com segurança se já tiver instalado
wgetebuild-essential.
sudo ./scripts/setup_env.sh
Este script instala o Docker sem systemd ou ativação via socket. É ideal para laboratórios de VM.
sudo dockerd
Nota: Você precisará de um segundo terminal para executar isso em segundo plano.
sudo ./scripts/build_docker.sh
Este script compila o exploit e cria uma imagem Docker com o binário dentro.
Nota: Você também pode compilar manualmente o binário do exploit executando
make.
Você pode remover completamente o Docker e restaurar o sistema ao estado anterior à instalação:
sudo ./scripts/purge_docker_installation.sh
Primeiro, iniciamos nosso contêiner do exploit. Você pode usar este comando:
sudo docker run -it --name exp --rm runc_exploit
ou o script de shell incluído:
sudo ./scripts/start_docker.sh
Dentro do contêiner, agora podemos iniciar nosso binário do exploit:
./exploit -c "$COMAND"
O binário aceita três argumentos:
-hexibe a mensagem de uso,-cdefine a string de comando do payload que queremos executar no host. O último argumento,-d, alterna as impressões de depuração durante a execução (ex.: análise de informações de/proc).
Nota: Se o argumento
-cnão for fornecido, o exploit executarácp /etc/shadow > /tmp/pwned && chmod 644 /tmp/pwned.
O exploit agora aguarda um processo runc no host. Execute:
sudo ./scripts/trigger_exploit.sh
Este script abrirá um novo processo dentro do contêiner executando bin/sh e, portanto, acionando o exploit.
Nota: Você também pode acionar o exploit executando
docker execmanualmente no host, mas o timing é crítico para que a versão atual do PoC funcione. Portanto, pode ser necessário tentar algumas vezes...
Se o runc foi explorado com sucesso, você deve ver uma saída semelhante:

Agora podemos abrir nosso arquivo shadow comprometido:
