AWS - DynamoDB Enum

Support HackTricks

DynamoDB

Grundinformationen

Amazon DynamoDB wird von AWS als vollständig verwaltete, serverlose, Schlüssel-Wert NoSQL-Datenbank präsentiert, die für die Unterstützung von Hochleistungsanwendungen 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, dynalite, localstack usw., die nützlich sein könnte: https://github.com/aaronshaf/dynamodb-admin

Enumeration

# 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

Unauthenticated Access

Privesc

Post Exploitation

Persistence

DynamoDB Injection

SQL Injection

Es gibt Möglichkeiten, auf DynamoDB-Daten mit SQL-Syntax zuzugreifen, daher sind typische SQL-Injectionen ebenfalls möglich.

NoSQL Injection

In DynamoDB können verschiedene Bedingungen verwendet werden, um Daten abzurufen. Wie bei einer gängigen NoSQL-Injection, wenn es möglich ist, mehrere Bedingungen zu verketten, um Daten abzurufen, könnten Sie versteckte Daten (oder die gesamte Tabelle dumpen) erhalten. Hier finden Sie die von DynamoDB unterstützten Bedingungen: 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.

Tatsächlich müssen Query-Aktionen die Bedingung "EQ" (gleich) im primären Schlüssel angeben, um zu funktionieren, was sie viel weniger anfällig für NoSQL-Injectionen 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.

# 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

Raw Json Injection

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, injizieren in eine Anfrage wie:

'{"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, indem Sie nach der ID 1000 suchen und dann nach allen Daten mit einer ID-Zeichenfolge suchen, die größer als 0 ist, was alles ist.

Ein weiteres anfälliges Beispiel mit einem Login könnte sein:

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:

new ScanSpec().withProjectionExpression("UserName").withFilterExpression(user_input+" = :username and Password = :password").withValueMap(valueMap)

Sie müssen wissen, dass das Suchen in DynamoDB für das Ersetzen eines Attributs wertes in Filterausdrücken beim Scannen 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:

:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true
Unterstütze HackTricks

Last updated