# Az - CosmosDB
{% hint style="success" %}
Learn & practice AWS Hacking:
[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)
\
Learn & practice GCP Hacking:
[**HackTricks Training GCP Red Team Expert (GRTE)**
](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** đŹ [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** đŠ [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
## 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 scalabilité 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 vectoriel intégré 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.
### NoSQL (sql)
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 :
{% code overflow="wrap" %}
```bash
https://.documents.azure.com:443/
```
{% endcode %}
#### 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 partager le débit provisionné entre leurs conteneurs, soit allouer un débit dédié à des conteneurs individuels.
#### Conteneurs
L'unitĂ© de base du stockage de donnĂ©es 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.
#### ĂnumĂ©ration
{% tabs %}
{% tab title="az cli" %}
{% code overflow="wrap" %}
```bash
# CosmoDB Account
## List Azure Cosmos DB database accounts.
az cosmosdb list --resource-group
az cosmosdb show --resource-group --name
## Lists the virtual network accounts associated with a Cosmos DB account
az cosmosdb network-rule list --resource-group --name
## List the access keys or connection strings for a Azure Cosmos DB
az cosmosdb keys list --name --resource-group
## List all the database accounts that can be restored.
az cosmosdb restorable-database-account list --account-name
## Show the identities for a Azure Cosmos DB database account.
az cosmosdb identity show --resource-group --name
# CosmoDB (NoSQL)
## List the SQL databases under an Azure Cosmos DB account.
az cosmosdb sql database list --resource-group --account-name
## List the SQL containers under an Azure Cosmos DB SQL database.
az cosmosdb sql container list --account-name --database-name --resource-group
## List all SQL role assignments under an Azure Cosmos DB
az cosmosdb sql role assignment list --resource-group --account-name
## List all SQL role definitions under an Azure Cosmos DB
az cosmosdb sql role definition list --resource-group --account-name
## List the SQL stored procedures under an Azure Cosmos DB
az cosmosdb sql stored-procedure list --account-name --container-name --database-name --resource-group
## List the SQL triggers under an Azure Cosmos DB SQL container.
az cosmosdb sql trigger list --account-name --container-name --database-name --resource-group
## List the SQL user defined functions under an Azure Cosmos DB SQL container
az cosmosdb sql user-defined-function list --account-name --container-name --database-name --resource-group
```
{% endcode %}
{% endtab %}
{% tab title="Az PowerShell" %}
{% code overflow="wrap" %}
```powershell
Get-Command -Module Az.CosmosD
# List all Cosmos DB accounts in a specified resource group.
Get-AzCosmosDBAccount -ResourceGroupName ""
# Get the access keys for a specific Cosmos DB account.
Get-AzCosmosDBAccountKey -ResourceGroupName "" -Name ""
# Retrieve the client encryption keys for a specific Cosmos DB account.
Get-AzCosmosDbClientEncryptionKey -ResourceGroupName "" -AccountName "" -DatabaseName ""
# List all SQL containers in a specific Cosmos DB SQL database.
Get-AzCosmosDBSqlContainer -ResourceGroupName "" -AccountName "" -DatabaseName ""
# Get backup information for a specific Cosmos DB SQL container.
Get-AzCosmosDBSqlContainerBackupInformation -ResourceGroupName "" -AccountName "" -DatabaseName "" -Name "" -Location ""
# Get the throughput (RU/s) settings for a specific Cosmos DB SQL container.
Get-AzCosmosDBSqlContainerThroughput -ResourceGroupName "" -AccountName "" -DatabaseName "" -Name ""
# List all SQL databases under a specific Cosmos DB account.
Get-AzCosmosDBSqlDatabase -ResourceGroupName "" -AccountName ""
# Get the throughput (RU/s) settings for a specific Cosmos DB SQL database.
Get-AzCosmosDBSqlDatabaseThroughput -ResourceGroupName "" -AccountName "" -Name ""
# List all SQL role assignments for a specific Cosmos DB account.
Get-AzCosmosDBSqlRoleAssignment -ResourceGroupName "" -AccountName ""
# List all SQL role definitions for a specific Cosmos DB account.
Get-AzCosmosDBSqlRoleDefinition -ResourceGroupName "" -AccountName ""
# List all stored procedures in a specific Cosmos DB SQL container.
Get-AzCosmosDBSqlStoredProcedure -ResourceGroupName "" -AccountName "" -DatabaseName "" -ContainerName ""
# List all triggers in a specific Cosmos DB SQL container.
Get-AzCosmosDBSqlTrigger -ResourceGroupName "" -AccountName "" -DatabaseName "" -ContainerName ""
# List all user-defined functions (UDFs) in a specific Cosmos DB SQL container.
Get-AzCosmosDBSqlUserDefinedFunction -ResourceGroupName "" -AccountName "" -DatabaseName "" -ContainerName ""
```
{% endcode %}
{% endtab %}
{% endtabs %}
#### Connexion
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.
{% code overflow="wrap" %}
```python
from azure.cosmos import CosmosClient, PartitionKey
# Connection details
endpoint = ""
key = ""
# Initialize Cosmos Client
client = CosmosClient(endpoint, key)
# Access existing database and container
database_name = ''
container_name = ''
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)
```
{% endcode %}
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)
{% code overflow="wrap" %}
```python
from azure.identity import DefaultAzureCredential
from azure.cosmos import CosmosClient
# Use Azure AD for authentication
credential = DefaultAzureCredential()
endpoint = ""
client = CosmosClient(endpoint, credential)
# Access database and container
database_name = ""
container_name = ""
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.")
```
{% endcode %}
### 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 :
{% code overflow="wrap" %}
```bash
mongodb://:/
```
{% endcode %}
#### 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 du stockage de 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.
#### ĂnumĂ©ration
{% tabs %}
{% tab title="az cli" %}
{% code overflow="wrap" %}
```bash
# CosmoDB Account
## List Azure Cosmos DB database accounts.
az cosmosdb list --resource-group
az cosmosdb show --resource-group --name
## Lists the virtual network accounts associated with a Cosmos DB account
az cosmosdb network-rule list --resource-group --name
## List the access keys or connection strings for a Azure Cosmos DB
az cosmosdb keys list --name --resource-group
## List all the database accounts that can be restored.
az cosmosdb restorable-database-account list --account-name
## Show the identities for a Azure Cosmos DB database account.
az cosmosdb identity show --resource-group --name
```
{% endcode %}
{% endtab %}
{% tab title="Az PowerShell" %}
{% code overflow="wrap" %}
```powershell
Get-Command -Module Az.CosmosDB
# List all Cosmos DB accounts in a specified resource group.
Get-AzCosmosDBAccount -ResourceGroupName ""
# Get the access keys for a specific Cosmos DB account.
Get-AzCosmosDBAccountKey -ResourceGroupName "" -Name ""
# Retrieve the client encryption keys for a specific Cosmos DB account.
Get-AzCosmosDbClientEncryptionKey -ResourceGroupName "" -AccountName "" -DatabaseName ""
# List all MongoDB collections in a specific database.
Get-AzCosmosDBMongoDBCollection -AccountName -ResourceGroupName -DatabaseName
# Retrieve backup information for a specific MongoDB collection in a database.
Get-AzCosmosDBMongoDBCollectionBackupInformation -AccountName -ResourceGroupName -DatabaseName -Name -Location
# Get the throughput (RU/s) of a specific MongoDB collection in a database.
Get-AzCosmosDBMongoDBCollectionThroughput -AccountName -ResourceGroupName -DatabaseName -Name
# List all MongoDB databases in a specified Cosmos DB account.
Get-AzCosmosDBMongoDBDatabase -AccountName -ResourceGroupName
# Get the throughput (RU/s) of a specific MongoDB database.
Get-AzCosmosDBMongoDBDatabaseThroughput -AccountName -ResourceGroupName -DatabaseName
# Retrieve the role definitions for MongoDB users in a specified Cosmos DB account.
Get-AzCosmosDBMongoDBRoleDefinition -AccountName -ResourceGroupName
```
{% endcode %}
{% endtab %}
{% endtabs %}
#### Connexion
Ici, le mot de passe que vous pouvez trouver avec les clés ou avec la méthode décrite dans la section privesc.
{% code overflow="wrap" %}
```python
from pymongo import MongoClient
# Updated connection string with retryWrites=false
connection_string = "mongodb://.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retryWrites=false"
# Create the client
client = MongoClient(connection_string, username="", password="")
# Access the database
db = client['']
# Access a collection
collection = db['']
# 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}")
```
{% endcode %}
## Références
* [https://learn.microsoft.com/en-us/azure/cosmos-db/choose-api](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/)
* [https://learn.microsoft.com/en-us/azure/cosmos-db/introduction](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](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
{% content-ref url="../az-privilege-escalation/az-cosmosDB-privesc.md" %}
[az-cosmosDB-privesc.md](../az-privilege-escalation/az-cosmosDB-privesc.md)
{% endcontent-ref %}
## Post Exploitation
{% content-ref url="../az-post-exploitation/az-cosmosDB-post-exploitation.md" %}
[az-cosmosDB-post-exploitation.md](../az-post-exploitation/az-sql-post-exploitation.md)
{% endcontent-ref %}
## Ă 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
{% hint style="success" %}
Apprenez et pratiquez le hacking AWS :
[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)
\
Apprenez et pratiquez le hacking GCP :
[**HackTricks Training GCP Red Team Expert (GRTE)**
](https://training.hacktricks.xyz/courses/grte)
Soutenir HackTricks
* Vérifiez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) !
* **Rejoignez le** đŹ [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** đŠ [**@hacktricks\_live**](https://twitter.com/hacktricks_live)**.**
* **Partagez des astuces de hacking en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépÎts github.
{% endhint %}