Az - CosmosDB

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez 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 :

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

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 & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks