AWS - DynamoDB Enum

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

Outras maneiras de apoiar o HackTricks:

DynamoDB

Informações Básicas

A Amazon DynamoDB é apresentada pela AWS como um banco de dados NoSQL chave-valor totalmente gerenciado e serverless, projetado para alimentar aplicativos de alto desempenho, independentemente de seu tamanho. O serviço garante recursos robustos, incluindo medidas de segurança inerentes, backups ininterruptos, replicação automatizada em várias regiões, cache integrado em memória e utilitários de exportação de dados convenientes.

No contexto do DynamoDB, em vez de estabelecer um banco de dados tradicional, são criadas tabelas. Cada tabela exige a especificação de uma chave de partição como um componente integral da chave primária da tabela. Essa chave de partição, essencialmente um valor de hash, desempenha um papel crítico tanto na recuperação de itens quanto na distribuição de dados entre vários hosts. Essa distribuição é fundamental para manter tanto a escalabilidade quanto a disponibilidade do banco de dados. Além disso, há a opção de incorporar uma chave de classificação para refinar ainda mais a organização dos dados.

Criptografia

Por padrão, o DynamoDB usa uma chave KMS que **pertence ao Amazon DynamoDB,**nem mesmo a chave gerenciada pela AWS que pelo menos pertence à sua conta.

Backups e Exportação para S3

É possível agendar a geração de backups de tabelas ou criá-los sob demanda. Além disso, também é possível habilitar a recuperação contínua no tempo (PITR) para uma tabela. A recuperação contínua no tempo fornece backups contínuos dos seus dados do DynamoDB por 35 dias para ajudar a proteger contra operações de gravação ou exclusão acidentais.

Também é possível exportar os dados de uma tabela para o S3, mas a tabela precisa ter PITR habilitado.

GUI

Existe uma GUI para serviços Dynamo local como DynamoDB Local, dynalite, localstack, etc, que pode ser útil: https://github.com/aaronshaf/dynamodb-admin

Enumeração

# Tables
aws dynamodb list-tables
aws dynamodb describe-table --table-name <t_name> #Get metadata info
## The primary key and sort key will appear inside the KeySchema field

#Check if point in time recovery is enabled
aws dynamodb describe-continuous-backups \
--table-name tablename

# Backups
aws dynamodb list-backups
aws dynamodb describe-backup --backup-arn <arn>
aws dynamodb describe-continuous-backups --table-name <t_name>

# Global tables
aws dynamodb list-global-tables
aws dynamodb describe-global-table --global-table-name <name>

# Exports
aws dynamodb list-exports
aws dynamodb describe-export --export-arn <arn>

# Misc
aws dynamodb describe-endpoints #Dynamodb endpoints

Acesso não autenticado

pageAWS - DynamoDB Unauthenticated Access

Elevação de privilégios

pageAWS - DynamoDB Privesc

Pós-exploração

pageAWS - DynamoDB Post Exploitation

Persistência

pageAWS - DynamoDB Persistence

Injeção no DynamoDB

Injeção de SQL

Existem maneiras de acessar dados do DynamoDB com sintaxe SQL, portanto, injeções SQL típicas também são possíveis.

Injeção NoSQL

No DynamoDB, diferentes condições podem ser usadas para recuperar dados, como em uma injeção NoSQL comum, se for possível encadear mais condições para recuperar dados, você poderia obter dados ocultos (ou despejar toda a tabela). Você pode encontrar aqui as condições suportadas pelo DynamoDB: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

Observe que diferentes condições são suportadas se os dados estiverem sendo acessados via query ou via scan.

Na verdade, as ações de Query precisam especificar a condição "EQ" (igual) na chave primária para funcionar, tornando-a muito menos suscetível a injeções NoSQL (e também tornando a operação muito limitada).

Se você puder alterar a comparação realizada ou adicionar novas, poderia recuperar mais dados.

# Comparators to dump the database
"NE": "a123" #Get everything that doesn't equal "a123"
"NOT_CONTAINS": "a123" #What you think
"GT": " " #All strings are greater than a space

Injeção de Json bruto

O DynamoDB aceita objetos Json para pesquisar dados dentro do banco de dados. Se você descobrir que pode escrever no objeto json enviado para a pesquisa, poderá fazer o dump do banco de dados, de todo o conteúdo.

Por exemplo, injetando em uma solicitação como:

'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'

um atacante poderia injetar algo como:

1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0

corrigir a condição "EQ" procurando pelo ID 1000 e em seguida procurando por todos os dados com um ID maior que 0, que é todos.

Injeção de :property

Alguns SDKs permitem usar uma string indicando o filtro a ser realizado como:

new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)

Você precisa saber que ao pesquisar no DynamoDB para substituir um valor de atributo em expressões de filtro enquanto escaneia os itens, os tokens devem começar com o caractere :. Tais tokens serão substituídos pelo valor real do atributo em tempo de execução.

Portanto, um login como o anterior pode ser burlado com algo como:

:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Última actualización