Az - CosmosDB

Reading time: 16 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Azure CosmosDB

Azure Cosmos DB est une base de données NoSQL, relationnelle et vectorielle entiÚrement gérée offrant des temps de réponse en millisecondes à un chiffre, une évolutivité automatique et une disponibilité soutenue par un SLA avec une sécurité de niveau entreprise. Elle permet un développement d'applications plus rapide grùce à une distribution de données multi-régions clé en main, des API open-source, des SDK pour des langages populaires, et des fonctionnalités de base de données AI comme le support intégré des vecteurs et une intégration transparente avec Azure AI.

Azure Cosmos DB fournit plusieurs API de base de données pour modéliser des données du monde réel en utilisant des documents, des modÚles de données relationnels, clé-valeur, graphes et familles de colonnes, ces API étant NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin et Table.

Un aspect clé de CosmosDB est le Compte Azure Cosmos. Le Compte Azure Cosmos agit comme le point d'entrée vers les bases de données. Le compte détermine des paramÚtres clés tels que la distribution mondiale, les niveaux de cohérence et l'API spécifique à utiliser, comme NoSQL. Grùce au compte, vous pouvez configurer la réplication mondiale pour garantir que les données sont disponibles dans plusieurs régions pour un accÚs à faible latence. De plus, vous pouvez choisir un niveau de cohérence qui équilibre performance et précision des données, avec des options allant de la cohérence forte à la cohérence éventuelle.

Azure Cosmos DB prend en charge les identitĂ©s assignĂ©es par l'utilisateur et les identitĂ©s gĂ©rĂ©es assignĂ©es par le systĂšme qui sont automatiquement créées et liĂ©es au cycle de vie de la ressource. Cependant, Cosmos DB n'a pas de mĂ©canisme intĂ©grĂ© pour interroger directement des sources de donnĂ©es externes comme Azure Blob Storage. Contrairement aux fonctionnalitĂ©s de table externe de SQL Server, Cosmos DB nĂ©cessite que les donnĂ©es soient ingĂ©rĂ©es dans ses conteneurs Ă  l'aide d'outils externes tels qu'Azure Data Factory, l'outil de migration de donnĂ©es ou des scripts personnalisĂ©s avant qu'elles puissent ĂȘtre interrogĂ©es avec ses capacitĂ©s de requĂȘte natives.

NoSQL

L'API NoSQL d'Azure Cosmos DB est une API basĂ©e sur des documents qui utilise JSON comme format de donnĂ©es. Elle fournit une syntaxe de requĂȘte similaire Ă  SQL pour interroger des objets JSON, ce qui la rend adaptĂ©e au travail avec des donnĂ©es structurĂ©es et semi-structurĂ©es. Le point de terminaison du service est :

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

Bases de données

Dans un compte, vous pouvez créer une ou plusieurs bases de données, qui servent de regroupements logiques de conteneurs. Une base de données agit comme une limite pour la gestion des ressources et les autorisations des utilisateurs. Les bases de données peuvent soit permettre à plusieurs conteneurs d'utiliser un pool partagé de capacité de performance, soit donner à chaque conteneur sa propre puissance dédiée.

Conteneurs

L'unitĂ© de stockage de donnĂ©es de base est le conteneur, qui contient des documents JSON et est automatiquement indexĂ© pour des requĂȘtes efficaces. Les conteneurs sont Ă©lastiquement Ă©volutifs et distribuĂ©s sur des partitions, qui sont dĂ©terminĂ©es par une clĂ© de partition dĂ©finie par l'utilisateur. La clĂ© de partition est essentielle pour garantir des performances optimales et une distribution uniforme des donnĂ©es. Par exemple, un conteneur pourrait stocker des donnĂ©es clients, avec "customerId" comme clĂ© de partition.

Caractéristiques clés

  • Distribution mondiale : Activer ou dĂ©sactiver la gĂ©o-redondance pour la rĂ©plication inter-rĂ©gions et les Ă©critures multi-rĂ©gions pour une disponibilitĂ© amĂ©liorĂ©e.
  • RĂ©seautage et sĂ©curitĂ© : entre des points de terminaison publics (tous/choisir des rĂ©seaux) ou privĂ©s pour la connectivitĂ©. Connexions sĂ©curisĂ©es avec un chiffrement TLS 1.2. Prend en charge CORS (Cross-Origin Resource Sharing) pour un accĂšs contrĂŽlĂ© aux ressources. Microsoft Defender for Cloud peut ĂȘtre activĂ©. Pour Ă©tablir la connexion, vous pouvez utiliser des clĂ©s.
  • Sauvegarde et rĂ©cupĂ©ration : Ă  partir de politiques de sauvegarde pĂ©riodiques, continues (7 jours) ou continues (30 jours) avec des intervalles et une rĂ©tention configurables.
  • Chiffrement des donnĂ©es : ClĂ©s gĂ©rĂ©es par le service par dĂ©faut ou clĂ©s gĂ©rĂ©es par le client (CMK) pour le chiffrement (la sĂ©lection de CMK est irrĂ©versible).

ÉnumĂ©ration

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>

Connexion

Il existe 2 types de clés, Lecture-écriture (complÚte) et Lecture seule. Elles donnent l'accÚs indiqué à toutes les bases de données, collections et données à l'intérieur du compte Cosmos DB. Pour se connecter, la bibliothÚque azure-cosmosDB (pip install azure-cosmos) est nécessaire. De plus, le point de terminaison et la clé sont des composants cruciaux pour établir la connexion.

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)

Une autre façon d'Ă©tablir une connexion est d'utiliser le DefaultAzureCredential(). Il suffit de se connecter (az login) avec le compte qui a les permissions et de l'exĂ©cuter. Dans ce cas, une attribution de rĂŽle doit ĂȘtre effectuĂ©e, en donnant les permissions nĂ©cessaires (voir pour plus).

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

L'API NoSQL MongoDB est une API basĂ©e sur des documents qui utilise BSON (Binary JSON) semblable Ă  JSON comme format de donnĂ©es. Elle fournit un langage de requĂȘte avec des capacitĂ©s d'agrĂ©gation, ce qui la rend adaptĂ©e au travail avec des donnĂ©es structurĂ©es, semi-structurĂ©es et non structurĂ©es. L'endpoint du service suit gĂ©nĂ©ralement ce format :

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

Bases de données

Dans MongoDB, vous pouvez créer une ou plusieurs bases de données au sein d'une instance. Chaque base de données sert de regroupement logique de collections et fournit une limite pour l'organisation et la gestion des ressources. Les bases de données aident à séparer et gérer les données de maniÚre logique, par exemple pour différentes applications ou projets.

Collections

L'unitĂ© de base de stockage des donnĂ©es dans MongoDB est la collection, qui contient des documents et est conçue pour des requĂȘtes efficaces et un design de schĂ©ma flexible. Les collections sont Ă©lastiquement Ă©volutives et peuvent prendre en charge des opĂ©rations Ă  haut dĂ©bit sur plusieurs nƓuds dans une configuration distribuĂ©e.

Caractéristiques clés du type Request unit (RU)

Distribution mondiale : Activer ou désactiver la géo-redondance pour la réplication inter-régions et les écritures multi-régions pour une disponibilité améliorée.
Réseautage et sécurité : entre des points de terminaison publics (tous / sélectionnés) ou privés pour la connectivité. Connexions sécurisées avec cryptage TLS 1.2. Prend en charge CORS (Cross-Origin Resource Sharing) pour un accÚs contrÎlé aux ressources. Pour établir la connexion, vous pouvez utiliser des clés.
Sauvegarde et récupération : à partir de politiques de sauvegarde périodiques, continues (7 jours, gratuites) ou continues (30 jours, payantes) avec des intervalles et une rétention configurables.
Chiffrement des données : Clés gérées par le service par défaut ou clés gérées par le client (CMK) pour le chiffrement (la sélection de CMK est irréversible).

Caractéristiques clés du type vCore cluster

Distribution mondiale : Activer un réplicat de lecture dans une autre région Azure pour une haute disponibilité et un support de basculement. Configurer le nom du réplicat, la région et le stockage par shard.
RĂ©seautage et sĂ©curitĂ© : Prend en charge l'accĂšs public avec des IP publiques assignĂ©es et l'accĂšs privĂ©. Restreindre les connexions Ă  l'aide de rĂšgles de pare-feu—par dĂ©faut, aucune IP publique n'est autorisĂ©e.
Connexions chiffrées : Imposer le chiffrement TLS pour une transmission sécurisée des données.

ÉnumĂ©ration

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>

Connexion

Le type RU MongoDB dans CosmoDB a 2 types de clés, Lecture-écriture (complÚte) et Lecture seule. Ils donnent l'accÚs indiqué à toutes les bases de données, collections et données à l'intérieur du compte Cosmos DB. Pour le mot de passe, vous pouvez utiliser les clés ou avec la méthode décrite dans la section privesc.

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}")

Ou en utilisant un utilisateur dans le mongo :

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

Références

Escalade de privilĂšges

Az - CosmosDB Privesc

Post exploitation

Az - SQL Post Exploitation

À faire

  • Le reste de la DB ici, tables, cassandra, gremlin...
  • Jetez un Ɠil Ă  la post exploitation "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" et aux dĂ©finitions de rĂŽle car ici il pourrait y avoir une escalade de privilĂšges
  • Jetez un Ɠil aux restaurations

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks