Az - CosmosDB

Reading time: 15 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

Azure CosmosDB

Azure Cosmos DB ist eine vollständig verwaltete NoSQL-, relationale und Vektordatenbank, die Reaktionszeiten im einstelligen Millisekundenbereich, automatische Skalierbarkeit und SLA-unterstützte Verfügbarkeit mit Unternehmenssicherheit bietet. Es ermöglicht eine schnellere Anwendungsentwicklung durch schlüsselfertige, mehrregionale Datenverteilung, Open-Source-APIs, SDKs für beliebte Programmiersprachen und KI-Datenbankfunktionen wie integrierte Vektorsupport und nahtlose Azure KI-Integration.

Azure Cosmos DB bietet mehrere Datenbank-APIs, um reale Daten mit Dokumenten, relationalen, Schlüssel-Wert-, Graph- und Spaltenfamilien-Datenmodellen zu modellieren. Diese APIs sind NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin und Table.

Ein wichtiger Aspekt von CosmosDB ist das Azure Cosmos-Konto. Azure Cosmos-Konto fungiert als Einstiegspunkt zu den Datenbanken. Das Konto bestimmt wichtige Einstellungen wie globale Verteilung, Konsistenzstufen und die spezifische API, die verwendet werden soll, wie z.B. NoSQL. Über das Konto können Sie die globale Replikation konfigurieren, um sicherzustellen, dass Daten in mehreren Regionen für einen latenzarmen Zugriff verfügbar sind. Darüber hinaus können Sie eine Konsistenzstufe wählen, die zwischen Leistung und Datenakkuratheit balanciert, mit Optionen von starker bis eventualer Konsistenz.

Azure Cosmos DB unterstützt benutzerzugewiesene Identitäten und systemzugewiesene verwaltete Identitäten, die automatisch erstellt und an den Lebenszyklus der Ressource gebunden sind. Cosmos DB hat jedoch keinen integrierten Mechanismus, um direkt externe Datenquellen wie Azure Blob Storage abzufragen. Im Gegensatz zu den externen Tabellenfunktionen von SQL Server erfordert Cosmos DB, dass Daten mit externen Tools wie Azure Data Factory, dem Data Migration Tool oder benutzerdefinierten Skripten in seine Container aufgenommen werden, bevor sie mit den nativen Abfragefähigkeiten abgefragt werden können.

NoSQL

Die Azure Cosmos DB NoSQL-API ist eine dokumentenbasierte API, die JSON als Datenformat verwendet. Sie bietet eine SQL-ähnliche Abfragesyntax zum Abfragen von JSON-Objekten, was sie geeignet macht, um mit strukturierten und semi-strukturierten Daten zu arbeiten. Der Endpunkt des Dienstes ist:

bash
https://<Account-Name>.documents.azure.com:443/

Datenbanken

Innerhalb eines Kontos können Sie eine oder mehrere Datenbanken erstellen, die als logische Gruppierungen von Containern dienen. Eine Datenbank fungiert als Grenze für das Ressourcenmanagement und die Benutzerberechtigungen. Datenbanken können entweder mehreren Containern einen gemeinsamen Pool von Leistungsressourcen zur Verfügung stellen oder jedem Container seine eigene dedizierte Leistung geben.

Container

Die zentrale Einheit der Datenspeicherung ist der Container, der JSON-Dokumente enthält und automatisch für effiziente Abfragen indiziert wird. Container sind elastisch skalierbar und über Partitionen verteilt, die durch einen benutzerdefinierten Partitionierungsschlüssel bestimmt werden. Der Partitionierungsschlüssel ist entscheidend für die Gewährleistung optimaler Leistung und gleichmäßiger Datenverteilung. Zum Beispiel könnte ein Container Kundendaten speichern, wobei "customerId" als Partitionierungsschlüssel dient.

Hauptmerkmale

  • Globale Verteilung: Aktivieren oder Deaktivieren von Geo-Redundanz für die Replikation über Regionen hinweg und Multi-Regionen-Schreibvorgänge für verbesserte Verfügbarkeit.
  • Netzwerk & Sicherheit: zwischen öffentlichen (alle/ausgewählte Netzwerke) oder privaten Endpunkten für die Konnektivität. Sichere Verbindungen mit TLS 1.2-Verschlüsselung. Unterstützt CORS (Cross-Origin Resource Sharing) für kontrollierten Zugriff auf Ressourcen. Microsoft Defender für Cloud kann aktiviert werden. Um die Verbindung herzustellen, können Sie Schlüssel verwenden.
  • Backup & Wiederherstellung: von periodischen, kontinuierlichen (7 Tage) oder kontinuierlichen (30 Tage) Backup-Richtlinien mit konfigurierbaren Intervallen und Aufbewahrung.
  • Datenverschlüsselung: Standarddienstverwaltete Schlüssel oder kundenverwaltete Schlüssel (CMK) zur Verschlüsselung (CMK-Auswahl ist irreversibel).

Aufzählung

bash
# CosmoDB Account
## List Azure Cosmos DB database accounts.
az cosmosdb list --resource-group <ResourceGroupName>
az cosmosdb show --resource-group <ResourceGroupName> --name <AccountName>

## Lists the virtual network accounts associated with a Cosmos DB account
az cosmosdb network-rule list --resource-group <ResourceGroupName> --name <AccountName>
## List the access keys or connection strings for a Azure Cosmos DB
az cosmosdb keys list --name <AccountName> --resource-group <ResourceGroupName>
## List all the database accounts that can be restored.
az cosmosdb restorable-database-account list --account-name <AccountName>
## Show the identities for a Azure Cosmos DB database account.
az cosmosdb identity show --resource-group <ResourceGroupName> --name <AccountName>


# CosmoDB (NoSQL)
## List the NoSQL databases under an Azure Cosmos DB account.
az cosmosdb sql database list --resource-group <ResourceGroupName> --account-name <AccountName>
## List the NoSQL containers under an Azure Cosmos DB NoSQL database.
az cosmosdb sql container list --account-name <AccountName> --database-name <DatabaseName> --resource-group <ResourceGroupName>

## List all NoSQL role assignments under an Azure Cosmos DB
az cosmosdb sql role assignment list --resource-group <ResourceGroupName> --account-name <AccountName>
## List all NoSQL role definitions under an Azure Cosmos DB
az cosmosdb sql role definition list --resource-group <ResourceGroupName> --account-name <AccountName>

## List the NoSQL stored procedures under an Azure Cosmos DB
az cosmosdb sql stored-procedure list --account-name <AccountName> --container-name <ContainerName> --database-name <DatabaseName> --resource-group <ResourceGroupName>
## List the NoSQL triggers under an Azure Cosmos DB NoSQL container.
az cosmosdb sql trigger list --account-name <AccountName> --container-name <ContainerName> --database-name <DatabaseName> --resource-group <ResourceGroupName>
## List the NoSQL user defined functions under an Azure Cosmos DB NoSQL container
az cosmosdb sql user-defined-function list --account-name <AccountName> --container-name <ContainerName> --database-name <DatabaseName> --resource-group <ResourceGroupName>


## MongoDB (vCore)
# Install az cli extension
az extension add --name cosmosdb-preview
# List all MongoDB databases in a specified Azure Cosmos DB account
az cosmosdb mongocluster list
az cosmosdb mongocluster show --cluster-name <name> --resource-group <ResourceGroupName>
# Get firewall rules
az cosmosdb mongocluster firewall rule list --cluster-name <name> --resource-group <ResourceGroupName>
# Connect to in
brew install mongosh
mongosh "mongodb://<username>:<password>@<account-name>.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retryWrites=false" --username <username> --password <password>

Verbindung

Es gibt 2 Schlüsseltypen, Lese-Schreib (voll) und Nur-Lesen. Sie gewähren den angegebenen Zugriff auf alle Datenbanken, Sammlungen und Daten innerhalb des Cosmos DB-Kontos. Um sich zu verbinden, wird die azure-cosmosDB-Bibliothek (pip install azure-cosmos) benötigt. Darüber hinaus sind der Endpunkt und der Schlüssel entscheidende Komponenten, um die Verbindung herzustellen.

python
from azure.cosmos import CosmosClient, PartitionKey

# Connection details
endpoint = "<your-account-endpoint>"
key = "<your-account-key>"

# Initialize Cosmos Client
client = CosmosClient(endpoint, key)

# Access existing database and container
database_name = '<SampleDB>'
container_name = '<SampleContainer>'
database = client.get_database_client(database_name)
container = database.get_container_client(container_name)

# Insert multiple documents
items_to_insert = [
{"id": "1", "name": "Sample Item", "description": "This is a sample document."},
{"id": "2", "name": "Another Sample Item", "description": "This is another sample document."},
{"id": "3", "name": "Sample Item", "description": "This is a duplicate name sample document."},
]

for item in items_to_insert:
container.upsert_item(item)

# Query all documents
query = "SELECT * FROM c"
all_items = list(container.query_items(
query=query,
enable_cross_partition_query=True
))

# Print all queried items
print("All items in the container:")
for item in all_items:
print(item)

Eine weitere Möglichkeit, eine Verbindung herzustellen, besteht darin, DefaultAzureCredential() zu verwenden. Es muss sich nur mit dem Konto angemeldet werden (az login), das die Berechtigungen hat, und es auszuführen. In diesem Fall muss eine Rollen zuweisung vorgenommen werden, um die erforderlichen Berechtigungen zu gewähren (siehe für mor)

python
from azure.identity import DefaultAzureCredential
from azure.cosmos import CosmosClient

# Use Azure AD for authentication
credential = DefaultAzureCredential()
endpoint = "<your-account-endpoint>"
client = CosmosClient(endpoint, credential)

# Access database and container
database_name = "<mydatabase>"
container_name = "<mycontainer>"
database = client.get_database_client(database_name)
container = database.get_container_client(container_name)

# Insert a document
item = {
"id": "1",
"name": "Sample Item",
"description": "This is a test item."
}
container.create_item(item)
print("Document inserted.")

MongoDB

Die MongoDB NoSQL-API ist eine dokumentenbasierte API, die JSON-ähnliches BSON (Binary JSON) als Datenformat verwendet. Sie bietet eine Abfragesprache mit Aggregationsfähigkeiten, die sie für die Arbeit mit strukturierten, semi-strukturierten und unstrukturierten Daten geeignet macht. Der Endpunkt des Dienstes folgt typischerweise diesem Format:

bash
mongodb://<hostname>:<port>/<database>

Datenbanken

In MongoDB können Sie eine oder mehrere Datenbanken innerhalb einer Instanz erstellen. Jede Datenbank dient als logische Gruppierung von Sammlungen und bietet eine Grenze für die Organisation und Verwaltung von Ressourcen. Datenbanken helfen, Daten logisch zu trennen und zu verwalten, beispielsweise für verschiedene Anwendungen oder Projekte.

Sammlungen

Die zentrale Einheit der Datenspeicherung in MongoDB ist die Sammlung, die Dokumente enthält und für effiziente Abfragen sowie flexibles Schema-Design konzipiert ist. Sammlungen sind elastisch skalierbar und können hochgradig durchsatzstarke Operationen über mehrere Knoten in einer verteilten Umgebung unterstützen.

Hauptmerkmale des Request Unit (RU) Typs

Globale Verteilung: Aktivieren oder Deaktivieren von Geo-Redundanz für die Replikation über Regionen hinweg und Multi-Region-Schreibvorgänge für verbesserte Verfügbarkeit.
Netzwerk & Sicherheit: zwischen öffentlichen (alle/ausgewählte Netzwerke) oder privaten Endpunkten für die Konnektivität. Sichere Verbindungen mit TLS 1.2-Verschlüsselung. Unterstützt CORS (Cross-Origin Resource Sharing) für kontrollierten Zugriff auf Ressourcen. Um die Verbindung herzustellen, können Sie Schlüssel verwenden.
Backup & Wiederherstellung: von periodischen, kontinuierlichen (7 Tage, kostenlos) oder kontinuierlichen (30 Tage, kostenpflichtig) Backup-Richtlinien mit konfigurierbaren Intervallen und Aufbewahrung.
Datenverschlüsselung: Standardmäßig verwaltete Dienstschlüssel oder vom Kunden verwaltete Schlüssel (CMK) zur Verschlüsselung (CMK-Auswahl ist irreversibel).

Hauptmerkmale des vCore-Cluster-Typs

Globale Verteilung: Aktivieren Sie ein Lese-Replica in einer anderen Azure-Region für hohe Verfügbarkeit und Failover-Unterstützung. Konfigurieren Sie den Replikatnamen, die Region und den Speicher pro Shard.
Netzwerk & Sicherheit: Unterstützt den öffentlichen Zugriff mit zugewiesenen öffentlichen IPs und privaten Zugriff. Beschränken Sie Verbindungen mithilfe von Firewall-Regeln – standardmäßig sind keine öffentlichen IPs erlaubt.
Verschlüsselte Verbindungen: Erzwingt TLS-Verschlüsselung für sichere Datenübertragung.

Aufzählung

bash
# CosmoDB Account
## List Azure Cosmos DB database accounts.
az cosmosdb list --resource-group <ResourceGroupName>
az cosmosdb show --resource-group <ResourceGroupName> --name <AccountName>

## Lists the virtual network accounts associated with a Cosmos DB account
az cosmosdb network-rule list --resource-group <ResourceGroupName> --name <AccountName>
## List the access keys or connection strings for a Azure Cosmos DB
az cosmosdb keys list --name <AccountName> --resource-group <ResourceGroupName>
## List all the database accounts that can be restored.
az cosmosdb restorable-database-account list --account-name <AccountName>
## Show the identities for a Azure Cosmos DB database account.
az cosmosdb identity show --resource-group <ResourceGroupName> --name <AccountName>

## MongoDB
# List all MongoDB databases in a specified Azure Cosmos DB account
az cosmosdb mongodb database list --account-name <AccountName> --resource-group <ResourceGroupName>
# List all collections in a specific MongoDB database within an Azure Cosmos DB account
az cosmosdb mongodb collection list --account-name <AccountName> --database-name <DatabaseName> --resource-group <ResourceGroupName>

#RBAC FUNCTIONALITIES MUST BE ENABLED TO USE THIS
# List all role definitions for MongoDB within an Azure Cosmos DB account
az cosmosdb mongodb role definition list --account-name <AccountName> --resource-group <ResourceGroupName>
# List all user definitions for MongoDB within an Azure Cosmos DB account
az cosmosdb mongodb user definition list --account-name <AccountName> --resource-group <ResourceGroupName>

## MongoDB (vCore)
# Install az cli extension
az extension add --name cosmosdb-preview
# List all MongoDB databases in a specified Azure Cosmos DB account
az cosmosdb mongocluster list
az cosmosdb mongocluster show --cluster-name <name> --resource-group <ResourceGroupName>
# Get firewall rules
az cosmosdb mongocluster firewall rule list --cluster-name <name> --resource-group <ResourceGroupName>
# Connect to in
brew install mongosh
mongosh "mongodb://<username>:<password>@<account-name>.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retryWrites=false" --username <username> --password <password>

Verbindung

Der RU MongoDB-Typ in CosmoDB hat 2 Schlüsseltypen, Lese-Schreib (voll) und Nur-Lesen. Sie gewähren den angegebenen Zugriff auf alle Datenbanken, Sammlungen und Daten innerhalb des Cosmos DB-Kontos. Für das Passwort können Sie die Schlüssel oder die im Privesc-Abschnitt beschriebene Methode verwenden.

python
from pymongo import MongoClient

# Updated connection string with retryWrites=false
connection_string = "mongodb://<account-name>.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retryWrites=false"

# Create the client. The password and username is a custom one if the type is "vCore cluster".
# In case that is a Request unit (RU) the username is the account name and the password is the key of the cosomosDB account.
client = MongoClient(connection_string, username="<username>", password="<password>")

# Access the database
db = client['<database>']

# Access a collection
collection = db['<collection>']

# Insert a single document
document = {
"name": "John Doe",
"email": "johndoe@example.com",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Somewhere",
"state": "CA",
"zip": "90210"
}
}

# Insert document
result = collection.insert_one(document)
print(f"Inserted document with ID: {result.inserted_id}")

Oder einen Benutzer innerhalb des mongo verwenden:

bash
mongosh "mongodb://<myUser>:<mySecurePassword>@<account_name>.mongo.cosmos.azure.com:10255/<mymongodatabase>?ssl=true&replicaSet=globaldb&retrywrites=false"

Referenzen

Privilegieneskalation

Az - CosmosDB Privesc

Post-Exploitation

Az - SQL Post Exploitation

ToDo

  • Der Rest der DB hier, Tabellen, Cassandra, Gremlin...
  • Einen Blick auf die Post-Exploitation "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" und Rollendefinitionen werfen, da hier möglicherweise eine Privilegieneskalation vorliegt
  • Einen Blick auf Wiederherstellungen werfen

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