# Az - SQL {{#include ../../../banners/hacktricks-training.md}} ## Azure SQL Azure SQL è una famiglia di prodotti gestiti, sicuri e intelligenti che utilizzano il **motore di database SQL Server nel cloud Azure**. Questo significa che non devi preoccuparti dell'amministrazione fisica dei tuoi server e puoi concentrarti sulla gestione dei tuoi dati. Azure SQL consiste in quattro offerte principali: 1. **Azure SQL Server**: È necessario un server per il **deployment e la gestione** dei database SQL Server. 2. **Azure SQL Database**: Questo è un **servizio di database completamente gestito**, che ti consente di ospitare database individuali nel cloud Azure. 3. **Azure SQL Managed Instance**: Questo è per implementazioni su larga scala, a livello di intera istanza SQL Server. 4. **Azure SQL Server su Azure VMs**: Questo è il migliore per architetture in cui desideri **controllo sul sistema operativo** e sull'istanza SQL Server. ### Caratteristiche di Sicurezza di SQL Server **Accesso di rete:** - Endpoint pubblico (può limitare l'accesso a reti specifiche). - Endpoint privati. - È anche possibile limitare le connessioni in base ai nomi di dominio. - È anche possibile consentire ai servizi Azure di accedervi (come per utilizzare l'editor di query nel portale o per consentire a una VM Azure di connettersi). **Metodi di autenticazione:** - Autenticazione **solo Entra di Microsoft**: Devi indicare i principi Entra che avranno accesso al servizio. - Autenticazione **sia SQL che Microsoft Entra**: Autenticazione SQL tradizionale con nome utente e password insieme a Microsoft Entra. - Autenticazione **solo SQL**: Consente l'accesso solo tramite utenti del database. Nota che se è consentita qualsiasi autenticazione SQL, è necessario indicare un utente admin (nome utente + password) e se viene selezionata l'autenticazione Entra ID è anche necessario indicare almeno un principio con accesso admin. **Crittografia:** - Si chiama “Crittografia dei dati trasparente” e crittografa database, backup e log a riposo. - Come sempre, viene utilizzata per impostazione predefinita una chiave gestita da Azure, ma potrebbe essere utilizzata anche una chiave di crittografia gestita dal cliente (CMEK). **Identità Gestite:** - È possibile assegnare identità gestite di sistema e utente. - Utilizzate per accedere alla chiave di crittografia (se viene utilizzata una CMEK) e ad altri servizi dai database. - Per alcuni esempi dei servizi Azure che possono essere accessibili dal database, controlla [questa pagina della documentazione](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql) - Se viene assegnata più di una UMI, è possibile indicare quella predefinita da utilizzare. - È possibile configurare un'identità client federata per l'accesso cross-tenant. Alcuni comandi per accedere alle informazioni all'interno di uno storage blob da un database SQL: ```sql -- 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:** - Utile per “mitigare potenziali vulnerabilità del database e rilevare attività anomale” - Parleremo di Defender in una lezione a parte (può essere abilitato in diversi altri servizi Azure) **Backup:** - La frequenza dei backup è gestita nelle politiche di retention. **Database eliminati:** - È possibile ripristinare i DB che sono stati eliminati dai backup esistenti. ## Azure SQL Database **Azure SQL Database** è una **piattaforma di database completamente gestita come servizio (PaaS)** che fornisce soluzioni di database relazionali scalabili e sicure. È costruita sulle ultime tecnologie di SQL Server ed elimina la necessità di gestione dell'infrastruttura, rendendola una scelta popolare per le applicazioni basate su cloud. Per creare un database SQL è necessario indicare il server SQL dove sarà ospitato. ### Caratteristiche di Sicurezza del Database SQL - **Sempre Aggiornato**: Funziona sull'ultima versione stabile di SQL Server e riceve automaticamente nuove funzionalità e patch. - **Caratteristiche di sicurezza ereditate da SQL Server:** - Autenticazione (SQL e/o Entra ID) - Identità gestite assegnate - Restrizioni di rete - Crittografia - Backup - … - **Ridondanza dei dati:** Le opzioni sono locale, zona, Geo o Geo-Zona ridondante. - **Ledger:** Verifica crittograficamente l'integrità dei dati, assicurando che qualsiasi manomissione venga rilevata. Utile per organizzazioni finanziarie, mediche e qualsiasi organizzazione che gestisce dati sensibili. Un database SQL potrebbe far parte di un **elastic Pool**. Gli elastic pool sono una soluzione economica per gestire più database condividendo risorse di calcolo (eDTUs) e di archiviazione configurabili tra di loro, con prezzi basati esclusivamente sulle risorse allocate piuttosto che sul numero di database. #### Sicurezza a Livello di Colonna (Mascheramento) e Sicurezza a Livello di Riga di Azure SQL Il **mascheramento dei dati dinamico** di Azure SQL è una funzionalità che aiuta a **proteggere le informazioni sensibili nascondendole** agli utenti non autorizzati. Invece di alterare i dati reali, maschera dinamicamente i dati visualizzati, assicurando che dettagli sensibili come i numeri di carta di credito siano oscurati. Il **Mascheramento dei Dati Dinamico** influisce su tutti gli utenti tranne quelli che sono non mascherati (questi utenti devono essere indicati) e sugli amministratori. Ha l'opzione di configurazione che specifica quali utenti SQL sono esenti dal mascheramento dinamico dei dati, con **amministratori sempre esclusi**. La **Sicurezza a Livello di Riga di Azure SQL (RLS)** è una funzionalità che **controlla quali righe un utente può visualizzare o modificare**, assicurando che ogni utente veda solo i dati rilevanti per lui. Creando politiche di sicurezza con predicati di filtro o blocco, le organizzazioni possono applicare un accesso dettagliato a livello di database. ### Azure SQL Managed Instance Le **Azure SQL Managed Instances** sono per distribuzioni su larga scala, a livello di intera istanza di SQL Server. Forniscono quasi il 100% di compatibilità con l'ultima versione del motore di database SQL Server on-premises (Enterprise Edition), che offre un'implementazione nativa della rete virtuale (VNet) che affronta le comuni preoccupazioni di sicurezza, e un modello di business favorevole per i clienti di SQL Server on-premises. ### Azure SQL Virtual Machines Le **Azure SQL Virtual Machines** consentono di **controllare il sistema operativo** e l'istanza di SQL Server, poiché una VM verrà avviata nel servizio VM che esegue il server SQL. Quando viene creata una SQL Virtual Machine, è possibile **selezionare tutte le impostazioni della VM** (come mostrato nella lezione sulla VM) che ospiterà il server SQL. - Questo significa che la VM accederà a alcune VNet, potrebbe avere **Identità Gestite collegate** ad essa, potrebbe avere condivisioni di file montate… rendendo un **pivoting dal SQL** alla VM molto interessante. - Inoltre, è possibile configurare un ID app e un segreto per **consentire al SQL di accedere a un specifico key vault**, che potrebbe contenere informazioni sensibili. È anche possibile configurare cose come **aggiornamenti SQL automatici**, **backup automatici**, **autenticazione Entra ID** e la maggior parte delle funzionalità degli altri servizi SQL. ## Enumerazione {{#tabs}} {{#tab name="az cli"}} ```bash # List Servers az sql server list # managed identities are enumerated here too ## List Server Usages az sql server list-usages --name --resource-group ## List Server Firewalls az sql server firewall-rule list --resource-group --server ## List of Azure Active Directory administrators in a server. az sql server ad-admin list --resource-group --server ## Gets an advanced threat protection az sql server advanced-threat-protection-setting show --resource-group --name ## Get server's auditing policy. az sql server audit-policy show --resource-group --name ## Gets a server's secure connection policy. az sql server conn-policy show --resource-group --server ## Gets a list of server DNS aliases for a server. az sql server dns-alias list --resource-group --server ## List of server keys. az sql server key list --resource-group --server ## Gets a server encryption protector. az sql server tde-key show --resource-group --server # List Databases in a SQL server az sql db list --server --resource-group #--output table ## Get details of a specific database az sql db show --name --server --resource-group ## List database usages az sql db list-usages --name --server --resource-group ## List of operations performed on the database. az sql db op list --database --server --resource-group ## List sql database classification az sql db classification list --name --server --resource-group ## List long-term retention backups for a SQL database az sql db ltr-backup list --database --server --resource-group ## List long-term retention policy az sql db ltr-policy --name --server --resource-group ## List long-term retention policy az sql db str-policy --name --server --resource-group ## List the replicas of a database and their replication status az sql db replica list-links --name --server --resource-group ## List deleted SQL databases az sql db list-deleted --server --resource-group ## List database usages az sql db list-usages --name --server --resource-group ## List restorable dropped databases in a SQL server az sql db list-deleted --server --resource-group ## List advanced threat protection setting show az sql db advanced-threat-protection-setting --name --server --resource-group # List all elastic pools in a SQL server az sql elastic-pool list --server --resource-group #--output table ## List all databases in a specific elastic pool az sql elastic-pool show --name --server --resource-group ## List of databases in an elastic pool. az sql elastic-pool list-dbs --name --server --resource-group # List all managed Instances az sql mi list az sql mi show --resource-group --name az sql midb list az sql midb show --resource-group --name # Lis all sql VM az sql vm list az sql vm show --resource-group --name # List schema by the database az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//schemas?api-version=2021-11-01" # Get tables of a database with the schema az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//schemas//tables?api-version=2021-11-01" # Get columns of a database az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//columns?api-version=2021-11-01" # Get columns of a table az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//schemas//tables//columns?api-version=2021-11-01" # Get DataMaskingPolicies of a database az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//dataMaskingPolicies/Default?api-version=2021-11-01" az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//dataMaskingPolicies/Default/rules?api-version=2021-11-01" ``` {{#endtab}} {{#tab name="Az PowerShell"}} ```bash # List Servers Get-AzSqlServer -ResourceGroupName "" # List All Databases in a SQL Server Get-AzSqlDatabase -ServerName "" -ResourceGroupName "" # Get Details of a Specific Database Get-AzSqlDatabase -Name "" -ServerName "" -ResourceGroupName "" # List Operations Performed on the Database Get-AzSqlDatabaseActivity -DatabaseName "" -ServerName "" -ResourceGroupName "" # List SQL Database Classification Get-AzSqlDatabaseSensitivityClassification -DatabaseName "" -ServerName "" -ResourceGroupName "" # List Long-Term Retention Backups for a SQL Database Get-AzSqlDatabaseLongTermRetentionBackup -ResourceGroupName "" -Location "" # List Replicas of a Database and Their Replication Status Get-AzSqlDatabaseReplicationLink -DatabaseName "" -ServerName "" -ResourceGroupName "" # List Deleted SQL Databases Get-AzSqlDeletedDatabaseBackup -ServerName "" -ResourceGroupName "" # List All Elastic Pools in a SQL Server Get-AzSqlElasticPool -ServerName "" -ResourceGroupName "" # List All Databases in a Specific Elastic Pool Get-AzSqlElasticPoolDatabase -ElasticPoolName "" -ServerName "" -ResourceGroupName "" # List all managed Instances Get-AzSqlInstance Get-AzSqlInstance -ResourceGroupName -Name # List All Databases in a SQL Managed Instance Get-AzSqlInstanceDatabase -ResourceGroupName -InstanceName # Lis all sql VM Get-AzSqlVM ``` {{#endtab}} {{#endtabs}} Inoltre, se desideri enumerare il Dynamic Data Masking e le politiche a livello di riga all'interno del database, puoi eseguire la seguente query: ```sql --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; ``` ### Connettersi ed eseguire query SQL Potresti trovare una stringa di connessione (contenente credenziali) dall'esempio [enumerando un Az WebApp](az-app-services.md): ```bash 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;' ``` Puoi anche utilizzare sqlcmd per accedere al database. È importante sapere se il server consente connessioni pubbliche `az sql server show --name --resource-group `, e anche se la regola del firewall consente al nostro IP di accedere: ```bash sqlcmd -S .database.windows.net -U -P -d ``` ## Riferimenti - [https://learn.microsoft.com/en-us/azure/azure-sql/azure-sql-iaas-vs-paas-what-is-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/azure-sql-iaas-vs-paas-what-is-overview?view=azuresql) - [https://learn.microsoft.com/en-us/azure/azure-sql/database/single-database-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/database/single-database-overview?view=azuresql) - [https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/sql-managed-instance-paas-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/sql-managed-instance-paas-overview?view=azuresql) - [https://learn.microsoft.com/en-us/azure/azure-sql/virtual-machines/windows/sql-server-on-azure-vm-iaas-what-is-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/virtual-machines/windows/sql-server-on-azure-vm-iaas-what-is-overview?view=azuresql) ## Escalation dei privilegi {{#ref}} ../az-privilege-escalation/az-sql-privesc.md {{#endref}} ## Post Exploitation {{#ref}} ../az-post-exploitation/az-sql-post-exploitation.md {{#endref}} ### Persistenza {{#ref}} ../az-persistence/az-sql-persistence.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}}