Az - SQL
Reading time: 14 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Azure SQL
Azure SQL é uma família de produtos gerenciados, seguros e inteligentes que utilizam o motor de banco de dados SQL Server na nuvem Azure. Isso significa que você não precisa se preocupar com a administração física de seus servidores, e pode se concentrar em gerenciar seus dados.
Azure SQL consiste em quatro ofertas principais:
- Azure SQL Server: Um servidor é necessário para a implantação e gerenciamento de bancos de dados SQL Server.
- Azure SQL Database: Este é um serviço de banco de dados totalmente gerenciado, que permite hospedar bancos de dados individuais na nuvem Azure.
- Azure SQL Managed Instance: Este é para implantações em maior escala, abrangendo toda a instância do SQL Server.
- Azure SQL Server em VMs Azure: Este é o melhor para arquiteturas onde você deseja controle sobre o sistema operacional e a instância do SQL Server.
Recursos de Segurança do SQL Server
Acesso à rede:
- Endpoint público (pode limitar o acesso a redes específicas).
- Endpoints privados.
- Também é possível restringir conexões com base em nomes de domínio.
- Também é possível permitir que serviços Azure acessem (como usar o editor de consultas no portal ou permitir que uma VM Azure se conecte).
Métodos de Autenticação:
- Autenticação somente Entra da Microsoft: Você precisa indicar os princípios Entra que terão acesso ao serviço.
- Autenticação tanto SQL quanto Microsoft Entra: Autenticação SQL tradicional com nome de usuário e senha juntamente com Microsoft Entra.
- Autenticação somente SQL: Permitir acesso apenas via usuários de banco de dados.
Observe que, se qualquer autenticação SQL for permitida, um usuário administrador (nome de usuário + senha) precisa ser indicado e, se a autenticação Entra ID for selecionada, também é necessário indicar pelo menos um princípio com acesso de administrador.
Criptografia:
-
É chamada de “Criptografia de dados transparente” e criptografa bancos de dados, backups e logs em repouso.
-
Como sempre, uma chave gerenciada pela Azure é usada por padrão, mas uma chave de criptografia gerenciada pelo cliente (CMEK) também pode ser utilizada. Identidades Gerenciadas:
-
É possível atribuir identidades gerenciadas de sistema e de usuário.
-
Usadas para acessar a chave de criptografia (se uma CMEK for usada) e outros serviços dos bancos de dados.
-
Para alguns exemplos dos serviços Azure que podem ser acessados a partir do banco de dados, consulte esta página da documentação
-
Se mais de uma UMI for atribuída, é possível indicar a padrão a ser usada.
-
É possível configurar uma identidade de cliente federada para acesso entre locatários.
Alguns comandos para acessar informações dentro de um blob storage a partir de um banco de dados 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 potenciais vulnerabilidades de banco de dados e detectar atividades anômalas”
- Vamos falar sobre o Defender em sua própria lição (ele pode ser habilitado em vários outros serviços do Azure)
Backups:
- A frequência de backup é gerenciada nas políticas de retenção.
Bancos de dados excluídos:
- É possível restaurar DBs que foram excluídos de backups existentes.
Azure SQL Database
Azure SQL Database é uma plataforma de banco de dados totalmente gerenciada como serviço (PaaS) que fornece soluções de banco de dados relacionais escaláveis e seguras. É construído nas mais recentes tecnologias do SQL Server e elimina a necessidade de gerenciamento de infraestrutura, tornando-se uma escolha popular para aplicações baseadas em nuvem.
Para criar um banco de dados SQL, é necessário indicar o servidor SQL onde ele será hospedado.
Recursos de Segurança do Banco de Dados SQL
- Sempre Atualizado: Executa na versão estável mais recente do SQL Server e recebe novos recursos e patches automaticamente.
- Recursos de segurança herdados do SQL Server:
- Autenticação (SQL e/ou Entra ID)
- Identidades Gerenciadas Atribuídas
- Restrições de rede
- Criptografia
- Backups
- …
- Redundância de dados: As opções são local, zona, Geo ou redundante Geo-Zona.
- Ledger: Verifica criptograficamente a integridade dos dados, garantindo que qualquer adulteração seja detectada. Útil para organizações financeiras, médicas e qualquer organização que gerencie dados sensíveis.
Um banco de dados SQL pode fazer parte de um elastic Pool. Elastic pools são uma solução econômica para gerenciar vários bancos de dados compartilhando recursos de computação (eDTUs) e armazenamento configuráveis entre eles, com preços baseados exclusivamente nos recursos alocados, em vez do número de bancos de dados.
Segurança em Nível de Coluna (Mascaramento) e Segurança em Nível de Linha do Azure SQL
O mascaramento de dados dinâmico do Azure SQL é um recurso que ajuda a proteger informações sensíveis ocultando-as de usuários não autorizados. Em vez de alterar os dados reais, ele mascara dinamicamente os dados exibidos, garantindo que detalhes sensíveis, como números de cartão de crédito, sejam obscurecidos.
O Mascaramento de Dados Dinâmico afeta todos os usuários, exceto aqueles que estão desmascarados (esses usuários precisam ser indicados) e administradores. Ele possui a opção de configuração que especifica quais usuários SQL estão isentos do mascaramento dinâmico de dados, com administradores sempre excluídos.
A Segurança em Nível de Linha do Azure SQL (RLS) é um recurso que controla quais linhas um usuário pode visualizar ou modificar, garantindo que cada usuário veja apenas os dados relevantes para ele. Ao criar políticas de segurança com predicados de filtro ou bloqueio, as organizações podem impor acesso granular no nível do banco de dados.
Azure SQL Managed Instance
As Instâncias Gerenciadas do Azure SQL são para implantações em maior escala, abrangendo toda a instância do SQL Server. Elas oferecem quase 100% de compatibilidade com o mecanismo de banco de dados SQL Server on-premises mais recente (Edição Enterprise), que fornece uma implementação nativa de rede virtual (VNet) que aborda preocupações comuns de segurança, e um modelo de negócios favorável para clientes do SQL Server on-premises.
Azure SQL Virtual Machines
As Máquinas Virtuais do Azure SQL permitem controlar o sistema operacional e a instância do SQL Server, já que uma VM será criada no serviço de VM executando o servidor SQL.
Quando uma Máquina Virtual SQL é criada, é possível selecionar todas as configurações da VM (como mostrado na lição da VM) que hospedará o servidor SQL.
- Isso significa que a VM estará acessando algumas VNet(s), pode ter Identidades Gerenciadas anexadas a ela, pode ter compartilhamentos de arquivos montados… tornando um pivoting do SQL para a VM super interessante.
- Além disso, é possível configurar um ID de aplicativo e segredo para permitir que o SQL acesse um cofre de chaves específico, que pode conter informações sensíveis.
Também é possível configurar coisas como atualizações automáticas do SQL, backups automáticos, autenticação do Entra ID e a maioria dos recursos dos outros serviços SQL.
Enumeração
# 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"
Além disso, se você quiser enumerar a Máscara de Dados Dinâmica e as políticas de Nível de Linha, dentro do banco de dados, você pode 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 e executar consultas SQL
Você pode encontrar uma string de conexão (contendo credenciais) do exemplo enumerando um 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;'
Você também pode usar sqlcmd para acessar o banco de dados. É importante saber se o servidor permite conexões públicas az sql server show --name <server-name> --resource-group <resource-group>
, e também se a regra do firewall permite que nosso IP acesse:
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
Referências
- 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
Escalação de Privilégios
Pós Exploração
Persistência
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.