Az - SQL

Reading time: 14 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Azure SQL

Azure SQL est une famille de produits gérés, sécurisés et intelligents qui utilisent le moteur de base de données SQL Server dans le cloud Azure. Cela signifie que vous n'avez pas à vous soucier de l'administration physique de vos serveurs, et vous pouvez vous concentrer sur la gestion de vos données.

Azure SQL se compose de quatre principales offres :

  1. Azure SQL Server : Un serveur est nécessaire pour le déploiement et la gestion des bases de données SQL Server.
  2. Azure SQL Database : Il s'agit d'un service de base de données entiÚrement géré, qui vous permet d'héberger des bases de données individuelles dans le cloud Azure.
  3. Azure SQL Managed Instance : C'est pour des déploiements à plus grande échelle, à l'échelle de l'ensemble de l'instance SQL Server.
  4. Azure SQL Server sur des machines virtuelles Azure : C'est le meilleur pour les architectures oĂč vous souhaitez contrĂŽler le systĂšme d'exploitation et l'instance SQL Server.

Fonctionnalités de sécurité de SQL Server

AccÚs réseau :

  • Point de terminaison public (peut limiter l'accĂšs Ă  des rĂ©seaux spĂ©cifiques).
  • Points de terminaison privĂ©s.
  • Il est Ă©galement possible de restreindre les connexions en fonction des noms de domaine.
  • Il est Ă©galement possible de permettre aux services Azure d'y accĂ©der (comme pour utiliser l'Ă©diteur de requĂȘtes dans le portail ou pour permettre Ă  une machine virtuelle Azure de se connecter).

Méthodes d'authentification :

  • Authentification Entra uniquement de Microsoft : Vous devez indiquer les principaux Entra qui auront accĂšs au service.
  • Authentification Ă  la fois SQL et Microsoft Entra : Authentification SQL traditionnelle avec nom d'utilisateur et mot de passe, en plus de Microsoft Entra.
  • Authentification uniquement SQL : Autoriser l'accĂšs uniquement via des utilisateurs de base de donnĂ©es.

Notez que si une authentification SQL est autorisĂ©e, un utilisateur administrateur (nom d'utilisateur + mot de passe) doit ĂȘtre indiquĂ© et si l'authentification Entra ID est sĂ©lectionnĂ©e, il est Ă©galement nĂ©cessaire d'indiquer au moins un principal avec un accĂšs administrateur.

Chiffrement :

  • Cela s'appelle "Chiffrement des donnĂ©es transparent" et il chiffre les bases de donnĂ©es, les sauvegardes et les journaux au repos.

  • Comme toujours, une clĂ© gĂ©rĂ©e par Azure est utilisĂ©e par dĂ©faut, mais une clĂ© de chiffrement gĂ©rĂ©e par le client (CMEK) peut Ă©galement ĂȘtre utilisĂ©e. IdentitĂ©s gĂ©rĂ©es :

  • Il est possible d'assigner des identitĂ©s gĂ©rĂ©es systĂšme et utilisateur.

  • UtilisĂ© pour accĂ©der Ă  la clĂ© de chiffrement (si un CMEK est utilisĂ©) et Ă  d'autres services depuis les bases de donnĂ©es.

  • Pour quelques exemples des services Azure qui peuvent ĂȘtre accessibles depuis la base de donnĂ©es, consultez cette page de la documentation

  • Si plus d'une UMI est assignĂ©e, il est possible d'indiquer celle par dĂ©faut Ă  utiliser.

  • Il est possible de configurer une identitĂ© de client fĂ©dĂ©rĂ© pour un accĂšs inter-locataire.

Quelques commandes pour accéder aux informations à l'intérieur d'un stockage blob depuis une base de données 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 pour « attĂ©nuer les vulnĂ©rabilitĂ©s potentielles de la base de donnĂ©es et dĂ©tecter des activitĂ©s anormales »
  • Nous parlerons de Defender dans sa propre leçon (il peut ĂȘtre activĂ© dans plusieurs autres services Azure)

Sauvegardes :

  • La frĂ©quence des sauvegardes est gĂ©rĂ©e dans les politiques de rĂ©tention.

Bases de données supprimées :

  • Il est possible de restaurer des bases de donnĂ©es qui ont Ă©tĂ© supprimĂ©es Ă  partir des sauvegardes existantes.

Azure SQL Database

Azure SQL Database est une plateforme de base de données entiÚrement gérée en tant que service (PaaS) qui fournit des solutions de bases de données relationnelles évolutives et sécurisées. Elle est construite sur les derniÚres technologies SQL Server et élimine le besoin de gestion d'infrastructure, ce qui en fait un choix populaire pour les applications basées sur le cloud.

Pour crĂ©er une base de donnĂ©es SQL, il est nĂ©cessaire d'indiquer le serveur SQL oĂč elle sera hĂ©bergĂ©e.

Fonctionnalités de sécurité de la base de données SQL

  • Toujours Ă  jour : Fonctionne sur la derniĂšre version stable de SQL Server et reçoit automatiquement de nouvelles fonctionnalitĂ©s et correctifs.
  • FonctionnalitĂ©s de sĂ©curitĂ© hĂ©ritĂ©es de SQL Server :
  • Authentification (SQL et/ou Entra ID)
  • IdentitĂ©s gĂ©rĂ©es assignĂ©es
  • Restrictions rĂ©seau
  • Chiffrement
  • Sauvegardes
  • 

  • Redondance des donnĂ©es : Les options sont locales, zone, gĂ©o ou gĂ©o-zone redondantes.
  • Registre : Il vĂ©rifie cryptographiquement l'intĂ©gritĂ© des donnĂ©es, garantissant que toute falsification est dĂ©tectĂ©e. Utile pour les organisations financiĂšres, mĂ©dicales et toute organisation gĂ©rant des donnĂ©es sensibles.

Une base de données SQL pourrait faire partie d'un pool élastique. Les pools élastiques sont une solution rentable pour gérer plusieurs bases de données en partageant des ressources de calcul (eDTUs) et de stockage configurables entre elles, avec une tarification basée uniquement sur les ressources allouées plutÎt que sur le nombre de bases de données.

Sécurité au niveau des colonnes Azure SQL (Masquage) & Sécurité au niveau des lignes

Le masquage dynamique des données d'Azure SQL est une fonctionnalité qui aide à protéger les informations sensibles en les cachant des utilisateurs non autorisés. Au lieu de modifier les données réelles, il masque dynamiquement les données affichées, garantissant que des détails sensibles comme les numéros de carte de crédit sont obscurcis.

Le masquage dynamique des donnĂ©es affecte tous les utilisateurs sauf ceux qui sont non masquĂ©s (ces utilisateurs doivent ĂȘtre indiquĂ©s) et les administrateurs. Il dispose de l'option de configuration qui spĂ©cifie quels utilisateurs SQL sont exemptĂ©s du masquage dynamique des donnĂ©es, avec les administrateurs toujours exclus.

La sécurité au niveau des lignes Azure SQL (RLS) est une fonctionnalité qui contrÎle quelles lignes un utilisateur peut voir ou modifier, garantissant que chaque utilisateur ne voit que les données qui le concernent. En créant des politiques de sécurité avec des prédicats de filtrage ou de blocage, les organisations peuvent appliquer un accÚs granulaire au niveau de la base de données.

Azure SQL Managed Instance

Les instances gĂ©rĂ©es Azure SQL sont destinĂ©es aux dĂ©ploiements Ă  grande Ă©chelle, Ă  l'Ă©chelle de l'ensemble de l'instance SQL Server. Elles offrent une compatibilitĂ© presque totale avec le dernier moteur de base de donnĂ©es SQL Server sur site (Ă©dition Entreprise), qui fournit une mise en Ɠuvre native de rĂ©seau virtuel (VNet) rĂ©pondant aux prĂ©occupations de sĂ©curitĂ© courantes, et un modĂšle commercial favorable aux clients SQL Server sur site.

Machines virtuelles Azure SQL

Les machines virtuelles Azure SQL permettent de contrÎler le systÚme d'exploitation et l'instance SQL Server, car une VM sera lancée dans le service VM exécutant le serveur SQL.

Lorsqu'une machine virtuelle SQL est créée, il est possible de sélectionner tous les paramÚtres de la VM (comme indiqué dans la leçon sur les VM) qui hébergera le serveur SQL.

  • Cela signifie que la VM accĂ©dera Ă  certains VNet, pourra avoir des identitĂ©s gĂ©rĂ©es attachĂ©es Ă  elle, pourrait avoir des partages de fichiers montĂ©s
 rendant un pivotement du SQL vers la VM trĂšs intĂ©ressant.
  • De plus, il est possible de configurer un ID d'application et un secret pour permettre au SQL d'accĂ©der Ă  un coffre-fort de clĂ©s spĂ©cifique, qui pourrait contenir des informations sensibles.

Il est également possible de configurer des éléments tels que mises à jour SQL automatiques, sauvegardes automatiques, authentification Entra ID et la plupart des fonctionnalités des autres services SQL.

ÉnumĂ©ration

bash
# 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"

De plus, si vous souhaitez énumérer le Dynamic Data Masking et les politiques de niveau de ligne dans la base de données, vous pouvez interroger :

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;

Connecter et exĂ©cuter des requĂȘtes SQL

Vous pourriez trouver une chaßne de connexion (contenant des identifiants) dans l'exemple énumérer un Az WebApp :

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;'

Vous pouvez également utiliser sqlcmd pour accéder à la base de données. Il est important de savoir si le serveur autorise les connexions publiques az sql server show --name <server-name> --resource-group <resource-group>, et aussi si la rÚgle de pare-feu permet à notre IP d'accéder :

bash
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>

Références

Escalade de privilĂšges

Az - SQL Privesc

Post-exploitation

Az - SQL Post Exploitation

Persistance

Az - SQL Persistence

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks