Az - CosmosDB
Reading time: 15 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Azure CosmosDB
Azure Cosmos DB - це повністю керована NoSQL, реляційна та векторна база даних, яка забезпечує час відповіді в одиничні мілісекунди, автоматичну масштабованість та доступність, що підтримується SLA, з безпекою корпоративного рівня. Вона дозволяє швидше розробляти додатки завдяки готовій багаторегіональній розподільній системі даних, відкритим API, SDK для популярних мов та функціям бази даних AI, таким як інтегрована підтримка векторів та безшовна інтеграція з Azure AI.
Azure Cosmos DB надає кілька API бази даних для моделювання реальних даних, використовуючи документи, реляційні, ключ-значення, графові та колонові моделі даних, такими API є NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin та Table.
Одним з ключових аспектів CosmosDB є Azure Cosmos Account. Azure Cosmos Account діє як точка входу до баз даних. Обліковий запис визначає ключові налаштування, такі як глобальний розподіл, рівні узгодженості та конкретний API, який буде використовуватися, наприклад, NoSQL. Через обліковий запис ви можете налаштувати глобальну реплікацію, щоб забезпечити доступність даних у кількох регіонах для доступу з низькою затримкою. Крім того, ви можете вибрати рівень узгодженості, який балансує між продуктивністю та точністю даних, з варіантами від сильної до остаточної узгодженості.
Azure Cosmos DB підтримує ідентифікатори, призначені користувачем, та системні керовані ідентифікатори, які автоматично створюються та пов'язані з життєвим циклом ресурсу. Однак Cosmos DB не має вбудованого механізму для безпосереднього запиту зовнішніх джерел даних, таких як Azure Blob Storage. На відміну від функцій зовнішніх таблиць SQL Server, Cosmos DB вимагає, щоб дані були імпортовані в його контейнери за допомогою зовнішніх інструментів, таких як Azure Data Factory, інструмент міграції даних або користувацькі скрипти, перш ніж їх можна буде запитувати за допомогою його рідних можливостей запиту.
NoSQL
API NoSQL Azure Cosmos DB - це API на основі документів, яке використовує JSON як формат даних. Воно надає синтаксис запиту, подібний до SQL, для запитів до об'єктів JSON, що робить його придатним для роботи зі структурованими та напівструктурованими даними. Точка доступу служби:
https://<Account-Name>.documents.azure.com:443/
Бази даних
У межах облікового запису ви можете створити одну або кілька баз даних, які слугують логічними групами контейнерів. База даних діє як межа для управління ресурсами та правами користувачів. Бази даних можуть або дозволяти кільком контейнерам використовувати спільний пул продуктивності, або надавати кожному контейнеру власну виділену потужність.
Контейнери
Основною одиницею зберігання даних є контейнер, який містить JSON-документи і автоматично індексується для ефективного запиту. Контейнери еластично масштабуються і розподіляються по розділах, які визначаються ключем розділу, заданим користувачем. Ключ розділу є критично важливим для забезпечення оптимальної продуктивності та рівномірного розподілу даних. Наприклад, контейнер може зберігати дані клієнтів, з "customerId" як ключем розділу.
Ключові особливості
- Глобальне розповсюдження: Увімкніть або вимкніть гео-резервування для міжрегіональної реплікації та багаторегіональних записів для покращення доступності.
- Мережа та безпека: між публічними (всі/вибрані мережі) або приватними кінцевими точками для підключення. Захищені з'єднання з шифруванням TLS 1.2. Підтримує CORS (Обмін ресурсами між джерелами) для контрольованого доступу до ресурсів. Microsoft Defender for Cloud може бути увімкнено. Для встановлення з'єднання ви можете використовувати ключі.
- Резервне копіювання та відновлення: з періодичних, безперервних (7 днів) або безперервних (30 днів) політик резервного копіювання з налаштовуваними інтервалами та збереженням.
- Шифрування даних: Ключі, керовані службою за замовчуванням, або ключі, керовані клієнтом (CMK) для шифрування (вибір CMK є незворотним).
Перерахування
# 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>
З'єднання
Він має 2 типи ключів: читання-запис (повний) та тільки читання. Вони надають вказаний доступ до всіх баз даних, колекцій та даних всередині облікового запису Cosmos DB. Для підключення потрібна бібліотека azure-cosmosDB (pip install azure-cosmos). Крім того, кінцева точка та ключ є критично важливими компонентами для встановлення з'єднання.
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)
Інший спосіб встановлення з'єднання - це використання DefaultAzureCredential(). Просто потрібно увійти (az login) з обліковим записом, який має дозволи, і виконати його. У цьому випадку необхідно виконати призначення ролі, надавши необхідні дозволи (див. для більше).
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 MongoDB NoSQL є документно-орієнтованим API, який використовує формат даних, схожий на JSON, BSON (Binary JSON). Він надає мову запитів з можливостями агрегації, що робить його придатним для роботи зі структурованими, напівструктурованими та неструктурованими даними. Кінцева точка сервісу зазвичай має такий формат:
mongodb://<hostname>:<port>/<database>
Бази даних
У MongoDB ви можете створити одну або кілька баз даних в межах екземпляра. Кожна база даних слугує логічною групою колекцій і забезпечує межу для організації та управління ресурсами. Бази даних допомагають логічно розділяти та управляти даними, наприклад, для різних додатків або проектів.
Колекції
Основною одиницею зберігання даних у MongoDB є колекція, яка містить документи і призначена для ефективного запитування та гнучкого проектування схеми. Колекції еластично масштабуються і можуть підтримувати операції з високою пропускною здатністю на кількох вузлах у розподіленій системі.
Ключові особливості типу Request unit (RU)
Глобальне розповсюдження: Увімкніть або вимкніть гео-резервування для реплікації між регіонами та багаторегіональні записи для покращення доступності.
Мережа та безпека: між публічними (всі/вибрані мережі) або приватними кінцевими точками для підключення. Захищені з'єднання з шифруванням TLS 1.2. Підтримує CORS (Cross-Origin Resource Sharing) для контрольованого доступу до ресурсів. Для підключення ви можете використовувати ключі.
Резервне копіювання та відновлення: з періодичних, безперервних (7 днів, безкоштовно) або безперервних (30 днів, платно) політик резервного копіювання з налаштовуваними інтервалами та збереженням.
Шифрування даних: Ключі, що керуються службою за замовчуванням, або ключі, що керуються клієнтом (CMK) для шифрування (вибір CMK є незворотним).
Ключові особливості типу vCore кластеру
Глобальне розповсюдження: Увімкніть репліку для читання в іншому регіоні Azure для високої доступності та підтримки відмов. Налаштуйте ім'я репліки, регіон і зберігання на шард.
Мережа та безпека: Підтримує публічний доступ з призначеними публічними IP-адресами та приватний доступ. Обмежте з'єднання за допомогою правил брандмауера — за замовчуванням публічні IP-адреси не дозволені.
Зашифровані з'єднання: Зобов'язує шифрування TLS для безпечної передачі даних.
Перерахування
# 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>
Connection
Тип MongoDB в CosmoDB має 2 типи ключів: читання-запис (повний) та тільки читання. Вони надають вказаний доступ до всіх баз даних, колекцій та даних всередині облікового запису Cosmos DB. Для пароля ви можете використовувати ключі або метод, описаний у розділі 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}")
Або використовуючи користувача в mongo:
mongosh "mongodb://<myUser>:<mySecurePassword>@<account_name>.mongo.cosmos.azure.com:10255/<mymongodatabase>?ssl=true&replicaSet=globaldb&retrywrites=false"
Посилання
- 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
Підвищення привілеїв
Постексплуатація
ToDo
- Решта БД тут, таблиці, cassandra, gremlin...
- Ознайомтеся з постексплуатацією "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write" && "Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read" та визначеннями ролей, оскільки тут може бути підвищення привілеїв
- Ознайомтеся з відновленнями
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.