# Az - CosmosDB

{{#include ../../../banners/hacktricks-training.md}}

## Azure CosmosDB

**Azure Cosmos DB** je potpuno **upravljana NoSQL, relacijska i vektorska baza podataka** koja nudi vreme odziva u milisekundama sa jednim cifrom, automatsku skalabilnost i dostupnost podržanu SLA-om uz sigurnost na nivou preduzeća. Omogućava brži razvoj aplikacija kroz ključne višeregionalne distribucije podataka, open-source API-je, SDK-ove za popularne jezike i AI funkcije baze podataka kao što su integrisana podrška za vektore i besprekorno Azure AI integrisanje.

Azure Cosmos DB pruža više API-ja za baze podataka kako bi modelovao podatke iz stvarnog sveta koristeći dokumente, relacione, ključ-vrednost, grafičke i kolone-porodice modele podataka, a ti API-ji su NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin i Table.

Jedan ključni aspekt CosmosDB-a je Azure Cosmos Account. **Azure Cosmos Account** deluje kao ulazna tačka za baze podataka. Račun određuje ključne postavke kao što su globalna distribucija, nivoi konzistentnosti i specifični API koji će se koristiti, kao što je NoSQL. Kroz račun možete konfigurisati globalnu replikaciju kako biste osigurali da su podaci dostupni u više regiona za pristup sa niskom latencijom. Pored toga, možete odabrati nivo konzistentnosti koji balansira između performansi i tačnosti podataka, sa opcijama koje se kreću od jake do eventualne konzistentnosti.

Azure Cosmos DB podržava **identitete dodeljene korisnicima** i **identitete dodeljene sistemu** koji se automatski kreiraju i vezuju za životni ciklus resursa. Međutim, Cosmos DB nema ugrađeni mehanizam za direktno upitivanje spoljašnjih izvora podataka kao što je Azure Blob Storage. Za razliku od funkcija spoljašnjih tabela SQL Server-a, Cosmos DB zahteva da se podaci unesu u njene kontejnere koristeći spoljne alate kao što su Azure Data Factory, Data Migration Tool ili prilagođeni skripti pre nego što se mogu upititi njenim izvorim mogućnostima upita.

### NoSQL
Azure Cosmos DB NoSQL API je API zasnovan na dokumentima koji koristi JSON kao svoj format podataka. Pruža SQL-sličnu sintaksu upita za upitovanje JSON objekata, što ga čini pogodnim za rad sa strukturiranim i polu-strukturiranim podacima. Krajnja tačka usluge je:
```bash
https://<Account-Name>.documents.azure.com:443/
```
#### Baze podataka
Unutar naloga, možete kreirati jednu ili više baza podataka, koje služe kao logičke grupe kontejnera. Baza podataka deluje kao granica za upravljanje resursima i korisničkim dozvolama. Baze podataka mogu ili omogućiti više kontejnera da koriste zajednički kapacitet performansi ili dati svakom kontejneru svoju posvećenu snagu.

#### Kontejneri
Osnovna jedinica skladištenja podataka je kontejner, koji sadrži JSON dokumente i automatski se indeksira za efikasno pretraživanje. Kontejneri su elastično skalabilni i distribuirani preko particija, koje određuje korisnički definisani ključ particije. Ključ particije je ključan za osiguranje optimalnih performansi i ravnomernu distribuciju podataka. Na primer, kontejner može čuvati podatke o kupcima, sa "customerId" kao ključem particije.

#### Ključne karakteristike
- **Globalna distribucija**: Omogućite ili onemogućite Geo-redundanciju za replikaciju između regiona i višeregionalne pisanje za poboljšanu dostupnost.
- **Mreža i bezbednost**: između javnih (svi/izabrane mreže) ili privatnih krajnjih tačaka za povezivanje. Sigurne veze sa TLS 1.2 enkripcijom. Podržava CORS (Cross-Origin Resource Sharing) za kontrolisani pristup resursima. Microsoft Defender za Cloud može biti omogućen. Da biste uspostavili vezu, možete koristiti ključeve.
- **Backup i oporavak**: iz Periodičnih, Kontinuiranih (7 dana) ili Kontinuiranih (30 dana) politika rezervnih kopija sa konfigurisanim intervalima i zadržavanjem.
- **Enkripcija podataka**: Podrazumevani ključevi koje upravlja servis ili ključevi koje upravlja korisnik (CMK) za enkripciju (izbor CMK je nepovratan).

#### Enumeracija

{{#tabs }}
{{#tab name="az cli" }}
```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>

```
{{#endtab }}

{{#tab name="Az Powershell" }}
```bash
Get-Command -Module Az.CosmosD

# List all Cosmos DB accounts in a specified resource group.
Get-AzCosmosDBAccount -ResourceGroupName "<ResourceGroupName>"

# Get the access keys for a specific Cosmos DB account.
Get-AzCosmosDBAccountKey -ResourceGroupName "<ResourceGroupName>" -Name "<AccountName>"

# Retrieve the client encryption keys for a specific Cosmos DB account.
Get-AzCosmosDbClientEncryptionKey -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>"

# List all SQL containers in a specific Cosmos DB SQL database.
Get-AzCosmosDBSqlContainer -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>"

# Get backup information for a specific Cosmos DB SQL container.
Get-AzCosmosDBSqlContainerBackupInformation -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>" -Name "<ContainerName>" -Location "<location>"

# Get the throughput (RU/s) settings for a specific Cosmos DB SQL container.
Get-AzCosmosDBSqlContainerThroughput -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>" -Name "<ContainerName>"

# List all SQL databases under a specific Cosmos DB account.
Get-AzCosmosDBSqlDatabase -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>"

# Get the throughput (RU/s) settings for a specific Cosmos DB SQL database.
Get-AzCosmosDBSqlDatabaseThroughput -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -Name "<DatabaseName>"

# List all SQL role assignments for a specific Cosmos DB account.
Get-AzCosmosDBSqlRoleAssignment -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>"

# List all SQL role definitions for a specific Cosmos DB account.
Get-AzCosmosDBSqlRoleDefinition -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>"

# List all stored procedures in a specific Cosmos DB SQL container.
Get-AzCosmosDBSqlStoredProcedure -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>" -ContainerName "<ContainerName>"

# List all triggers in a specific Cosmos DB SQL container.
Get-AzCosmosDBSqlTrigger -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>" -ContainerName "<ContainerName>"

# List all user-defined functions (UDFs) in a specific Cosmos DB SQL container.
Get-AzCosmosDBSqlUserDefinedFunction -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>" -ContainerName "<ContainerName>"
```
{{#endtab }}
{{#endtabs }}

#### Konekcija

Ima 2 tipa ključeva, Read-write (puni) i Read-only. Oni daju naznačen pristup svim bazama podataka, kolekcijama i podacima unutar Cosmos DB naloga. 
Za povezivanje je potrebna azure-cosmosDB biblioteka (pip install azure-cosmos). Pored toga, krajnja tačka i ključ su ključne komponente za uspostavljanje veze.
```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)
```
Drugi način uspostavljanja veze je korišćenje **DefaultAzureCredential()**. Samo je potrebno prijaviti se (az login) sa nalogom koji ima dozvole i izvršiti ga. U ovom slučaju, mora se izvršiti dodeljivanje uloge, dajući potrebne dozvole (vidi za više).
```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
MongoDB NoSQL API je API zasnovan na dokumentima koji koristi JSON-sličan BSON (Binary JSON) kao svoj format podataka. Pruža jezik upita sa mogućnostima agregacije, što ga čini pogodnim za rad sa strukturiranim, polu-strukturiranim i nestrukturiranim podacima. Krajnja tačka usluge obično prati ovaj format:
```bash
mongodb://<hostname>:<port>/<database>
```
#### Baze podataka
U MongoDB-u možete kreirati jednu ili više baza podataka unutar instance. Svaka baza podataka služi kao logička grupa kolekcija i pruža granicu za organizaciju i upravljanje resursima. Baze podataka pomažu u logičkom razdvajanju i upravljanju podacima, kao što su različite aplikacije ili projekti.

#### Kolekcije
Osnovna jedinica skladištenja podataka u MongoDB-u je kolekcija, koja sadrži dokumente i dizajnirana je za efikasno pretraživanje i fleksibilan dizajn sheme. Kolekcije su elastično skalabilne i mogu podržati operacije sa visokim protokom preko više čvorova u distribuiranom okruženju.

#### Ključne karakteristike tipa Request unit (RU)
**Globalna distribucija**: Omogućite ili onemogućite Geo-redundanciju za replikaciju između regiona i Multi-region Writes za poboljšanu dostupnost.  
**Mrežno povezivanje i bezbednost**: između javnih (svi/izabrani mreže) ili privatnih krajnjih tačaka za povezivanje. Sigurne veze sa TLS 1.2 enkripcijom. Podržava CORS (Cross-Origin Resource Sharing) za kontrolisani pristup resursima. Da biste uspostavili vezu, možete koristiti ključeve.  
**Backup i oporavak**: iz Periodičnih, Kontinuiranih (7 dana, besplatno) ili Kontinuiranih (30 dana, plaćeno) politika rezervnih kopija sa konfigurisanim intervalima i zadržavanjem.  
**Enkripcija podataka**: Podrazumevani ključevi koje upravlja servis ili ključevi koje upravlja korisnik (CMK) za enkripciju (izbor CMK-a je nepovratan).

#### Ključne karakteristike tipa vCore klaster
**Globalna distribucija**: Omogućite čitanje replike u drugom Azure regionu za visoku dostupnost i podršku za prebacivanje. Konfigurišite ime replike, region i skladište po shard-u.  
**Mrežno povezivanje i bezbednost**: Podržava javni pristup sa dodeljenim javnim IP adresama i privatni pristup. Ograničite veze koristeći pravila vatrozida—podrazumevano, javne IP adrese nisu dozvoljene.  
**Enkriptovane veze**: Sprovodi TLS enkripciju za sigurnu transmisiju podataka.

#### Enumeracija

{{#tabs }}
{{#tab name="az cli" }}
```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>
```
{{#endtab }}

{{#tab name="Az Powershell" }}
```bash
Get-Command -Module Az.CosmosDB

# List all Cosmos DB accounts in a specified resource group.
Get-AzCosmosDBAccount -ResourceGroupName "<ResourceGroupName>"

# Get the access keys for a specific Cosmos DB account.
Get-AzCosmosDBAccountKey -ResourceGroupName "<ResourceGroupName>" -Name "<AccountName>"

# Retrieve the client encryption keys for a specific Cosmos DB account.
Get-AzCosmosDbClientEncryptionKey -ResourceGroupName "<ResourceGroupName>" -AccountName "<AccountName>" -DatabaseName "<DatabaseName>"

# List all MongoDB collections in a specific database.
Get-AzCosmosDBMongoDBCollection -AccountName <account-name> -ResourceGroupName <resource-group-name> -DatabaseName <database-name>

# Retrieve backup information for a specific MongoDB collection in a database.
Get-AzCosmosDBMongoDBCollectionBackupInformation -AccountName <account-name> -ResourceGroupName <resource-group-name> -DatabaseName <database-name> -Name <collection-name> -Location <Location>

# Get the throughput (RU/s) of a specific MongoDB collection in a database.
Get-AzCosmosDBMongoDBCollectionThroughput -AccountName <account-name> -ResourceGroupName <resource-group-name> -DatabaseName <database-name> -Name <collection-name>

# List all MongoDB databases in a specified Cosmos DB account.
Get-AzCosmosDBMongoDBDatabase -AccountName <account-name> -ResourceGroupName <resource-group-name>

# Get the throughput (RU/s) of a specific MongoDB database.
Get-AzCosmosDBMongoDBDatabaseThroughput -AccountName <account-name> -ResourceGroupName <resource-group-name> -DatabaseName <database-name>

# Retrieve the role definitions for MongoDB users in a specified Cosmos DB account.
Get-AzCosmosDBMongoDBRoleDefinition -AccountName <account-name> -ResourceGroupName <resource-group-name>

```
{{#endtab }}
{{#endtabs }}

#### Veza

RU MongoDB tip u CosmoDB ima 2 tipa ključeva, Read-write (puno) i Read-only. Oni daju navedeni pristup svim bazama podataka, kolekcijama i podacima unutar Cosmos DB naloga. 
Za lozinku možete koristiti ključeve ili metodu opisanu u sekciji 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}")
```
Ili korišćenjem korisnika unutar mongo:
```bash
mongosh "mongodb://<myUser>:<mySecurePassword>@<account_name>.mongo.cosmos.azure.com:10255/<mymongodatabase>?ssl=true&replicaSet=globaldb&retrywrites=false"
```
## Reference

- [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)

## Eskalacija privilegija

{{#ref}}
../az-privilege-escalation/az-cosmosDB-privesc.md
{{#endref}}

## Post Eksploatacija

{{#ref}}
../az-post-exploitation/az-sql-post-exploitation.md
{{#endref}}

## ToDo

* Ostatak DB ovde, tabele, cassandra, gremlin...
* Pogledajte post eksploataciju "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" i definicije uloga jer ovde može biti eskalacija privilegija
* Pogledajte restoracije

{{#include ../../../banners/hacktricks-training.md}}
