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.
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.
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
.
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 uptime, size, 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.
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
« .
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
Pareil pour wget: apt install wget -y
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
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