# Az - SQL {{#include ../../../banners/hacktricks-training.md}} ## Azure SQL Azure SQL es una familia de productos gestionados, seguros e inteligentes que utilizan el **motor de base de datos SQL Server en la nube de Azure**. Esto significa que no tienes que preocuparte por la administración física de tus servidores, y puedes concentrarte en gestionar tus datos. Azure SQL consta de cuatro ofertas principales: 1. **Azure SQL Server**: Se necesita un servidor para el **despliegue y gestión** de bases de datos SQL Server. 2. **Azure SQL Database**: Este es un **servicio de base de datos completamente gestionado**, que te permite alojar bases de datos individuales en la nube de Azure. 3. **Azure SQL Managed Instance**: Esto es para despliegues a mayor escala, de toda la instancia de SQL Server. 4. **Azure SQL Server en Azure VMs**: Esto es mejor para arquitecturas donde deseas **control sobre el sistema operativo** y la instancia de SQL Server. ### Características de Seguridad de SQL Server **Acceso a la red:** - Punto final público (se puede limitar el acceso a redes específicas). - Puntos finales privados. - También es posible restringir conexiones basadas en nombres de dominio. - También es posible permitir que los servicios de Azure accedan a él (como usar el editor de consultas en el portal o permitir que una VM de Azure se conecte). **Métodos de Autenticación:** - Autenticación **solo de Microsoft Entra**: Necesitas indicar los principios de Entra que tendrán acceso al servicio. - Autenticación **tanto de SQL como de Microsoft Entra**: Autenticación SQL tradicional con nombre de usuario y contraseña junto con Microsoft Entra. - Autenticación **solo de SQL**: Solo permite el acceso a través de usuarios de base de datos. Ten en cuenta que si se permite cualquier autenticación SQL, se necesita indicar un usuario administrador (nombre de usuario + contraseña) y si se selecciona la autenticación de Entra ID, también es necesario indicar al menos un principio con acceso de administrador. **Cifrado:** - Se llama “Cifrado de datos transparente” y cifra bases de datos, copias de seguridad y registros en reposo. - Como siempre, se utiliza una clave gestionada por Azure de forma predeterminada, pero también se podría usar una clave de cifrado gestionada por el cliente (CMEK). **Identidades Gestionadas:** - Es posible asignar identidades gestionadas por el sistema y por el usuario. - Se utilizan para acceder a la clave de cifrado (si se utiliza un CMEK) y otros servicios desde las bases de datos. - Para algunos ejemplos de los servicios de Azure que se pueden acceder desde la base de datos, consulta [esta página de la documentación](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql) - Si se asigna más de una UMI, es posible indicar la predeterminada a utilizar. - Es posible configurar una identidad de cliente federada para acceso entre inquilinos. Algunos comandos para acceder a información dentro de un blob storage desde una base de datos 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:** - Útil para “mitigar posibles vulnerabilidades de la base de datos y detectar actividades anómalas” - Hablaremos sobre Defender en su propia lección (se puede habilitar en varios otros servicios de Azure) **Backups:** - La frecuencia de las copias de seguridad se gestiona en las políticas de retención. **Bases de datos eliminadas:** - Es posible restaurar bases de datos que han sido eliminadas de copias de seguridad existentes. ## Azure SQL Database **Azure SQL Database** es una **plataforma de base de datos completamente gestionada como servicio (PaaS)** que proporciona soluciones de bases de datos relacionales escalables y seguras. Está construida sobre las últimas tecnologías de SQL Server y elimina la necesidad de gestión de infraestructura, lo que la convierte en una opción popular para aplicaciones basadas en la nube. Para crear una base de datos SQL es necesario indicar el servidor SQL donde se alojará. ### Características de Seguridad de la Base de Datos SQL - **Siempre Actualizado**: Funciona en la última versión estable de SQL Server y recibe nuevas características y parches automáticamente. - **Características de seguridad heredadas de SQL Server:** - Autenticación (SQL y/o Entra ID) - Identidades gestionadas asignadas - Restricciones de red - Cifrado - Copias de seguridad - … - **Redundancia de datos:** Las opciones son local, zona, Geo o redundante Geo-Zona. - **Libro mayor:** Verifica criptográficamente la integridad de los datos, asegurando que cualquier manipulación sea detectada. Útil para organizaciones financieras, médicas y cualquier organización que gestione datos sensibles. Una base de datos SQL podría ser parte de un **pool elástico**. Los pools elásticos son una solución rentable para gestionar múltiples bases de datos compartiendo recursos de computación (eDTUs) y almacenamiento configurables entre ellas, con precios basados únicamente en los recursos asignados en lugar del número de bases de datos. #### Seguridad a Nivel de Columna (Enmascaramiento) y Seguridad a Nivel de Fila en Azure SQL El enmascaramiento de datos **dinámico de Azure SQL** es una característica que ayuda a **proteger información sensible ocultándola** de usuarios no autorizados. En lugar de alterar los datos reales, enmascara dinámicamente los datos mostrados, asegurando que detalles sensibles como números de tarjetas de crédito estén oscurecidos. El **Enmascaramiento de Datos Dinámico** afecta a todos los usuarios excepto a los que están desmascarados (estos usuarios deben ser indicados) y a los administradores. Tiene la opción de configuración que especifica qué usuarios SQL están exentos del enmascaramiento de datos dinámico, con **administradores siempre excluidos**. La **Seguridad a Nivel de Fila (RLS) de Azure SQL** es una característica que **controla qué filas un usuario puede ver o modificar**, asegurando que cada usuario solo vea los datos relevantes para ellos. Al crear políticas de seguridad con predicados de filtro o bloqueo, las organizaciones pueden hacer cumplir un acceso detallado a nivel de base de datos. ### Instancia Administrada de Azure SQL **Las Instancias Administradas de Azure SQL** son para implementaciones de mayor escala, de toda la instancia de SQL Server. Proporciona casi un 100% de compatibilidad con el último motor de base de datos SQL Server en las instalaciones (Edición Empresarial), que ofrece una implementación nativa de red virtual (VNet) que aborda preocupaciones de seguridad comunes, y un modelo de negocio favorable para los clientes de SQL Server en las instalaciones. ### Máquinas Virtuales de Azure SQL **Las Máquinas Virtuales de Azure SQL** permiten **controlar el sistema operativo** y la instancia de SQL Server, ya que se generará una VM en el servicio de VM que ejecuta el servidor SQL. Cuando se crea una Máquina Virtual SQL, es posible **seleccionar todas las configuraciones de la VM** (como se muestra en la lección de VM) que alojará el servidor SQL. - Esto significa que la VM accederá a algunas VNet(s), podría tener **Identidades Gestionadas adjuntas** a ella, podría tener recursos compartidos montados… haciendo que un **pivotar desde el SQL** a la VM sea muy interesante. - Además, es posible configurar un id de aplicación y un secreto para **permitir que el SQL acceda a un vault de claves específico**, que podría contener información sensible. También es posible configurar cosas como **actualizaciones automáticas de SQL**, **copias de seguridad automáticas**, **autenticación de Entra ID** y la mayoría de las características de los otros servicios SQL. ## Enumeración {{#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}} Además, si deseas enumerar el Dynamic Data Masking y las políticas de Row Level dentro de la base de datos, puedes consultar: ```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; ``` ### Conectar y ejecutar consultas SQL Podrías encontrar una cadena de conexión (que contiene credenciales) del ejemplo [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;' ``` También puedes usar sqlcmd para acceder a la base de datos. Es importante saber si el servidor permite conexiones públicas `az sql server show --name --resource-group `, y también si la regla del firewall permite que nuestra IP acceda: ```bash sqlcmd -S .database.windows.net -U -P -d ``` ## Referencias - [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) ## Escalación de Privilegios {{#ref}} ../az-privilege-escalation/az-sql-privesc.md {{#endref}} ## Post Explotación {{#ref}} ../az-post-exploitation/az-sql-post-exploitation.md {{#endref}} ### Persistencia {{#ref}} ../az-persistence/az-sql-persistence.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}}