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
- 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.