Az - SQL

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 SQL

Azure SQL, Azure bulutundaki SQL Server veritabanı motorunu kullanan yönetilen, güvenli ve akıllı ürünler ailesidir. Bu, sunucularınızın fiziksel yönetimiyle ilgili endişelenmenize gerek olmadığı ve verilerinizi yönetmeye odaklanabileceğiniz anlamına gelir.

Azure SQL, dört ana teklifi içerir:

  1. Azure SQL Server: SQL Server veritabanlarının dağıtımı ve yönetimi için bir sunucu gereklidir.
  2. Azure SQL Database: Bu, Azure bulutunda bireysel veritabanlarını barındırmanıza olanak tanıyan tamamen yönetilen bir veritabanı hizmetidir.
  3. Azure SQL Managed Instance: Bu, daha büyük ölçekli, tüm SQL Server örneği kapsamındaki dağıtımlar içindir.
  4. Azure SQL Server on Azure VMs: Bu, işletim sistemi ve SQL Server örneği üzerinde kontrol istediğiniz mimariler için en iyisidir.

SQL Server Güvenlik Özellikleri

Ağ erişimi:

  • Kamu uç noktası (erişimi belirli ağlarla sınırlayabilir).
  • Özel uç noktalar.
  • Alan adlarına dayalı bağlantıları kısıtlamak da mümkündür.
  • Azure hizmetlerinin erişimine izin vermek de mümkündür (örneğin, portalda Sorgu düzenleyicisini kullanmak veya bir Azure VM’nin bağlanmasına izin vermek için).

Kimlik Doğrulama Yöntemleri:

  • Microsoft Entra-only kimlik doğrulaması: Hizmete erişimi olacak Entra ilkelerini belirtmeniz gerekir.
  • Hem SQL hem de Microsoft Entra kimlik doğrulaması: Kullanıcı adı ve şifre ile birlikte geleneksel SQL kimlik doğrulaması.
  • Sadece SQL kimlik doğrulaması: Erişimi yalnızca veritabanı kullanıcıları aracılığıyla sağlamak.

Herhangi bir SQL kimlik doğrulamasına izin verilirse, bir yönetici kullanıcısı (kullanıcı adı + şifre) belirtilmelidir ve Entra ID kimlik doğrulaması seçilirse, en az bir yönetici erişimine sahip ilkenin de belirtilmesi gerekir.

Şifreleme:

  • “Şeffaf veri şifrelemesi” olarak adlandırılır ve veritabanlarını, yedeklemeleri ve dinlenme halindeki günlükleri şifreler.

  • Her zamanki gibi, varsayılan olarak bir Azure yönetilen anahtar kullanılır, ancak bir müşteri yönetilen şifreleme anahtarı (CMEK) de kullanılabilir. Yönetilen Kimlikler:

  • Sistem ve kullanıcı yönetilen MI’ler atamak mümkündür.

  • Şifreleme anahtarına (CMEK kullanılıyorsa) ve veritabanlarından diğer hizmetlere erişmek için kullanılır.

  • Veritabanından erişilebilecek Azure hizmetlerinin bazı örnekleri için bu belge sayfasına bakın.

  • Birden fazla UMI atandığında, kullanılacak varsayılan olanı belirtmek mümkündür.

  • Çapraz kiracı erişimi için bir federasyon istemci kimliği yapılandırmak mümkündür.

Bir SQL veritabanından bir blob depolama içindeki bilgilere erişmek için bazı komutlar:

-- Create a credential for the managed identity
CREATE DATABASE SCOPED CREDENTIAL [ManagedIdentityCredential]
WITH IDENTITY = 'Managed Identity';
GO

-- Create an external data source pointing to the blob storage to access
CREATE EXTERNAL DATA SOURCE ManagedIdentity
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://testsqlidentity.blob.core.windows.net/sqlcontainer',
CREDENTIAL = ManagedIdentityCredential
);
GO

-- Read a file from ths storage and return it
SELECT *
FROM OPENROWSET(
BULK 'message.txt',
DATA_SOURCE = 'ManagedIdentity',
SINGLE_CLOB
) AS DataFile;
GO

Microsoft Defender:

  • Potansiyel veritabanı güvenlik açıklarını azaltmak ve anormal aktiviteleri tespit etmek için faydalıdır.
  • Defender hakkında kendi dersinde konuşacağız (birçok diğer Azure hizmetinde etkinleştirilebilir).

Yedeklemeler:

  • Yedekleme sıklığı, saklama politikalarında yönetilmektedir.

Silinmiş veritabanları:

  • Mevcut yedeklerden silinmiş DB’leri geri yüklemek mümkündür.

Azure SQL Database

Azure SQL Database, ölçeklenebilir ve güvenli ilişkisel veritabanı çözümleri sunan tamamen yönetilen bir veritabanı platformu olarak hizmet (PaaS)’dir. En son SQL Server teknolojileri üzerine inşa edilmiştir ve altyapı yönetimi gereksinimini ortadan kaldırarak bulut tabanlı uygulamalar için popüler bir seçim haline gelmiştir.

Bir SQL veritabanı oluşturmak için, barındırılacağı SQL sunucusunu belirtmek gerekmektedir.

SQL Veritabanı Güvenlik Özellikleri

  • Her Zaman Güncel: En son kararlı SQL Server sürümünde çalışır ve yeni özellikler ile yamaları otomatik olarak alır.
  • Devralınan SQL Server güvenlik özellikleri:
  • Kimlik doğrulama (SQL ve/veya Entra ID)
  • Atanmış Yönetilen Kimlikler
  • Ağ kısıtlamaları
  • Şifreleme
  • Yedeklemeler
  • Veri yedekliliği: Seçenekler yerel, bölge, Coğrafi veya Coğrafi-Bölge yedekli.
  • Defter: Verilerin bütünlüğünü kriptografik olarak doğrular, herhangi bir müdahalenin tespit edilmesini sağlar. Finansal, tıbbi ve hassas verileri yöneten herhangi bir organizasyon için faydalıdır.

Bir SQL veritabanı, esnek Havuz’un bir parçası olabilir. Esnek havuzlar, yapılandırılabilir hesaplama (eDTUs) ve depolama kaynaklarını paylaşarak birden fazla veritabanını yönetmek için maliyet etkin bir çözümdür; fiyatlandırma yalnızca tahsis edilen kaynaklara dayanmaktadır, veritabanı sayısına değil.

Azure SQL Sütun Seviyesi Güvenlik (Maskeleme) & Satır Seviyesi Güvenlik

Azure SQL’in dinamik veri maskeleme özelliği, hassas bilgileri yetkisiz kullanıcılardan gizleyerek korumaya yardımcı olur. Gerçek verileri değiştirmek yerine, görüntülenen verileri dinamik olarak maskeleyerek, kredi kartı numaraları gibi hassas ayrıntıların gizli kalmasını sağlar.

Dinamik Veri Maskeleme, maskelemeyen (bu kullanıcılar belirtilmelidir) ve yöneticiler dışındaki tüm kullanıcıları etkiler. Dinamik veri maskelemeden muaf olan SQL kullanıcılarını belirten bir yapılandırma seçeneği vardır; yöneticiler her zaman hariçtir.

Azure SQL Satır Seviyesi Güvenlik (RLS), bir kullanıcının hangi satırları görüntüleyebileceğini veya değiştirebileceğini kontrol eden bir özelliktir; her kullanıcının yalnızca kendileriyle ilgili verileri görmesini sağlar. Filtre veya engelleme yargıları ile güvenlik politikaları oluşturarak, organizasyonlar veritabanı düzeyinde ince ayar erişim uygulayabilirler.

Azure SQL Yönetilen Örnek

Azure SQL Yönetilen Örnekler, daha büyük ölçekli, tüm SQL Server örneği kapsamındaki dağıtımlar içindir. En son SQL Server yerel (Enterprise Edition) Veritabanı Motoru ile neredeyse %100 uyumluluk sağlar; bu, yaygın güvenlik endişelerini ele alan yerel sanal ağ (VNet) uygulaması sunar ve yerel SQL Server müşterileri için uygun bir iş modeli sağlar.

Azure SQL Sanal Makineleri

Azure SQL Sanal Makineleri, işletim sistemini ve SQL Server örneğini kontrol etme imkanı sunar; çünkü bir VM, SQL sunucusunu çalıştıran VM hizmetinde oluşturulacaktır.

Bir SQL Sanal Makinesi oluşturulduğunda, SQL sunucusunu barındıracak VM’nin tüm ayarlarını seçmek mümkündür (VM dersinde gösterildiği gibi).

  • Bu, VM’nin bazı VNet’lere erişeceği, Yönetilen Kimliklerin eklenmiş olabileceği, dosya paylaşımlarının bağlanabileceği anlamına gelir… bu da SQL’den VM’ye geçişi oldukça ilginç hale getirir.
  • Ayrıca, SQL’in belirli bir anahtar kasasına erişmesine izin vermek için bir uygulama kimliği ve sırrı yapılandırmak mümkündür; bu, hassas bilgileri içerebilir.

Ayrıca, otomatik SQL güncellemeleri, otomatik yedeklemeler, Entra ID kimlik doğrulaması ve diğer SQL hizmetlerinin çoğu özelliği gibi şeyleri yapılandırmak da mümkündür.

Enumeration

# List Servers
az sql server list # managed identities are enumerated here too
## List Server Usages
az sql server list-usages --name <server_name> --resource-group <resource_group>
## List Server Firewalls
az sql server firewall-rule list --resource-group <resource_group> --server <server_name>
## List of Azure Active Directory administrators in a server.
az sql server ad-admin list --resource-group <resource_group> --server <server_name>
## Gets an advanced threat protection
az sql server advanced-threat-protection-setting show --resource-group <resource_group> --name <server_name>
## Get server's auditing policy.
az sql server audit-policy show --resource-group <resource_group> --name <server_name>
## Gets a server's secure connection policy.
az sql server conn-policy show --resource-group <resource_group> --server <server_name>
## Gets a list of server DNS aliases for a server.
az sql server dns-alias list --resource-group <resource_group> --server <server_name>
## List of server keys.
az sql server key list --resource-group <resource_group> --server <server_name>
## Gets a server encryption protector.
az sql server tde-key show --resource-group <resource_group> --server <server_name>

# List Databases in a SQL server
az sql db list --server <server_name> --resource-group <resource_group> #--output table
## Get details of a specific database
az sql db show --name <database_name> --server <server_name> --resource-group <resource_group>
## List database usages
az sql db list-usages --name <database_name> --server <server_name> --resource-group <resource_group>
## List of operations performed on the database.
az sql db op list --database <database_name> --server <server_name> --resource-group <resource_group>
## List sql database classification
az sql db classification list --name <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention backups for a SQL database
az sql db ltr-backup list --database <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention policy
az sql db ltr-policy --name <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention policy
az sql db str-policy --name <database_name> --server <server_name> --resource-group <resource_group>
## List the replicas of a database and their replication status
az sql db replica list-links --name <database_name> --server <server_name> --resource-group <resource_group>
## List deleted SQL databases
az sql db list-deleted --server <server_name> --resource-group <resource_group>
## List database usages
az sql db list-usages --name <database_name> --server <server_name> --resource-group <resource_group>
## List restorable dropped databases in a SQL server
az sql db list-deleted --server <server_name> --resource-group <resource_group>
## List advanced threat protection setting show
az sql db advanced-threat-protection-setting --name <database_name> --server <server_name> --resource-group <resource_group>

# List all elastic pools in a SQL server
az sql elastic-pool list --server <server_name> --resource-group <resource_group> #--output table
## List all databases in a specific elastic pool
az sql elastic-pool show --name <elastic_pool_name>  --server <server_name> --resource-group <resource_group>
## List of databases in an elastic pool.
az sql elastic-pool list-dbs --name <elastic_pool_name>  --server <server_name> --resource-group <resource_group>

# List all managed Instances
az sql mi list
az sql mi show --resource-group <res-grp> --name <name>
az sql midb list
az sql midb show --resource-group <res-grp> --name <name>

# Lis all sql VM
az sql vm list
az sql vm show --resource-group <res-grp> --name <name>

# List schema by the database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas?api-version=2021-11-01"

# Get tables of a database with the schema
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas/<schemaName>/tables?api-version=2021-11-01"

# Get columns of a database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/columns?api-version=2021-11-01"

# Get columns of a table
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas/<schemaName>/tables/<tableName>/columns?api-version=2021-11-01"

# Get DataMaskingPolicies of a database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/dataMaskingPolicies/Default?api-version=2021-11-01"

az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/dataMaskingPolicies/Default/rules?api-version=2021-11-01"

Ayrıca, veritabanındaki Dinamik Veri Maskesi ve Satır Düzeyi politikalarını listelemek istiyorsanız, sorgulayabilirsiniz:

--Enumerates the masked columns
SELECT
OBJECT_NAME(mc.object_id) AS TableName,
c.name AS ColumnName,
mc.masking_function AS MaskingFunction
FROM sys.masked_columns AS mc
JOIN sys.columns AS c
ON mc.object_id = c.object_id
AND mc.column_id = c.column_id

--Enumerates Row level policies
SELECT
sp.name AS PolicyName,
sp.is_enabled,
sp.create_date,
sp.modify_date,
OBJECT_NAME(sp.object_id) AS TableName,
sp2.predicate_definition AS PredicateDefinition
FROM sys.security_policies AS sp
JOIN sys.security_predicates AS sp2
ON sp.object_id = sp2.object_id;

Bağlanın ve SQL sorguları çalıştırın

Örnek bir Az WebApp’ı numaralandırma ile bir bağlantı dizesi (kimlik bilgilerini içeren) bulabilirsiniz:

function invoke-sql{
param($query)
$Connection_string = "Server=tcp:supercorp.database.windows.net,1433;Initial Catalog=flag;Persist Security Info=False;User ID=db_read;Password=gAegH!324fAG!#1fht;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
$Connection = New-Object System.Data.SqlClient.SqlConnection $Connection_string
$Connection.Open()
$Command = New-Object System.Data.SqlClient.SqlCommand
$Command.Connection = $Connection
$Command.CommandText = $query
$Reader = $Command.ExecuteReader()
while ($Reader.Read()) {
$Reader.GetValue(0)
}
$Connection.Close()
}

invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;'

Veritabanına erişmek için sqlcmd de kullanabilirsiniz. Sunucunun kamu bağlantılarına izin verip vermediğini bilmek önemlidir az sql server show --name <server-name> --resource-group <resource-group>, ayrıca güvenlik duvarı kuralının IP’mizin erişmesine izin verip vermediğini de kontrol etmelisiniz:

sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>

Referanslar

Yetki Yükseltme

Az - SQL Privesc

Sonrası Sömürü

Az - SQL Post Exploitation

Süreklilik

Az - SQL Persistence

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