18 KiB
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:
- Azure SQL Server: Se necesita un servidor para el despliegue y gestión de bases de datos SQL Server.
- 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.
- Azure SQL Managed Instance: Esto es para despliegues a gran escala, de toda la instancia de SQL Server.
- 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 del sistema y del 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
-
Si se asigna más de un UMI, es posible indicar cuál usar como predeterminado.
-
Es posible configurar una identidad de cliente federada para el acceso entre inquilinos.
Algunos comandos para acceder a información dentro de un blob storage desde una base de datos 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)
Copias de seguridad:
- 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.
Azure SQL Managed Instance
Azure SQL Managed Instances 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.
Azure SQL Virtual Machines
Azure SQL Virtual Machines permite 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 de SQL.
Enumeración
{{#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}}
Además, si deseas enumerar el Dynamic Data Masking y las políticas de Row Level dentro de la base de datos, puedes consultar:
--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:
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 <server-name> --resource-group <resource-group>, y también si la regla del firewall permite que nuestra IP acceda:
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
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/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/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}}