Az - CosmosDB

Reading time: 16 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Azure CosmosDB

Azure Cosmos DB é um banco de dados NoSQL, relacional e vetorial totalmente gerenciado que oferece tempos de resposta de milissegundos de um dígito, escalabilidade automática e disponibilidade respaldada por SLA com segurança de nível empresarial. Ele permite um desenvolvimento de aplicativos mais rápido por meio da distribuição de dados multi-região pronta para uso, APIs de código aberto, SDKs para linguagens populares e recursos de banco de dados de IA, como suporte integrado a vetores e integração perfeita com Azure AI.

Azure Cosmos DB fornece várias APIs de banco de dados para modelar dados do mundo real usando documentos, modelos de dados relacionais, chave-valor, gráfico e coluna-família, sendo essas APIs NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin e Table.

Um aspecto chave do CosmosDB é a Conta do Azure Cosmos. Conta do Azure Cosmos atua como o ponto de entrada para os bancos de dados. A conta determina configurações principais, como distribuição global, níveis de consistência e a API específica a ser usada, como NoSQL. Através da conta, você pode configurar a replicação global para garantir que os dados estejam disponíveis em várias regiões para acesso de baixa latência. Além disso, você pode escolher um nível de consistência que equilibre desempenho e precisão dos dados, com opções que variam de Consistência Forte a Consistência Eventual.

Azure Cosmos DB suporta identidades atribuídas pelo usuário e identidades gerenciadas atribuídas pelo sistema que são criadas automaticamente e vinculadas ao ciclo de vida do recurso. No entanto, o Cosmos DB não possui um mecanismo embutido para consultar diretamente fontes de dados externas, como o Azure Blob Storage. Ao contrário dos recursos de tabela externa do SQL Server, o Cosmos DB requer que os dados sejam ingeridos em seus contêineres usando ferramentas externas, como Azure Data Factory, o Data Migration Tool ou scripts personalizados, antes que possam ser consultados com suas capacidades nativas de consulta.

NoSQL

A API NoSQL do Azure Cosmos DB é uma API baseada em documentos que usa JSON como seu formato de dados. Ela fornece uma sintaxe de consulta semelhante ao SQL para consultar objetos JSON, tornando-a adequada para trabalhar com dados estruturados e semi-estruturados. O endpoint do serviço é:

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

Bancos de Dados

Dentro de uma conta, você pode criar um ou mais bancos de dados, que servem como agrupamentos lógicos de contêineres. Um banco de dados atua como um limite para gerenciamento de recursos e permissões de usuário. Os bancos de dados podem permitir que múltiplos contêineres usem um pool compartilhado de capacidade de desempenho ou dar a cada contêiner seu próprio poder dedicado.

Contêineres

A unidade central de armazenamento de dados é o contêiner, que contém documentos JSON e é automaticamente indexado para consultas eficientes. Os contêineres são escaláveis de forma elástica e distribuídos entre partições, que são determinadas por uma chave de partição definida pelo usuário. A chave de partição é crítica para garantir desempenho ideal e distribuição uniforme de dados. Por exemplo, um contêiner pode armazenar dados de clientes, com "customerId" como a chave de partição.

Principais Recursos

  • Distribuição Global: Ative ou desative a Geo-Redundância para replicação entre regiões e Escritas em Múltiplas Regiões para melhor disponibilidade.
  • Rede & Segurança: entre pontos de extremidade públicos (todas/seletivas) ou privados para conectividade. Conexões seguras com criptografia TLS 1.2. Suporta CORS (Cross-Origin Resource Sharing) para acesso controlado a recursos. O Microsoft Defender for Cloud pode ser ativado. Para fazer a conexão, você pode usar chaves.
  • Backup & Recuperação: de políticas de backup Periódico, Contínuo (7 dias) ou Contínuo (30 dias) com intervalos e retenção configuráveis.
  • Criptografia de Dados: Chaves gerenciadas pelo serviço padrão ou chaves gerenciadas pelo cliente (CMK) para criptografia (a seleção de CMK é irreversível).

Enumeração

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>

Conexão

Ele possui 2 tipos de chave, Leitura-escrita (completa) e Somente leitura. Elas fornecem o acesso indicado a todos os bancos de dados, coleções e dados dentro da conta do Cosmos DB. Para conectar, a biblioteca azure-cosmosDB (pip install azure-cosmos) é necessária. Além disso, o endpoint e a chave são componentes cruciais para estabelecer a conexão.

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)

Outra maneira de estabelecer uma conexão é usar o DefaultAzureCredential(). Basta fazer login (az login) com a conta que possui as permissões e executá-lo. Para este caso, uma atribuição de função deve ser feita, concedendo as permissões necessárias (veja para mais).

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

A API NoSQL do MongoDB é uma API baseada em documentos que utiliza BSON (Binary JSON) semelhante ao JSON como seu formato de dados. Ela fornece uma linguagem de consulta com capacidades de agregação, tornando-a adequada para trabalhar com dados estruturados, semi-estruturados e não estruturados. O endpoint do serviço geralmente segue este formato:

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

Bancos de Dados

No MongoDB, você pode criar um ou mais bancos de dados dentro de uma instância. Cada banco de dados serve como um agrupamento lógico de coleções e fornece um limite para a organização e gerenciamento de recursos. Os bancos de dados ajudam a separar e gerenciar dados logicamente, como para diferentes aplicações ou projetos.

Coleções

A unidade central de armazenamento de dados no MongoDB é a coleção, que contém documentos e é projetada para consultas eficientes e design de esquema flexível. As coleções são escaláveis de forma elástica e podem suportar operações de alto rendimento em vários nós em uma configuração distribuída.

Principais Recursos do tipo Unidade de Solicitação (RU)

Distribuição Global: Ativar ou desativar a Geo-Redundância para replicação entre regiões e Escritas em Múltiplas Regiões para melhor disponibilidade.
Rede & Segurança: entre pontos finais públicos (todas/seletivas) ou privados para conectividade. Conexões seguras com criptografia TLS 1.2. Suporta CORS (Compartilhamento de Recursos de Origem Cruzada) para acesso controlado a recursos. Para fazer a conexão, você pode usar chaves.
Backup & Recuperação: de políticas de backup Periódico, Contínuo (7 dias, gratuito) ou Contínuo (30 dias, pago) com intervalos e retenção configuráveis.
Criptografia de Dados: Chaves gerenciadas pelo serviço por padrão ou chaves gerenciadas pelo cliente (CMK) para criptografia (a seleção de CMK é irreversível).

Principais Recursos do tipo cluster vCore

Distribuição Global: Ativar uma réplica de leitura em outra região do Azure para alta disponibilidade e suporte a failover. Configurar o nome da réplica, região e armazenamento por shard.
Rede & Segurança: Suporta acesso público com IPs públicos atribuídos e acesso privado. Restringir conexões usando regras de firewall—por padrão, nenhum IP público é permitido.
Conexões Criptografadas: Impõe criptografia TLS para transmissão segura de dados.

Enumeração

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>

Conexão

O tipo RU MongoDB no CosmoDB tem 2 tipos de chave, Leitura-escrita (completa) e Somente leitura. Eles fornecem o acesso indicado a todos os bancos de dados, coleções e dados dentro da conta do Cosmos DB. Para a senha, você pode usar as chaves ou o método descrito na seção de 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}")

Ou usando um usuário dentro do mongo:

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

Referências

Escalação de Privilégios

Az - CosmosDB Privesc

Pós Exploração

Az - SQL Post Exploitation

ToDo

  • O restante do DB aqui, tabelas, cassandra, gremlin...
  • Dê uma olhada na pós exploração "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" e definições de função, pois aqui pode haver uma privesc
  • Dê uma olhada nas restaurações

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks