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

17 KiB

Az - SQL

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

Azure SQL

Azure SQL is 'n familie van bestuurde, veilige en intelligente produkte wat die SQL Server-databasisengine in die Azure-wolk gebruik. Dit beteken jy hoef nie bekommerd te wees oor die fisiese administrasie van jou bedieners nie, en jy kan fokus op die bestuur van jou data.

Azure SQL bestaan uit vier hoofaanbiedinge:

  1. Azure SQL Server: 'n Bediener is nodig vir die ontplooiing en bestuur van SQL Server-databasisse.
  2. Azure SQL Database: Dit is 'n volledig bestuurde databasisdiens, wat jou toelaat om individuele databasisse in die Azure-wolk te huisves.
  3. Azure SQL Managed Instance: Dit is vir groter skaal, hele SQL Server-instantie-geskepte ontplooiings.
  4. Azure SQL Server op Azure VMs: Dit is die beste vir argitekture waar jy beheer oor die bedryfstelsel en SQL Server-instantie wil hê.

SQL Server Sekuriteitskenmerke

Netwerktoegang:

  • Publieke eindpunt (kan toegang tot spesifieke netwerke beperk).
  • Privaat eindpunte.
  • Dit is ook moontlik om verbindings op grond van domeinnames te beperk.
  • Dit is ook moontlik om Azure-dienste toe te laat om toegang te verkry (soos om die Query-redigeerder in die portaal te gebruik of om 'n Azure VM toe te laat om te verbind).

Verifikasiemetodes:

  • Microsoft Entra-slegs verifikasie: Jy moet die Entra-principals aandui wat toegang tot die diens sal hê.
  • Sowel SQL as Microsoft Entra verifikasie: Tradisionele SQL-verifikasie met gebruikersnaam en wagwoord saam met Microsoft Entra.
  • Slegs SQL verifikasie: Laat slegs toegang toe via databasisgebruikers.

Let daarop dat as enige SQL-verifikasie toegelaat word, 'n admin-gebruiker (gebruikersnaam + wagwoord) aangedui moet word, en as Entra ID-verifikasie gekies word, moet daar ook ten minste een principal met admin-toegang aangedui word.

Enkripsie:

  • Dit word "Deursigtige data-enkripsie" genoem en dit enkripteer databasisse, rugsteun en logs in rus.

  • Soos altyd, 'n Azure bestuurde sleutel word standaard gebruik, maar 'n kliënt bestuurde enkripsiesleutel (CMEK) kan ook gebruik word. Bestuurde Identiteite:

  • Dit is moontlik om stelsels en gebruikers bestuurde MIs toe te ken.

  • Gebruik om toegang tot die enkripsiesleutel te verkry (as 'n CMEK gebruik word) en ander dienste van die databasisse.

  • As meer as een UMI toegeken word, is dit moontlik om die standaard een aan te dui wat gebruik moet word.

  • Dit is moontlik om 'n gefedereerde kliëntidentiteit vir kruis-huurder toegang te konfigureer.

Microsoft Defender:

  • Nuttig vir "die versagting van potensiële databasis kwesbaarhede, en die opsporing van anomale aktiwiteite"
  • Ons sal oor Defender in sy eie les praat (dit kan in verskeie ander Azure-dienste geaktiveer word)

Rugsteun:

  • Rugsteunfrekwensie word in die retensiebeleide bestuur.

Verwyderde databasisse:

  • Dit is moontlik om DB's wat uit bestaande rugsteun verwyder is, te herstel.

Azure SQL Database

Azure SQL Database is 'n volledig bestuurde databasisplatform as 'n diens (PaaS) wat skaalbare en veilige relationele databasisoplossings bied. Dit is gebou op die nuutste SQL Server-tegnologieë en elimineer die behoefte aan infrastruktuur bestuur, wat dit 'n gewilde keuse maak vir wolk-gebaseerde toepassings.

Om 'n SQL-databasis te skep, is dit nodig om die SQL-server aan te dui waar dit gehuisves sal word.

SQL Database Sekuriteitskenmerke

  • Altijd Opdaterend: Loop op die nuutste stabiele weergawe van SQL Server en ontvang nuwe kenmerke en patches outomaties.
  • Geërfde SQL Server sekuriteitskenmerke:
  • Verifikasie (SQL en/of Entra ID)
  • Toegekende Bestuurde Identiteite
  • Netwerkbeperkings
  • Enkripsie
  • Rugsteun
  • Data redundansie: Opsies is plaaslik, sone, Geo of Geo-Zone redundante.
  • Ledger: Dit verifieer die integriteit van data cryptografies, wat verseker dat enige vervalsing opgespoor word. Nuttig vir finansiële, mediese en enige organisasie wat sensitiewe data bestuur.

'n SQL-databasis kan deel wees van 'n elastiese Pool. Elastiese poele is 'n kostedoeltreffende oplossing vir die bestuur van verskeie databasisse deur konfigureerbare rekenaar (eDTUs) en stoorhulpbronne onder hulle te deel, met prysstelling wat slegs op die toegepaste hulpbronne gebaseer is eerder as die aantal databasisse.

Azure SQL Kolomvlak Sekuriteit (Maskering) & Ryvlak Sekuriteit

Azure SQL se dinamiese datamaskering is 'n kenmerk wat help om sensitiewe inligting te beskerm deur dit van ongemagtigde gebruikers te verberg. In plaas daarvan om die werklike data te verander, maskering dit dinamies die vertoonde data, wat verseker dat sensitiewe besonderhede soos kredietkaartnommers verborge is.

Die Dinamiese Data Maskering geld vir alle gebruikers behalwe diegene wat nie gemasker is nie (hierdie gebruikers moet aangedui word) en administrateurs. Dit het die konfigurasieopsie wat spesifiseer watter SQL-gebruikers vrygestel is van dinamiese datamaskering, met administrateurs altyd uitgesluit.

Azure SQL Ryvlak Sekuriteit (RLS) is 'n kenmerk wat beheer watter rye 'n gebruiker kan sien of wysig, wat verseker dat elke gebruiker slegs die data sien wat relevant is vir hulle. Deur sekuriteitsbeleide met filter of blokpredikate te skep, kan organisasies fyngegradeerde toegang op databasisvlak afdwing.

Azure SQL Managed Instance

Azure SQL Managed Instances is vir groter skaal, hele SQL Server-instantie-geskepte ontplooiings. Dit bied byna 100% kompatibiliteit met die nuutste SQL Server op-premises (Enterprise Edition) Databasis Engine, wat 'n inheemse virtuele netwerk (VNet) implementering bied wat algemene sekuriteitskwessies aanspreek, en 'n besigheidsmodel wat gunstig is vir op-premises SQL Server-klante.

Azure SQL Virtuele Masjiene

Azure SQL Virtuele Masjiene laat jou toe om die bedryfstelsel en die SQL Server-instantie te beheer, aangesien 'n VM in die VM-diens wat die SQL-server draai, geskep sal word.

Wanneer 'n SQL Virtuele Masjien geskep word, is dit moontlik om alle instellings van die VM te kies (soos in die VM-les gewys) wat die SQL-server sal huisves.

  • Dit beteken dat die VM toegang tot sommige VNet(s) sal hê, moontlik Bestuurde Identiteite aan dit geheg kan wees, kan lêergedeeltes gemonteer hê… wat 'n pivoting van die SQL na die VM super interessant maak.
  • Boonop is dit moontlik om 'n app-id en geheim te konfigureer om die SQL toegang tot 'n spesifieke sleutelkluis toe te laat, wat sensitiewe inligting kan bevat.

Dit is ook moontlik om dinge soos outomatiese SQL-opdaterings, outomatiese rugsteun, Entra ID-verifikasie en die meeste van die kenmerke van die ander SQL-dienste te konfigureer.

Enumerasie

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

# 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/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Sql/servers/getstorageserver/databases/masktest/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"

{{#endtab}}

{{#tab name="Az PowerShell"}}

# List Servers
Get-AzSqlServer -ResourceGroupName "<resource-group-name>"

# List All Databases in a SQL Server
Get-AzSqlDatabase -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# Get Details of a Specific Database
Get-AzSqlDatabase -Name "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"

# List Operations Performed on the Database
Get-AzSqlDatabaseActivity -DatabaseName "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"

# List SQL Database Classification
Get-AzSqlDatabaseSensitivityClassification -DatabaseName "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"

# List Long-Term Retention Backups for a SQL Database
Get-AzSqlDatabaseLongTermRetentionBackup -ResourceGroupName "<resource_group>" -Location "<location>"
# List Replicas of a Database and Their Replication Status
Get-AzSqlDatabaseReplicationLink -DatabaseName "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List Deleted SQL Databases
Get-AzSqlDeletedDatabaseBackup -ServerName "<server_name>" -ResourceGroupName "<resource_group>"

# List All Elastic Pools in a SQL Server
Get-AzSqlElasticPool -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List All Databases in a Specific Elastic Pool
Get-AzSqlElasticPoolDatabase -ElasticPoolName "<elastic_pool_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"

# List all managed Instances
Get-AzSqlInstance
Get-AzSqlInstance -ResourceGroupName <ResourceGroupName> -Name <ManagedInstanceName>

# List All Databases in a SQL Managed Instance
Get-AzSqlInstanceDatabase -ResourceGroupName <ResourceGroupName> -InstanceName <ManagedInstanceName>

# Lis all sql VM
Get-AzSqlVM

{{#endtab}} {{#endtabs}}

Boonop, as jy die Dynamiese Gegevensmaskering en Ryvlakbeleide binne die databasis wil opnoem, kan jy die volgende navraag doen:

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

Verbind en voer SQL-navrae uit

Jy kan 'n verbindsstring (wat akrediteerbesonderhede bevat) vind van voorbeeld opnoem van 'n Az WebApp:

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;'

U kan ook sqlcmd gebruik om toegang tot die databasis te verkry. Dit is belangrik om te weet of die bediener openbare verbindings toelaat az sql server show --name <server-name> --resource-group <resource-group>, en ook of die vuurmuurreël ons IP toelaat om toegang te verkry:

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

Verwysings

Privilege Escalation

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

Post Exploitation

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

Persistensie

{{#ref}} ../az-persistence/az-sql-persistance.md {{#endref}}

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