Az - CosmosDB
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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
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 :
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
# 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.
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).
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 :
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
# 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.
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 :
mongosh "mongodb://<myUser>:<mySecurePassword>@<account_name>.mongo.cosmos.azure.com:10255/<mymongodatabase>?ssl=true&replicaSet=globaldb&retrywrites=false"
Références
- https://learn.microsoft.com/en-us/azure/cosmos-db/choose-api
- https://learn.microsoft.com/en-us/azure/cosmos-db/
- https://learn.microsoft.com/en-us/azure/cosmos-db/introduction
- https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/security/how-to-grant-data-plane-role-based-access?tabs=built-in-definition%2Ccsharp&pivots=azure-interface-cli
Escalade de privilèges
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
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks Cloud

