Az - CosmosDB
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
Azure CosmosDB
Azure Cosmos DB to w pełni zarządzana baza danych NoSQL, relacyjna i wektorowa, oferująca czasy odpowiedzi w milisekundach z jedną cyfrą, automatyczną skalowalność i dostępność wspieraną SLA z bezpieczeństwem na poziomie przedsiębiorstwa. Umożliwia szybszy rozwój aplikacji dzięki gotowej dystrybucji danych w wielu regionach, otwartym API, SDK dla popularnych języków oraz funkcjom bazy danych AI, takim jak zintegrowane wsparcie dla wektorów i bezproblemowa integracja z Azure AI.
Azure Cosmos DB oferuje wiele API baz danych do modelowania danych ze świata rzeczywistego przy użyciu modeli danych dokumentowych, relacyjnych, klucz-wartość, grafowych i kolumnowych, a te API to NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin i Table.
Jednym z kluczowych aspektów CosmosDB jest Azure Cosmos Account. Azure Cosmos Account działa jako punkt wejścia do baz danych. Konto określa kluczowe ustawienia, takie jak globalna dystrybucja, poziomy spójności oraz konkretne API, które ma być używane, takie jak NoSQL. Dzięki kontu można skonfigurować globalną replikację, aby zapewnić dostępność danych w wielu regionach dla niskolatencyjnego dostępu. Dodatkowo można wybrać poziom spójności, który równoważy wydajność i dokładność danych, z opcjami od silnej do ostatecznej spójności.
Azure Cosmos DB obsługuje tożsamości przypisane przez użytkownika oraz tożsamości zarządzane przypisane przez system, które są automatycznie tworzone i powiązane z cyklem życia zasobu. Jednak Cosmos DB nie ma wbudowanego mechanizmu do bezpośredniego zapytania zewnętrznych źródeł danych, takich jak Azure Blob Storage. W przeciwieństwie do funkcji zewnętrznych tabel SQL Server, Cosmos DB wymaga, aby dane były wprowadzane do jego kontenerów za pomocą zewnętrznych narzędzi, takich jak Azure Data Factory, Data Migration Tool lub niestandardowe skrypty, zanim będzie można je zapytać za pomocą jego natywnych możliwości zapytań.
NoSQL
API NoSQL Azure Cosmos DB to API oparte na dokumentach, które używa JSON jako formatu danych. Oferuje składnię zapytań podobną do SQL do zapytań obiektów JSON, co czyni je odpowiednim do pracy z danymi strukturalnymi i półstrukturalnymi. Punkt końcowy usługi to:
https://<Account-Name>.documents.azure.com:443/
Bazy danych
W ramach konta możesz utworzyć jedną lub więcej baz danych, które służą jako logiczne grupy kontenerów. Baza danych działa jako granica dla zarządzania zasobami i uprawnieniami użytkowników. Bazy danych mogą pozwalać wielu kontenerom na korzystanie ze wspólnej puli wydajności lub przydzielać każdemu kontenerowi własną dedykowaną moc.
Kontenery
Podstawową jednostką przechowywania danych jest kontener, który przechowuje dokumenty JSON i jest automatycznie indeksowany w celu efektywnego zapytania. Kontenery są elastycznie skalowalne i rozproszone w obrębie partycji, które są określane przez klucz partycji zdefiniowany przez użytkownika. Klucz partycji jest kluczowy dla zapewnienia optymalnej wydajności i równomiernego rozkładu danych. Na przykład, kontener może przechowywać dane klientów, z “customerId” jako kluczem partycji.
Kluczowe cechy
- Globalna dystrybucja: Włącz lub wyłącz Geo-Redundancy dla replikacji międzyregionowej i Multi-region Writes dla poprawy dostępności.
- Sieć i bezpieczeństwo: między publicznymi (wszystkie/wybrane sieci) lub prywatnymi punktami końcowymi dla łączności. Bezpieczne połączenia z szyfrowaniem TLS 1.2. Obsługuje CORS (Cross-Origin Resource Sharing) dla kontrolowanego dostępu do zasobów. Microsoft Defender for Cloud może być włączony. Aby nawiązać połączenie, możesz skorzystać z kluczy.
- Kopia zapasowa i odzyskiwanie: z polityk kopii zapasowej okresowej, ciągłej (7 dni) lub ciągłej (30 dni) z konfigurowalnymi interwałami i retencją.
- Szyfrowanie danych: Domyślne klucze zarządzane przez usługę lub klucze zarządzane przez klienta (CMK) do szyfrowania (wybór CMK jest nieodwracalny).
Enumeracja
# 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>
Połączenie
Ma 2 typy kluczy: Read-write (pełny) i Read-only. Dają one wskazany dostęp do wszystkich baz danych, kolekcji i danych wewnątrz konta Cosmos DB. Aby połączyć się, potrzebna jest biblioteka azure-cosmosDB (pip install azure-cosmos). Dodatkowo, punkt końcowy i klucz są kluczowymi komponentami do nawiązania połączenia.
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)
Innym sposobem na nawiązanie połączenia jest użycie DefaultAzureCredential(). Wystarczy zalogować się (az login) za pomocą konta, które ma odpowiednie uprawnienia i je wykonać. W tym przypadku należy przypisać rolę, nadając niezbędne uprawnienia (zobacz więcej).
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
API NoSQL MongoDB to API oparty na dokumentach, który używa formatu danych BSON (Binary JSON) podobnego do JSON. Oferuje język zapytań z możliwościami agregacji, co czyni go odpowiednim do pracy z danymi strukturalnymi, półstrukturalnymi i niestrukturalnymi. Punkt końcowy usługi zazwyczaj ma ten format:
mongodb://<hostname>:<port>/<database>
Bazy danych
W MongoDB możesz tworzyć jedną lub więcej baz danych w ramach instancji. Każda baza danych służy jako logiczna grupa kolekcji i zapewnia granicę dla organizacji i zarządzania zasobami. Bazy danych pomagają w logicznym oddzieleniu i zarządzaniu danymi, na przykład dla różnych aplikacji lub projektów.
Kolekcje
Podstawową jednostką przechowywania danych w MongoDB jest kolekcja, która zawiera dokumenty i jest zaprojektowana do efektywnego zapytywania oraz elastycznego projektowania schematów. Kolekcje są elastycznie skalowalne i mogą obsługiwać operacje o wysokiej przepustowości w rozproszonym środowisku.
Kluczowe cechy typu jednostki żądania (RU)
Globalna dystrybucja: Włącz lub wyłącz Geo-Redundancy dla replikacji międzyregionowej i Multi-region Writes dla poprawy dostępności.
Sieć i bezpieczeństwo: między publicznymi (wszystkie/wybrane sieci) lub prywatnymi punktami końcowymi dla łączności. Bezpieczne połączenia z szyfrowaniem TLS 1.2. Obsługuje CORS (Cross-Origin Resource Sharing) dla kontrolowanego dostępu do zasobów. Aby nawiązać połączenie, możesz skorzystać z kluczy.
Kopia zapasowa i odzyskiwanie: z polityk kopii zapasowej okresowej, ciągłej (7 dni, darmowa) lub ciągłej (30 dni, płatna) z konfigurowalnymi interwałami i retencją.
Szyfrowanie danych: Domyślne klucze zarządzane przez usługę lub klucze zarządzane przez klienta (CMK) do szyfrowania (wybór CMK jest nieodwracalny).
Kluczowe cechy typu klastra vCore
Globalna dystrybucja: Włącz replikę do odczytu w innym regionie Azure dla wysokiej dostępności i wsparcia w przypadku awarii. Skonfiguruj nazwę repliki, region i pamięć na shard.
Sieć i bezpieczeństwo: Obsługuje dostęp publiczny z przypisanymi publicznymi adresami IP oraz dostęp prywatny. Ogranicz połączenia za pomocą reguł zapory—domyślnie nie są dozwolone żadne publiczne adresy IP.
Szyfrowane połączenia: Wymusza szyfrowanie TLS dla bezpiecznej transmisji danych.
Enumeracja
# 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>
Połączenie
Typ MongoDB RU w CosmoDB ma 2 typy kluczy: Read-write (pełny) i Read-only. Dają one wskazany dostęp do wszystkich baz danych, kolekcji i danych wewnątrz konta Cosmos DB. Do hasła możesz użyć kluczy lub metody opisanej w sekcji 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}")
Lub używając użytkownika w mongo:
mongosh "mongodb://<myUser>:<mySecurePassword>@<account_name>.mongo.cosmos.azure.com:10255/<mymongodatabase>?ssl=true&replicaSet=globaldb&retrywrites=false"
Odniesienia
- 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
Eskalacja Uprawnień
Po Eksploatacji
Do Zrobienia
- Reszta bazy danych tutaj, tabele, cassandra, gremlin…
- Zobacz post eksploatacji “Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write” && “Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read” oraz definicje ról, ponieważ tutaj może być eskalacja uprawnień
- Zobacz przywrócenia
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

