# AWS - DynamoDB Enum

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

## DynamoDB

### Basiese Inligting

Amazon DynamoDB word deur AWS aangebied as 'n **volledig bestuurde, serverless, sleutel-waarde NoSQL-databasis**, ontwerp om hoë-prestasie toepassings te ondersteun, ongeag hul grootte. Die diens verseker robuuste kenmerke, insluitend inherente sekuriteitsmaatreëls, ononderbroken rugsteun, geoutomatiseerde replikaasies oor verskeie streke, geïntegreerde in-geheue kas, en gerieflike data-eksporthulpmiddels.

In die konteks van DynamoDB, in plaas daarvan om 'n tradisionele databasis op te stel, **word tafels geskep**. Elke tafel vereis die spesifikasie van 'n **partisie-sleutel** as 'n integrale komponent van die **tafel se primêre sleutel**. Hierdie partisiesleutel, wat essensieel 'n **hash-waarde** is, speel 'n kritieke rol in beide die herwinning van items en die verspreiding van data oor verskeie gasheers. Hierdie verspreiding is van kardinale belang vir die handhawing van beide skaalbaarheid en beskikbaarheid van die databasis. Daar is ook 'n opsie om 'n **sorteersleutel** in te sluit om data-organisasie verder te verfyn.

### Enkripsie

Standaard gebruik DynamoDB 'n KMS-sleutel wat \*\*aan Amazon DynamoDB behoort,\*\* nie eens die AWS bestuurde sleutel wat ten minste aan jou rekening behoort nie.

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

### Rugsteun & Eksport na S3

Dit is moontlik om **die generasie van tafelrugsteun** te **skeduleer** of om dit op **aanvraag** te skep. Boonop is dit ook moontlik om **Punt-in-tyd herstel (PITR) vir 'n tafel** in te skakel. Punt-in-tyd herstel bied deurlopende **rugsteun** van jou DynamoDB-data vir **35 dae** om jou te help beskerm teen per ongeluk skryf- of verwyderingsoperasies.

Dit is ook moontlik om **die data van 'n tafel na S3** te eksporteer, maar die tafel moet **PITR geaktiveer** hê.

### GUI

Daar is 'n GUI vir plaaslike Dynamo-dienste soos [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), ens., wat nuttig kan wees: [https://github.com/aaronshaf/dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin)

### Enumerasie
```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
```
### Ongeauthentiseerde Toegang

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

### Privilege Escalation

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

### Post Exploitatie

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

### Volharding

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

## DynamoDB Inspuiting

### SQL Inspuiting

Daar is maniere om toegang tot DynamoDB data te verkry met **SQL-sintaksis**, daarom is tipiese **SQL-inspuitings ook moontlik**.

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

### NoSQL Inspuiting

In DynamoDB kan verskillende **voorwaardes** gebruik word om data te verkry, soos in 'n algemene NoSQL-inspuiting. As dit moontlik is om **meer voorwaardes te koppel om** data te verkry, kan jy verborge data verkry (of die hele tabel dump).\
Jy kan hier die voorwaardes vind wat deur DynamoDB ondersteun word: [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html)

Let daarop dat **verskillende voorwaardes** ondersteun word as die data via **`query`** of via **`scan`** verkry word.

> [!NOTE]
> Trouens, **Query** aksies moet die **voorwaarde "EQ" (gelyk)** in die **primêre** sleutel spesifiseer om te werk, wat dit baie **minder geneig maak tot NoSQL-inspuitings** (en ook die operasie baie beperk maak).

As jy die **vergelyking** wat uitgevoer word kan **verander** of nuwe kan byvoeg, kan jy meer data verkry.
```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}}

### Rauwe Json inspuiting

> [!CAUTION]
> **Hierdie kwesbaarheid is gebaseer op dynamodb Scan Filter wat nou verouderd is!**

**DynamoDB** aanvaar **Json**-objekte om **data** binne die DB te **soek**. As jy vind dat jy in die json-objek wat gestuur word om te soek, kan skryf, kan jy die DB dump, al die inhoud. 

Byvoorbeeld, inspuiting in 'n versoek soos:
```bash
'{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}'
```
'n aanvaller kan iets soos hierdie inspuit:

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

regstel die "EQ" voorwaarde wat soek na die ID 1000 en dan soek na al die data met 'n Id-string groter as 0, wat alles is.

Nog 'n **kwetsbare voorbeeld wat 'n aanmelding gebruik** kan wees:
```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))
```
Dit sou kwesbaar wees teen:
```
username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none
```
### :property Injection

Sommige SDK's laat toe om 'n string te gebruik wat die filtrering aandui wat uitgevoer moet word soos:
```java
new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)
```
Jy moet weet dat wanneer jy in DynamoDB soek om 'n attribuut **waarde** in **filteruitdrukkings** te **vervang** terwyl jy die items skandeer, die tokens moet **begin** met die **`:`** karakter. Sulke tokens sal met die werklike **attribuutwaarde tydens uitvoering** **vervang** word.

Daarom kan 'n aanmelding soos die vorige omseil word met iets soos:
```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}}
