Az - CosmosDB

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Azure CosmosDB

Azure Cosmos DB, tamamen yönetilen NoSQL, ilişkisel ve vektör veritabanı sunarak tek haneli milisaniye yanıt süreleri, otomatik ölçeklenebilirlik ve kurumsal düzeyde güvenlik ile SLA destekli kullanılabilirlik sağlar. Çok bölgeli veri dağıtımı, popüler diller için açık kaynaklı API’ler, SDK’lar ve entegre vektör desteği ile sorunsuz Azure AI entegrasyonu gibi AI veritabanı özellikleri sayesinde daha hızlı uygulama geliştirmeyi mümkün kılar.

Azure Cosmos DB, belgeler, ilişkisel, anahtar-değer, grafik ve sütun ailesi veri modellerini kullanarak gerçek dünya verilerini modellemek için birden fazla veritabanı API’si sağlar; bu API’ler NoSQL, MongoDB, PostgreSQL, Cassandra, Gremlin ve Table’dır.

CosmosDB’nin önemli bir yönü Azure Cosmos Hesabı’dır. Azure Cosmos Hesabı, veritabanlarına giriş noktası olarak işlev görür. Hesap, küresel dağıtım, tutarlılık seviyeleri ve kullanılacak belirli API gibi ana ayarları belirler; örneğin NoSQL. Hesap aracılığıyla, verilerin düşük gecikme süresi ile birden fazla bölgede erişilebilir olmasını sağlamak için küresel çoğaltmayı yapılandırabilirsiniz. Ayrıca, performans ve veri doğruluğu arasında denge sağlayan bir tutarlılık seviyesi seçebilirsiniz; bu seçenekler Güçlü’den Nihai tutarlılığa kadar değişir.

Azure Cosmos DB, otomatik olarak oluşturulan ve kaynağın yaşam döngüsüne bağlı olan kullanıcı atanan kimlikler ve sistem atanan yönetilen kimlikler destekler. Ancak, Cosmos DB’nin Azure Blob Depolama gibi harici veri kaynaklarını doğrudan sorgulamak için yerleşik bir mekanizması yoktur. SQL Server’ın harici tablo özelliklerinin aksine, Cosmos DB’nin yerel sorgulama yetenekleri ile sorgulanmadan önce verilerin Azure Data Factory, Veri Göç Aracı veya özel betikler gibi harici araçlar kullanılarak konteynerlerine alınması gerekir.

NoSQL

Azure Cosmos DB NoSQL API’si, veri formatı olarak JSON kullanan belge tabanlı bir API’dir. JSON nesnelerini sorgulamak için SQL benzeri bir sorgu sözdizimi sağlar, bu da yapılandırılmış ve yarı yapılandırılmış verilerle çalışmak için uygun hale getirir. Servisin uç noktası:

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

Veritabanları

Bir hesap içinde, konteynerlerin mantıksal grupları olarak hizmet eden bir veya daha fazla veritabanı oluşturabilirsiniz. Bir veritabanı, kaynak yönetimi ve kullanıcı izinleri için bir sınır görevi görür. Veritabanları, birden fazla konteynerin paylaşılan bir performans kapasitesini kullanmasına izin verebilir veya her konteynerin kendi özel gücüne sahip olmasını sağlayabilir.

Konteynerler

Veri depolamanın temel birimi konteynerdir; JSON belgelerini tutar ve verimli sorgulama için otomatik olarak indekslenir. Konteynerler elastik olarak ölçeklenebilir ve kullanıcı tanımlı bir bölüm anahtarı tarafından belirlenen bölümlere dağıtılır. Bölüm anahtarı, optimal performans ve dengeli veri dağılımını sağlamak için kritik öneme sahiptir. Örneğin, bir konteyner müşteri verilerini depolayabilir ve “customerId” bölüm anahtarı olarak kullanılabilir.

Ana Özellikler

  • Küresel Dağıtım: Bölge çapında çoğaltma için Coğrafi Yedekliliği etkinleştirin veya devre dışı bırakın ve iyileştirilmiş kullanılabilirlik için Çoklu Bölge Yazmaları.
  • Ağ ve Güvenlik: bağlantı için genel (tüm/seçili ağlar) veya özel uç noktalar arasında. TLS 1.2 şifrelemesi ile güvenli bağlantılar. Kaynaklara kontrollü erişim için CORS (Cross-Origin Resource Sharing) destekler. Microsoft Defender for Cloud etkinleştirilebilir. Bağlantıyı sağlamak için anahtarları kullanabilirsiniz.
  • Yedekleme ve Kurtarma: Yapılandırılabilir aralıklar ve saklama süreleri ile Periyodik, Sürekli (7 gün) veya Sürekli (30 gün) yedekleme politikaları.
  • Veri Şifreleme: Şifreleme için varsayılan hizmet yönetimli anahtarlar veya müşteri yönetimli anahtarlar (CMK) (CMK seçimi geri alınamaz).

Sayım

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

Bağlantı

İki anahtar türü vardır, Okuma-yazma (tam) ve Sadece okuma. Bu anahtarlar, Cosmos DB hesabındaki tüm veritabanlarına, koleksiyonlara ve verilere belirtilen erişimi sağlar. Azure-cosmosDB’ye bağlanmak için (pip install azure-cosmos) kütüphanesi gereklidir. Ayrıca, bağlantıyı sağlamak için uç nokta ve anahtar kritik bileşenlerdir.

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)

Başka bir bağlantı kurma yöntemi DefaultAzureCredential() kullanmaktır. Sadece gerekli izinlere sahip hesapla giriş yapmanız (az login) ve bunu çalıştırmanız gerekir. Bu durumda, gerekli izinleri veren bir rol ataması yapılmalıdır (daha fazla bilgi için bakınız).

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, verilerini JSON benzeri BSON (Binary JSON) formatında kullanan belge tabanlı bir API’dir. Yapılandırılmış, yarı yapılandırılmış ve yapılandırılmamış verilerle çalışmak için uygun hale getiren, toplama yeteneklerine sahip bir sorgu dili sağlar. Servisin uç noktası genellikle bu formatı takip eder:

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

Veritabanları

MongoDB’de, bir örnek içinde bir veya daha fazla veritabanı oluşturabilirsiniz. Her veritabanı, koleksiyonların mantıksal bir gruplamasını sağlar ve kaynak organizasyonu ve yönetimi için bir sınır oluşturur. Veritabanları, farklı uygulamalar veya projeler için verileri mantıksal olarak ayırmaya ve yönetmeye yardımcı olur.

Koleksiyonlar

MongoDB’deki veri depolamanın temel birimi koleksiyondur; belgeleri tutar ve verimli sorgulama ve esnek şema tasarımı için tasarlanmıştır. Koleksiyonlar elastik olarak ölçeklenebilir ve dağıtılmış bir yapı içinde birden fazla düğümde yüksek verimlilikte işlemleri destekleyebilir.

İstek birimi (RU) türünün Ana Özellikleri

Küresel Dağıtım: Bölge çapında çoğaltma için Coğrafi Yedekliliği etkinleştirin veya devre dışı bırakın ve iyileştirilmiş kullanılabilirlik için Çoklu Bölge Yazmaları etkinleştirin. Ağ ve Güvenlik: bağlantı için genel (tüm/seçili ağlar) veya özel uç noktalar arasında. TLS 1.2 şifrelemesi ile güvenli bağlantılar. Kaynaklara kontrollü erişim için CORS (Cross-Origin Resource Sharing) destekler. Bağlantıyı sağlamak için anahtarları kullanabilirsiniz. Yedekleme ve Kurtarma: Yapılandırılabilir aralıklar ve saklama süreleri ile Periyodik, Sürekli (7 gün, ücretsiz) veya Sürekli (30 gün, ücretli) yedekleme politikaları. Veri Şifreleme: Şifreleme için varsayılan hizmet yönetimli anahtarlar veya müşteri yönetimli anahtarlar (CMK) (CMK seçimi geri alınamaz).

vCore küme türünün Ana Özellikleri

Küresel Dağıtım: Yüksek kullanılabilirlik ve devreye alma desteği için başka bir Azure bölgesinde bir okuma kopyası etkinleştirin. Kopya adını, bölgesini ve her parça için depolamayı yapılandırın. Ağ ve Güvenlik: Atanmış genel IP’ler ile genel erişimi ve özel erişimi destekler. Güvenlik duvarı kuralları kullanarak bağlantıları kısıtlayın—varsayılan olarak, genel IP’lere izin verilmez. Şifreli Bağlantılar: Güvenli veri iletimi için TLS şifrelemesini zorunlu kılar.

Sayım

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

Bağlantı

RU MongoDB türü CosmoDB’de 2 anahtar türüne sahiptir: Okuma-yazma (tam) ve Sadece okuma. Bu, belirtilen erişimi tüm veritabanlarına, koleksiyonlara ve Cosmos DB hesabındaki verilere verir. Şifre için anahtarları kullanabilir veya privesc bölümünde açıklanan yöntemi kullanabilirsiniz.

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 içindeki bir kullanıcı kullanarak:

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

Referanslar

Yetki Yükseltme

Az - CosmosDB Privesc

Sonrası İstismar

Az - SQL Post Exploitation

Yapılacaklar

  • DB’nin geri kalanı, tablolar, cassandra, gremlin…
  • “Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/write” && “Microsoft.DocumentDB/databaseAccounts/mongodbUserDefinitions/read” ve rol tanımlamalarına bakın çünkü burada bir yetki yükseltme olabilir
  • Geri yüklemelere bakın

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin