
PoC basé sur C pour CVE-2019-5736
Ce dépôt contient une preuve de concept en C pour l'exploitation de CVE-2019-5736.
Cette vulnérabilité permet à un conteneur Docker malveillant d'écraser le binaire runc de l'hôte et d'exécuter des commandes arbitraires sur l'hôte avec les privilèges root – compromettant complètement le système hôte.
Inspiré par la preuve de concept originale en Go de Frichetten
Ce code est fourni uniquement à des fins éducatives. Ne l'exécutez pas sur un système qui ne vous appartient pas ou pour lequel vous n'avez pas l'autorisation de tester. Toute utilisation abusive peut entraîner des conséquences juridiques.
.
├── 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
Cet exploit a été testé sur :
sudo ./scripts/install_dependencies.sh
Remarque : Vous pouvez ignorer cette étape en toute sécurité si vous avez déjà installé
wgetetbuild-essential.
sudo ./scripts/setup_env.sh
Ce script installe Docker sans systemd ni activation via socket. Il est idéal pour les laboratoires VM.
sudo dockerd
Remarque : Vous aurez besoin d'un second terminal pour l'exécuter en arrière-plan.
sudo ./scripts/build_docker.sh
Ce script compile l'exploit et construit une image Docker contenant le binaire.
Remarque : Vous pouvez également compiler manuellement le binaire d'exploitation en exécutant
make.
Vous pouvez supprimer complètement Docker et restaurer le système à l'état d'avant l'installation :
sudo ./scripts/purge_docker_installation.sh
D'abord, nous démarrons notre conteneur d'exploitation. Vous pouvez utiliser cette commande :
sudo docker run -it --name exp --rm runc_exploit
ou le script shell inclus :
sudo ./scripts/start_docker.sh
À l'intérieur du conteneur, nous pouvons maintenant lancer notre binaire d'exploitation :
./exploit -c "$COMAND"
Le binaire prend trois arguments :
-haffiche le message d'utilisation,-cdéfinit la chaîne de commande (payload) que nous voulons exécuter sur l'hôte. Le dernier argument-dactive ou désactive les affichages de débogage pendant l'exécution (ex. informations d'analyse de/proc).
Remarque : Si l'argument
-cn'est pas fourni, l'exploit exécuteracp /etc/shadow > /tmp/pwned && chmod 644 /tmp/pwned.
L'exploit attend maintenant un processus runc entrant sur l'hôte. Exécutez :
sudo ./scripts/trigger_exploit.sh
Ce script ouvrira un nouveau processus à l'intérieur du conteneur en exécutant bin/sh, déclenchant ainsi l'exploit.
Remarque : Vous pouvez également déclencher l'exploit en exécutant manuellement
docker execsur l'hôte, mais le timing est critique pour que la version actuelle de la preuve de concept fonctionne. Cela peut donc nécessiter quelques tentatives…
Si runc a été exploité avec succès, vous devriez voir une sortie similaire :

Nous pouvons maintenant ouvrir notre fichier shadow compromis :
