2375, 2376 Pentesting Docker
Bases de Docker
Qu'est-ce que c'est
Docker est la plateforme de pointe dans l'industrie de la conteneurisation, menant l'innovation continue. Il facilite la création et la distribution sans effort d'applications, allant du traditionnel au futuriste, et assure leur déploiement sécurisé sur des environnements divers.
Architecture de base de Docker
containerd : Il s'agit d'un runtime central pour les conteneurs, chargé de la gestion complète du cycle de vie d'un conteneur. Cela implique la gestion du transfert et du stockage des images, en plus de superviser l'exécution, la surveillance et le réseau des conteneurs. Des aperçus plus détaillés sur containerd sont explorés plus en profondeur.
Le container-shim joue un rôle crucial en tant qu'intermédiaire dans la gestion des conteneurs sans tête, prenant en charge de manière transparente runc après l'initialisation des conteneurs.
runc : Réputé pour ses capacités de runtime de conteneur léger et universel, runc est aligné sur la norme OCI. Il est utilisé par containerd pour démarrer et gérer les conteneurs selon les directives OCI, ayant évolué à partir de l'original libcontainer.
grpc est essentiel pour faciliter la communication entre containerd et le moteur Docker, assurant une interaction efficace.
L'OCI est essentiel pour maintenir les spécifications OCI pour le runtime et les images, les dernières versions de Docker étant conformes aux normes OCI pour les images et le runtime.
Commandes de base
Containerd
Containerd a été spécifiquement développé pour répondre aux besoins des plateformes de conteneurs telles que Docker et Kubernetes, entre autres. Son objectif est de simplifier l'exécution de conteneurs sur différents systèmes d'exploitation, notamment Linux, Windows, Solaris, et autres, en abstrayant les fonctionnalités spécifiques à chaque système d'exploitation et les appels système. L'objectif de Containerd est d'inclure uniquement les fonctionnalités essentielles requises par ses utilisateurs, en s'efforçant d'omettre les composants inutiles. Cependant, il est reconnu que la réalisation de cet objectif est difficile.
Une décision de conception clé est que Containerd ne gère pas le réseau. Le réseau est considéré comme un élément critique dans les systèmes distribués, avec des complexités telles que le Réseau Défini par Logiciel (SDN) et la découverte de services qui varient considérablement d'une plateforme à l'autre. Par conséquent, Containerd laisse les aspects réseau à être gérés par les plateformes qu'il prend en charge.
Alors que Docker utilise Containerd pour exécuter des conteneurs, il est important de noter que Containerd ne prend en charge qu'un sous-ensemble des fonctionnalités de Docker. Plus précisément, Containerd ne dispose pas des capacités de gestion réseau présentes dans Docker et ne prend pas en charge la création de grappes Docker directement. Cette distinction met en évidence le rôle ciblé de Containerd en tant qu'environnement d'exécution de conteneurs, déléguant des fonctionnalités plus spécialisées aux plateformes avec lesquelles il s'intègre.
Podman
Podman est un moteur de conteneur open source qui respecte les normes de l'Open Container Initiative (OCI), développé et maintenu par Red Hat. Il se distingue de Docker par plusieurs fonctionnalités distinctes, notamment son architecture sans démon et la prise en charge des conteneurs sans privilèges root, permettant aux utilisateurs d'exécuter des conteneurs sans privilèges root.
Podman est conçu pour être compatible avec l'API de Docker, permettant l'utilisation des commandes CLI de Docker. Cette compatibilité s'étend à son écosystème, qui comprend des outils tels que Buildah pour la construction d'images de conteneurs et Skopeo pour les opérations sur les images telles que push, pull et inspect. Plus de détails sur ces outils peuvent être trouvés sur leur page GitHub.
Différences clés
Architecture : Contrairement au modèle client-serveur de Docker avec un démon en arrière-plan, Podman fonctionne sans démon. Cette conception signifie que les conteneurs s'exécutent avec les privilèges de l'utilisateur qui les lance, renforçant la sécurité en éliminant le besoin d'accès root.
Intégration de systemd : Podman s'intègre à systemd pour gérer les conteneurs, permettant la gestion des conteneurs via des unités systemd. Cela contraste avec l'utilisation de systemd par Docker principalement pour gérer le processus du démon Docker.
Conteneurs sans privilèges root : Une fonctionnalité clé de Podman est sa capacité à exécuter des conteneurs sous les privilèges de l'utilisateur initiateur. Cette approche réduit les risques liés aux violations de conteneurs en veillant à ce que les attaquants n'obtiennent que les privilèges de l'utilisateur compromis, et non un accès root.
L'approche de Podman offre une alternative sécurisée et flexible à Docker, mettant l'accent sur la gestion des privilèges utilisateur et la compatibilité avec les flux de travail Docker existants.
Notez que comme Podman vise à prendre en charge la même API que Docker, vous pouvez utiliser les mêmes commandes avec Podman qu'avec Docker, telles que :
Informations de base
L'API à distance fonctionne par défaut sur le port 2375 lorsqu'elle est activée. Le service ne nécessitera pas d'authentification par défaut, permettant à un attaquant de démarrer un conteneur Docker privilégié. En utilisant l'API à distance, il est possible d'attacher des hôtes / (répertoire racine) au conteneur et de lire/écrire des fichiers de l'environnement de l'hôte.
Port par défaut : 2375
Énumération
Manuel
Notez que pour énumérer l'API Docker, vous pouvez utiliser la commande docker
ou curl
comme dans l'exemple suivant:
Si vous pouvez contacter l'API Docker à distance avec la commande docker
, vous pouvez exécuter n'importe laquelle des commandes Docker précédemment commentées pour interagir avec le service.
Vous pouvez export DOCKER_HOST="tcp://localhost:2375"
et éviter d'utiliser le paramètre -H
avec la commande docker.
Escalade rapide des privilèges
Curl
Parfois, vous verrez le port 2376 ouvert pour le point de terminaison TLS. Je n'ai pas pu m'y connecter avec le client docker mais il est possible de le faire avec curl.
Si vous souhaitez obtenir plus d'informations à ce sujet, plus d'informations sont disponibles là où j'ai copié les commandes : https://securityboulevard.com/2019/02/abusing-docker-api-socket/
Automatique
Compromission
Sur la page suivante, vous pouvez trouver des moyens de s'échapper d'un conteneur Docker :
En abusant de cela, il est possible de s'échapper d'un conteneur, vous pourriez exécuter un conteneur faible sur la machine distante, vous échapper de celui-ci et compromettre la machine :
Élévation de privilèges
Si vous êtes à l'intérieur d'un hôte utilisant Docker, vous pouvez lire ces informations pour essayer d'élever les privilèges.
Découverte de secrets dans les conteneurs Docker en cours d'exécution
Vérifiez env (section des variables d'environnement) pour les secrets et vous pourriez trouver :
Mots de passe.
Adresses IP.
Ports.
Chemins.
Autres… .
Si vous souhaitez extraire un fichier :
Sécuriser votre Docker
Sécuriser l'installation et l'utilisation de Docker
Vous pouvez utiliser l'outil https://github.com/docker/docker-bench-security pour inspecter votre installation Docker actuelle.
./docker-bench-security.sh
Vous pouvez utiliser l'outil https://github.com/kost/dockscan pour inspecter votre installation Docker actuelle.
dockscan -v unix:///var/run/docker.sock
Vous pouvez utiliser l'outil https://github.com/genuinetools/amicontained pour connaître les privilèges qu'un conteneur aura lorsqu'il est exécuté avec différentes options de sécurité. Cela est utile pour connaître les implications de l'utilisation de certaines options de sécurité pour exécuter un conteneur :
docker run --rm -it r.j3ss.co/amicontained
docker run --rm -it --pid host r.j3ss.co/amicontained
docker run --rm -it --security-opt "apparmor=unconfined" r.j3ss.co/amicontained
Sécuriser les images Docker
Vous pouvez utiliser une image Docker de https://github.com/quay/clair pour analyser vos autres images Docker et trouver des vulnérabilités.
docker run --rm -v /root/clair_config/:/config -p 6060-6061:6060-6061 -d clair -config="/config/config.yaml"
clair-scanner -c http://172.17.0.3:6060 --ip 172.17.0.1 ubuntu-image
Sécuriser les Dockerfiles
Vous pouvez utiliser l'outil https://github.com/buddy-works/dockerfile-linter pour inspecter votre Dockerfile et trouver toutes sortes de mauvaises configurations. Chaque mauvaise configuration se verra attribuer un ID, vous pouvez trouver ici https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md comment corriger chacune d'entre elles.
dockerfilelinter -f Dockerfile
Vous pouvez utiliser l'outil https://github.com/replicatedhq/dockerfilelint pour inspecter votre Dockerfile et trouver toutes sortes de mauvaises configurations.
dockerfilelint Dockerfile
Vous pouvez utiliser l'outil https://github.com/RedCoolBeans/dockerlint pour inspecter votre Dockerfile et trouver toutes sortes de mauvaises configurations.
dockerlint Dockerfile
Vous pouvez utiliser l'outil https://github.com/hadolint/hadolint pour inspecter votre Dockerfile et trouver toutes sortes de mauvaises configurations.
hadolint Dockerfile
Enregistrement des activités suspectes
Vous pouvez utiliser l'outil https://github.com/falcosecurity/falco pour détecter les comportements suspects dans les conteneurs en cours d'exécution.
Notez dans le morceau suivant comment Falco compile un module de noyau et l'insère. Ensuite, il charge les règles et commence à enregistrer les activités suspectes. Dans ce cas, il a détecté 2 conteneurs privilégiés démarrés, dont l'un avec un montage sensible, et après quelques secondes, il a détecté l'ouverture d'un shell à l'intérieur de l'un des conteneurs.
Surveillance de Docker
Vous pouvez utiliser auditd pour surveiller Docker.
Références
Last updated