Le Docker Hacking en pratique

Depuis 2013, Docker a changé la donne dans différents secteurs de l’informatique à plusieurs égards, en offrant aux développeurs et aux utilisateurs une grande flexibilité dans le développement et l’utilisation de nombreuses applications et systèmes d’exploitation.

Tout d’abord, les conteneurs Docker assurent l’isolation et la portabilité des applications logicielles. En encapsulant une application et ses dépendances dans un conteneur, les développeurs peuvent garantir un comportement cohérent dans différents environnements. Cela élimine le fameux problème du « ça marche sur ma machine » et rationalise le processus de déploiement.

Deuxièmement, Docker permet de déployer des conteneurs dans des grappes, gérées par des frameworks tels que Kubernetes de Google. Cette approche permet de séparer le code de l’application et l’infrastructure, ce qui facilite les architectures hautement résilientes et élastiques. La mise en cluster des conteneurs est particulièrement bénéfique pour les applications basées sur les microservices, car elle favorise l’évolutivité et la tolérance aux pannes.

Enfin, les conteneurs Docker offrent une couche d’abstraction supérieure pour le déploiement des applications. Ils simplifient le processus de configuration, de sauvegarde et de partage des environnements de serveurs. Avec Docker, l’installation d’une application ou d’un grand logiciel peut être aussi simple que l’exécution de quelques commandes. Cette facilité d’utilisation améliore la productivité et accélère les cycles de développement.

Bien que Docker ait gagné en popularité ces dernières années, il introduit une certaine complexité dans le processus de développement, mais aussi quelques faiblesses si vous activez l’accès à distance et l’utilisez avec les paramètres par défaut. Un attaquant peut alors être root en une seconde, comme nous le verrons ci-dessous.

Accès à distance du daemon Docker

Si vous souhaitez travailler à distance sur un conteneur, il est possible de configurer Docker pour qu’il accepte les requêtes d’un hôte distant comme expliqué sur cette page de la documentation Docker. Même si la documentation explique comment protéger Docker en créant un utilisateur non-root ou en protégeant le daemon socket par exemple, beaucoup de conteneurs accessibles à distance sont utilisés avec la configuration par défaut, accessible sur le port 2375, mais aussi sur le port 2376 pour TLS en utilisant un compte root.

Comment trouver ces containers sur Shodan

En recherchant product:docker port:2375 sur Shodan, on constate que de nombreux serveurs hébergeant des conteneurs ont le port 2375 ouvert.

Shodan results showing Docker containers with port 2375 open and countries in the top 5

Comme les comptes gratuits de Shodan fournissent des résultats limités (2 pages), vous pouvez augmenter le nombre de résultats disponibles en filtrant et en spécifiant alternativement différents pays en ajoutant country=XX où XX représente le code du pays : « country=US » pour les États-Unis, « country=UK » pour le Royaume-Uni, "country=CN » pour la Chine, etc… Liste complète sur iso.org.

Shodan results showing Docker containers with 2375 port open and some detail for a few servers. The first one in highlighted in a red rectangle, it will be the target in this post

Analyser le serveur avant d’attaquer (Optionnel)

When you use Docker remotely, you can use the usual options listed on this page. The difference is you need to spocify the host with the “-H” parameter. We will check first the Docker version installed by using the “--version” option on the first server listed on Shodan in the previous section. Then, we can list all images installed and available with the images parameter.

Lorsque vous utilisez Docker à distance, vous pouvez utiliser les options habituelles listées sur cette page. La différence est que vous devez spécifier l’hôte avec le paramètre « -H ». Nous allons d’abord vérifier la version de Docker installée en utilisant l’option « --version » sur le premier serveur listé sur Shodan dans la section précédente. Ensuite, nous pouvons lister toutes les images installées et disponibles avec le paramètre images.

Linux ternimal showing the Docker version and images available on the target selected in the previous step

Lancer l’attaque

For listing every process actually running, you will use the “ps” parameter. You can see the operating system running on the container, its uptimesize, and espacially its image ID which we will use.

Pour obtenir la liste de tous les processus en cours d’exécution, vous utiliserez le paramètre « ps« . Vous pouvez voir le système d’exploitation en cours d’exécution sur le conteneur, son temps de fonctionnement, sa taille, et en particulier son image ID que nous allons utiliser.

Linux terminal showing process list on the selected Docker container using the ps command

Essayons le premier, sous Ubuntu. Après docker -H IP_ADDRESS, nous pouvons sélectionner un conteneur avec le paramètre « exec« , puis ajouter les options « -it » pour un shell interactif (« i » pour interactif et « t » pour tty), et l’ID de l’image. Enfin, nous pouvons écrire ce que nous voulons utiliser sur ce conteneur, ici « /bin/bash« .

Linux terminal showing the attack allowing us to start a new session on the Docker container and execute the uname command for checking the Ubuntu version

Après quelques secondes, nous sommes root. Pas d’identifiants, pas de confirmation, rien. Juste :

« Bonjour, c’est moi !
-OK, faîtes ce que vous voulez ».

Maintenant, vous aurez peut-être besoin d’autres outils. Pour les installer, vous aurez probablement besoin de wget, curl ou git. Sur ce conteneur, curl n’est pas disponible, vous pouvez l’installer avec : apt install curl -y

Linux terminal showing that the curl command is not available, installing it

Pareil pour wgetapt install wget -y

Linux terminal showing that the wget command is not available, installing it

La commande git est déjà disponible, sur ce container. Si elle ne l’est pas, vous pouvez l’installer avec: apt install git -y

Linux terminal showing that the git command is already available

Vous pouvez maintenant imaginer ce qu’un attaquant malveillant peut faire avec tous ces éléments, comme lancer une attaque DDoS exécutée à partir de ce conteneur, scanner anonymement n’importe quel serveur sensible et revenir plus tard pour télécharger les résultats, créer une attaque de phishing ou une page web de clickjacking, etc…

Si vos containers Docker sont accessibles à distance, veuillez consulter la section sur la sécurité dans la documentation officielle et sécurisez-les : https://docs.docker.com/engine/security/

Cet article a été initialement publié sur mon ancien blog hébergé sur Github.: Docker hacking | cryptrz

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Creative Commons License CC BY-SA 4.0