# AWS - DynamoDB Enum {{#include ../../../banners/hacktricks-training.md}} ## DynamoDB ### Grundinformationen Amazon DynamoDB wird von AWS als eine **vollständig verwaltete, serverlose, Schlüssel-Wert NoSQL-Datenbank** präsentiert, die für die Unterstützung von leistungsstarken Anwendungen unabhängig von ihrer Größe konzipiert ist. Der Dienst bietet robuste Funktionen, einschließlich integrierter Sicherheitsmaßnahmen, unterbrechungsfreier Backups, automatisierter Replikation über mehrere Regionen, integrierter In-Memory-Caching und praktischer Datenexport-Utilities. Im Kontext von DynamoDB werden anstelle einer traditionellen Datenbank **Tabellen erstellt**. Jede Tabelle erfordert die Angabe eines **Partitionierungsschlüssels** als integralen Bestandteil des **Primärschlüssels der Tabelle**. Dieser Partitionierungsschlüssel, im Wesentlichen ein **Hash-Wert**, spielt eine entscheidende Rolle sowohl bei der Abfrage von Elementen als auch bei der Verteilung von Daten über verschiedene Hosts. Diese Verteilung ist entscheidend für die Aufrechterhaltung sowohl der Skalierbarkeit als auch der Verfügbarkeit der Datenbank. Darüber hinaus gibt es die Möglichkeit, einen **Sortierschlüssel** hinzuzufügen, um die Datenorganisation weiter zu verfeinern. ### Verschlüsselung Standardmäßig verwendet DynamoDB einen KMS-Schlüssel, der **zu Amazon DynamoDB gehört,** nicht einmal den von AWS verwalteten Schlüssel, der zumindest zu Ihrem Konto gehört.
### Backups & Export nach S3 Es ist möglich, die **Erstellung von Tabellen-Backups** zu **planen** oder sie **auf Anfrage** zu erstellen. Darüber hinaus ist es auch möglich, **Point-in-Time Recovery (PITR) für eine Tabelle zu aktivieren.** Die Wiederherstellung zu einem bestimmten Zeitpunkt bietet kontinuierliche **Backups** Ihrer DynamoDB-Daten für **35 Tage**, um Sie vor versehentlichen Schreib- oder Löschvorgängen zu schützen. Es ist auch möglich, **die Daten einer Tabelle nach S3 zu exportieren**, aber die Tabelle muss **PITR aktiviert** haben. ### GUI Es gibt eine GUI für lokale Dynamo-Dienste wie [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) usw., die nützlich sein könnte: [https://github.com/aaronshaf/dynamodb-admin](https://github.com/aaronshaf/dynamodb-admin) ### Enumeration ```bash # Tables aws dynamodb list-tables aws dynamodb describe-table --table-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 aws dynamodb describe-continuous-backups --table-name # Global tables aws dynamodb list-global-tables aws dynamodb describe-global-table --global-table-name # Exports aws dynamodb list-exports aws dynamodb describe-export --export-arn # Misc aws dynamodb describe-endpoints #Dynamodb endpoints ``` ### Unauthenticated Access {{#ref}} ../aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md {{#endref}} ### Privesc {{#ref}} ../aws-privilege-escalation/aws-dynamodb-privesc.md {{#endref}} ### Post Exploitation {{#ref}} ../aws-post-exploitation/aws-dynamodb-post-exploitation.md {{#endref}} ### Persistence {{#ref}} ../aws-persistence/aws-dynamodb-persistence.md {{#endref}} ## DynamoDB Injection ### SQL Injection Es gibt Möglichkeiten, auf DynamoDB-Daten mit **SQL-Syntax** zuzugreifen, daher sind typische **SQL-Injektionen ebenfalls möglich**. {{#ref}} https://book.hacktricks.wiki/en/pentesting-web/sql-injection/index.html {{#endref}} ### NoSQL Injection In DynamoDB können verschiedene **Bedingungen** verwendet werden, um Daten abzurufen. Wie bei einer gängigen NoSQL-Injektion, wenn es möglich ist, **mehrere Bedingungen zu verketten, um** Daten abzurufen, könnten Sie versteckte Daten (oder die gesamte Tabelle dumpen).\ Hier finden Sie die von DynamoDB unterstützten Bedingungen: [https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html) Beachten Sie, dass **verschiedene Bedingungen** unterstützt werden, wenn auf die Daten über **`query`** oder über **`scan`** zugegriffen wird. > [!NOTE] > Tatsächlich müssen **Query**-Aktionen die **Bedingung "EQ" (gleich)** im **primären** Schlüssel angeben, damit sie funktionieren, was sie viel **weniger anfällig für NoSQL-Injektionen** macht (und auch die Operation sehr eingeschränkt). Wenn Sie die **Vergleichsoperation** ändern oder neue hinzufügen können, könnten Sie mehr Daten abrufen. ```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}} ### Rohes Json-Injection > [!CAUTION] > **Diese Schwachstelle basiert auf dem dynamodb Scan Filter, der jetzt veraltet ist!** **DynamoDB** akzeptiert **Json**-Objekte, um **Daten** in der DB zu **suchen**. Wenn Sie feststellen, dass Sie im Json-Objekt, das zum Suchen gesendet wird, schreiben können, könnten Sie die DB dumpen, alle Inhalte. Zum Beispiel, indem Sie in eine Anfrage injizieren wie: ```bash '{"Id": {"ComparisonOperator": "EQ","AttributeValueList": [{"N": "' + user_input + '"}]}}' ``` Ein Angreifer könnte etwas injizieren wie: `1000"}],"ComparisonOperator": "GT","AttributeValueList": [{"N": "0` Beheben Sie die "EQ"-Bedingung, die nach der ID 1000 sucht, und suchen Sie dann nach allen Daten mit einer ID-Zeichenfolge größer als 0, was alles ist. Ein weiteres **anfälliges Beispiel mit einem Login** könnte sein: ```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)) ``` Dies wäre anfällig für: ``` username: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none password: none"}],"ComparisonOperator": "NE","AttributeValueList": [{"S": "none ``` ### :property Injection Einige SDKs erlauben die Verwendung eines Strings, der die durchzuführende Filterung angibt, wie: ```java new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap) ``` Sie müssen wissen, dass beim Suchen in DynamoDB zum **Ersetzen** eines Attributs **wertes** in **Filterausdrücken** während des Scannens der Elemente die Tokens mit dem **`:`**-Zeichen **beginnen** sollten. Solche Tokens werden zur Laufzeit mit dem tatsächlichen **Attributwert** **ersetzt**. Daher kann ein Login wie das vorherige mit etwas wie folgendem umgangen werden: ```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}}