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

22 KiB
Raw Blame History

Az - SQL

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

Azure SQL

Το Azure SQL είναι μια οικογένεια διαχειριζόμενων, ασφαλών και έξυπνων προϊόντων που χρησιμοποιούν τη SQL Server database engine στο Azure cloud. Αυτό σημαίνει ότι δεν χρειάζεται να ανησυχείς για τη φυσική διαχείριση των servers σου και μπορείς να εστιάσεις στη διαχείριση των δεδομένων σου.

Το Azure SQL αποτελείται από τέσσερις βασικές προσφορές:

  1. Azure SQL Server: Απαιτείται ένας server για το deployment και management των SQL Server databases.
  2. Azure SQL Database: Αυτή είναι μια fully-managed database service, η οποία σου επιτρέπει να φιλοξενείς μεμονωμένες databases στο Azure cloud.
  3. Azure SQL Managed Instance: Αυτό είναι για deployments μεγαλύτερης κλίμακας, σε επίπεδο ολόκληρης SQL Server instance.
  4. Azure SQL Server on Azure VMs: Αυτό είναι το καλύτερο για architectures όπου θέλεις **control over the operating system **και το SQL Server instance.

SQL Server Security Features

Network access:

  • Public endpoint (μπορεί να περιορίσει την πρόσβαση σε συγκεκριμένα networks).
  • Private endpoints.
  • Είναι επίσης δυνατό να περιορίσεις connections βάσει domain names.
  • Είναι επίσης δυνατό να επιτρέψεις σε Azure services να έχουν πρόσβαση σε αυτό (όπως για να χρησιμοποιήσεις το Query editor στο portal ή για να επιτρέψεις σε ένα Azure VM να συνδεθεί).
  • Αν ένα SQL Server έχει το Allow Azure services and resources to access this server ορισμένο σε "Enabled", το Azure θα δημιουργήσει αυτόματα έναν hidden firewall rule που επιτρέπει σε όλη την network traffic που προέρχεται από το Azure να συνδεθεί στο SQL Server — συμπεριλαμβανομένων resources από οποιοδήποτε tenant.
  • Αυτό σημαίνει ότι αν αποκτήσεις έγκυρα SQL credentials, μπορείς να συνδεθείς στο victim Azure SQL Server από ένα Azure VM μέσα στο δικό σου attackercontrolled tenant. Η MS docs explains this

Authentication Methods:

  • Microsoft Entra-only authentication: Πρέπει να καθορίσεις τα Entra principals που θα έχουν πρόσβαση στο service.
  • Both SQL and Microsoft Entra authentication: Παραδοσιακή SQL authentication με username και password μαζί με Microsoft Entra.
  • Only SQL authentication: Επιτρέπει πρόσβαση μόνο μέσω database users.

Σημείωσε ότι αν επιτρέπεται οποιαδήποτε SQL auth, πρέπει να οριστεί ένας admin user (username + password) και αν επιλεγεί Entra ID auth, πρέπει επίσης να οριστεί τουλάχιστον ένα principal με admin access.

Encryption:

  • Ονομάζεται “Transparent data encryption” και κρυπτογραφεί databases, backups και logs at rest.

  • Όπως πάντα, χρησιμοποιείται από προεπιλογή ένα Azure managed key, αλλά μπορεί επίσης να χρησιμοποιηθεί ένα customer managed encryption key (CMEK). Managed Identities:

  • Είναι δυνατό να εκχωρηθούν system και user managed MIs.

  • Χρησιμοποιούνται για την πρόσβαση στο encryption key (αν χρησιμοποιείται CMEK) και σε άλλες services από τις databases.

  • Για μερικά παραδείγματα των Azure services στα οποία μπορεί να γίνει πρόσβαση από τη database, δες this page of the docs

  • Αν εκχωρηθούν περισσότερες από μία UMI, είναι δυνατό να ορίσεις την default one που θα χρησιμοποιείται.

  • Είναι δυνατό να ρυθμίσεις ένα federated client identity για cross-tenant access.

Μερικές εντολές για πρόσβαση σε info μέσα σε ένα blob storage από μια SQL database:

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

  • Χρήσιμο για “mitigating potential database vulnerabilities, and detecting anomalous activities”
  • Θα μιλήσουμε για το Defender στο δικό του μάθημα (μπορεί να ενεργοποιηθεί σε αρκετές άλλες Azure υπηρεσίες)

Backups:

  • Η συχνότητα του backup διαχειρίζεται μέσω των retention policies.

Deleted databases:

  • Είναι δυνατό να restore DBs που έχουν διαγραφεί από υπάρχοντα backups.

Azure SQL Database

Το Azure SQL Database είναι μια fully managed database platform as a service (PaaS) που παρέχει scalable και secure relational database solutions. Βασίζεται στις πιο πρόσφατες SQL Server technologies και εξαλείφει την ανάγκη για infrastructure management, κάνοντάς το δημοφιλή επιλογή για cloud-based applications.

Για να δημιουργηθεί ένα SQL database, χρειάζεται να δηλωθεί ο SQL server όπου θα φιλοξενηθεί.

SQL Database Security Features

  • Always Up-to-Date: Τρέχει στην πιο πρόσφατη stable version του SQL Server και λαμβάνει αυτόματα new features και patches.
  • Inherited SQL Server security features:
  • Authentication (SQL and/or Entra ID)
  • Assigned Managed Identities
  • Network restrictions
  • Encryption
  • Backups
  • Data redundancy: Οι επιλογές είναι local, zone, Geo ή Geo-Zone redundant.
  • Ledger: Επαληθεύει κρυπτογραφικά την ακεραιότητα των δεδομένων, διασφαλίζοντας ότι οποιαδήποτε tampering θα εντοπιστεί. Χρήσιμο για financial, medical και κάθε organization που διαχειρίζεται sensitive data.

Ένα SQL database μπορεί να είναι μέρος ενός elastic Pool. Τα elastic pools είναι μια cost-effective λύση για τη διαχείριση πολλαπλών databases, μοιράζοντας configurable compute (eDTUs) και storage resources μεταξύ τους, με τιμολόγηση που βασίζεται αποκλειστικά στους resources που έχουν allocated και όχι στον αριθμό των databases.

Azure SQL Column Level Security (Masking) & Row Level Security

Το Azure SQL's dynamic data masking είναι ένα feature που βοηθά να protect sensitive information by hiding it από unauthorized users. Αντί να αλλοιώνει τα πραγματικά δεδομένα, κάνει dynamically mask τα εμφανιζόμενα δεδομένα, διασφαλίζοντας ότι ευαίσθητες λεπτομέρειες όπως credit card numbers καλύπτονται.

Το Dynamic Data Masking επηρεάζει όλους τους users εκτός από αυτούς που είναι unmasked (αυτοί οι users χρειάζεται να δηλωθούν) και administrators. Έχει την configuration option που καθορίζει ποιοι SQL users εξαιρούνται από το dynamic data masking, με τους administrators always excluded.

Το Azure SQL Row Level Security (RLS) είναι ένα feature που controls which rows a user can view or modify, διασφαλίζοντας ότι κάθε user βλέπει μόνο τα δεδομένα που σχετίζονται με αυτόν. Με τη δημιουργία security policies με filter ή block predicates, οι organizations μπορούν να εφαρμόσουν fine-grained access σε επίπεδο database.

Azure SQL Managed Instance

Τα Azure SQL Managed Instances προορίζονται για deployments μεγαλύτερης κλίμακας, scoped σε ολόκληρο SQL Server instance. Παρέχουν σχεδόν 100% compatibility με το latest SQL Server on-premises (Enterprise Edition) Database Engine, το οποίο παρέχει native virtual network (VNet) implementation που αντιμετωπίζει συνηθισμένα security concerns, και ένα business model ευνοϊκό για on-premises SQL Server customers.

Azure SQL Virtual Machines

Τα Azure SQL Virtual Machines επιτρέπουν τον control του operating system και του SQL Server instance, καθώς θα δημιουργηθεί μια VM στην VM service που θα τρέχει τον SQL server.

Όταν δημιουργείται ένα SQL Virtual Machine, είναι δυνατό να selected all the settings of the VM (όπως φαίνεται στο μάθημα για τις VM) που θα φιλοξενεί τον SQL server.

  • Αυτό σημαίνει ότι η VM θα έχει πρόσβαση σε κάποιο VNet(s), μπορεί να έχει Managed Identities attached σε αυτήν, μπορεί να έχει mounted file shares… κάνοντας το pivoting from the SQL προς τη VM εξαιρετικά ενδιαφέρον.
  • Επιπλέον, είναι δυνατό να ρυθμιστούν ένα app id και secret για να allow the SQL to access an specific key vault, το οποίο μπορεί να περιέχει sensitive info.

Είναι επίσης δυνατό να ρυθμιστούν πράγματα όπως automatic SQL updates, automatic backups, Entra ID authentication και οι περισσότερες λειτουργίες των άλλων SQL services.

Enumeration

{{#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/<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"

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

Επιπλέον, αν θέλεις να απαριθμήσεις τα Dynamic Data Masking και Row Level policies μέσα στη βάση δεδομένων, μπορείς να κάνεις query:

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

Σύνδεση και εκτέλεση SQL queries

Μπορείς να βρεις ένα connection string (που περιέχει credentials) από το παράδειγμα enumerating an 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;'

Μπορείς επίσης να χρησιμοποιήσεις sqlcmd για να αποκτήσεις πρόσβαση στη βάση δεδομένων. Είναι σημαντικό να γνωρίζεις αν ο server επιτρέπει public connections az sql server show --name <server-name> --resource-group <resource-group>, και επίσης αν το firewall rule επιτρέπει στο IP μας να έχει πρόσβαση:

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

References

Κλιμάκωση Προνομίων

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

Μετά την Εκμετάλλευση

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

Persistence

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

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