Files
hacktricks-cloud/src/pentesting-cloud/azure-security/az-services/az-cosmosDB.md

21 KiB

Az - CosmosDB

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

Azure CosmosDB

Azure Cosmos DB es una base de datos NoSQL, relacional y vectorial completamente gestionada que ofrece tiempos de respuesta de un solo dígito en milisegundos, escalabilidad automática y disponibilidad respaldada por SLA con seguridad de nivel empresarial. Permite un desarrollo de aplicaciones más rápido a través de la distribución de datos multi-región lista para usar, APIs de código abierto, SDKs para lenguajes populares y características de bases de datos de IA como soporte de vectores integrado e integración fluida con Azure AI.

Azure Cosmos DB proporciona múltiples APIs de base de datos para modelar datos del mundo real utilizando documentos, modelos de datos relacionales, clave-valor, gráfico y de familia de columnas, siendo estas APIs NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin y Table.

Un aspecto clave de CosmosDB es la Cuenta de Azure Cosmos. Cuenta de Azure Cosmos, actúa como el punto de entrada a las bases de datos. La cuenta determina configuraciones clave como la distribución global, los niveles de consistencia y la API específica que se utilizará, como NoSQL. A través de la cuenta, puedes configurar la replicación global para asegurar que los datos estén disponibles en múltiples regiones para un acceso de baja latencia. Además, puedes elegir un nivel de consistencia que equilibre entre rendimiento y precisión de datos, con opciones que van desde Consistencia Fuerte hasta Consistencia Eventual.

Azure Cosmos DB admite identidades asignadas por el usuario e identidades gestionadas asignadas por el sistema que se crean automáticamente y están vinculadas al ciclo de vida del recurso. Sin embargo, Cosmos DB no tiene un mecanismo incorporado para consultar directamente fuentes de datos externas como Azure Blob Storage. A diferencia de las características de tablas externas de SQL Server, Cosmos DB requiere que los datos sean ingeridos en sus contenedores utilizando herramientas externas como Azure Data Factory, la Herramienta de Migración de Datos o scripts personalizados antes de que puedan ser consultados con sus capacidades de consulta nativas.

NoSQL

La API NoSQL de Azure Cosmos DB es una API basada en documentos que utiliza JSON como su formato de datos. Proporciona una sintaxis de consulta similar a SQL para consultar objetos JSON, lo que la hace adecuada para trabajar con datos estructurados y semi-estructurados. El punto final del servicio es:

https://<Account-Name>.documents.azure.com:443/

Bases de datos

Dentro de una cuenta, puedes crear una o más bases de datos, que sirven como agrupaciones lógicas de contenedores. Una base de datos actúa como un límite para la gestión de recursos y permisos de usuario. Las bases de datos pueden permitir que múltiples contenedores utilicen un pool compartido de capacidad de rendimiento o dar a cada contenedor su propia potencia dedicada.

Contenedores

La unidad central de almacenamiento de datos es el contenedor, que contiene documentos JSON y se indexa automáticamente para consultas eficientes. Los contenedores son escalables de manera elástica y se distribuyen a través de particiones, que son determinadas por una clave de partición definida por el usuario. La clave de partición es crítica para garantizar un rendimiento óptimo y una distribución equitativa de los datos. Por ejemplo, un contenedor podría almacenar datos de clientes, con "customerId" como la clave de partición.

Características clave

  • Distribución global: Habilitar o deshabilitar la Geo-Redundancia para la replicación entre regiones y Escrituras en múltiples regiones para mejorar la disponibilidad.
  • Redes y seguridad: entre puntos finales públicos (todos/redes seleccionadas) o privados para conectividad. Conexiones seguras con cifrado TLS 1.2. Soporta CORS (Cross-Origin Resource Sharing) para acceso controlado a recursos. Microsoft Defender for Cloud puede ser habilitado. Para realizar la conexión, puedes hacer uso de claves.
  • Copia de seguridad y recuperación: de políticas de copia de seguridad Periódicas, Continuas (7 días) o Continuas (30 días) con intervalos y retención configurables.
  • Cifrado de datos: Claves gestionadas por el servicio por defecto o claves gestionadas por el cliente (CMK) para cifrado (la selección de CMK es irreversible).

Enumeración

{{#tabs }} {{#tab name="az cli" }}

# 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" }}

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

Conexión

Tiene 2 tipos de clave, Lectura-escritura (completa) y Solo lectura. Proporcionan el acceso indicado a todas las bases de datos, colecciones y datos dentro de la cuenta de Cosmos DB. Para conectarse, se necesita la biblioteca azure-cosmosDB (pip install azure-cosmos). Además, el endpoint y la clave son componentes cruciales para establecer la conexión.

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)

Otra forma de establecer una conexión es usar DefaultAzureCredential(). Solo necesitas iniciar sesión (az login) con la cuenta que tiene los permisos y ejecutarlo. Para este caso, se debe realizar una asignación de rol, otorgando los permisos necesarios (ver para más).

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

La API NoSQL de MongoDB es una API basada en documentos que utiliza BSON (Binary JSON) similar a JSON como su formato de datos. Proporciona un lenguaje de consulta con capacidades de agregación, lo que la hace adecuada para trabajar con datos estructurados, semi-estructurados y no estructurados. El endpoint del servicio generalmente sigue este formato:

mongodb://<hostname>:<port>/<database>

Bases de datos

En MongoDB, puedes crear una o más bases de datos dentro de una instancia. Cada base de datos sirve como un agrupamiento lógico de colecciones y proporciona un límite para la organización y gestión de recursos. Las bases de datos ayudan a separar y gestionar datos lógicamente, como para diferentes aplicaciones o proyectos.

Colecciones

La unidad central de almacenamiento de datos en MongoDB es la colección, que contiene documentos y está diseñada para consultas eficientes y un diseño de esquema flexible. Las colecciones son escalables de manera elástica y pueden soportar operaciones de alto rendimiento en múltiples nodos en una configuración distribuida.

Características clave del tipo de unidad de solicitud (RU)

Distribución Global: Habilitar o deshabilitar la Geo-Redundancia para la replicación entre regiones y Escrituras en Múltiples Regiones para mejorar la disponibilidad.
Redes y Seguridad: entre puntos finales públicos (todos/seleccionar redes) o privados para conectividad. Conexiones seguras con cifrado TLS 1.2. Soporta CORS (Intercambio de Recursos de Origen Cruzado) para acceso controlado a recursos. Para realizar la conexión, puedes hacer uso de claves.
Copia de seguridad y recuperación: de políticas de copia de seguridad Periódicas, Continuas (7 días, gratis) o Continuas (30 días, de pago) con intervalos y retención configurables.
Cifrado de datos: Claves gestionadas por el servicio por defecto o claves gestionadas por el cliente (CMK) para cifrado (la selección de CMK es irreversible).

Características clave del tipo de clúster vCore

Distribución Global: Habilitar una réplica de lectura en otra región de Azure para alta disponibilidad y soporte de conmutación por error. Configurar el nombre de la réplica, la región y el almacenamiento por fragmento.
Redes y Seguridad: Soporta acceso público con IPs públicas asignadas y acceso privado. Restringir conexiones utilizando reglas de firewall; por defecto, no se permiten IPs públicas.
Conexiones Encriptadas: Impone cifrado TLS para la transmisión segura de datos.

Enumeración

{{#tabs }} {{#tab name="az cli" }}

# 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" }}

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

Conexión

El tipo RU MongoDB en CosmoDB tiene 2 tipos de clave, Lectura-escritura (completa) y Solo lectura. Proporcionan el acceso indicado a todas las bases de datos, colecciones y datos dentro de la cuenta de Cosmos DB. Para la contraseña, puedes usar las claves o el método descrito en la sección de 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}")

O usando un usuario dentro del mongo:

mongosh "mongodb://<myUser>:<mySecurePassword>@<account_name>.mongo.cosmos.azure.com:10255/<mymongodatabase>?ssl=true&replicaSet=globaldb&retrywrites=false"

Referencias

Escalación de Privilegios

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

Post Explotación

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

ToDo

  • El resto de la DB aquí, tablas, cassandra, gremlin...
  • Echar un vistazo a la post explotación "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" y definiciones de roles porque aquí podría haber una escalación de privilegios
  • Echar un vistazo a las restauraciones

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