Az - SQL
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
Azure SQL
Azure SQL to rodzina zarządzanych, bezpiecznych i inteligentnych produktów, które wykorzystują silnik bazy danych SQL Server w chmurze Azure. Oznacza to, że nie musisz martwić się o fizyczne zarządzanie swoimi serwerami, a możesz skupić się na zarządzaniu swoimi danymi.
Azure SQL składa się z czterech głównych ofert:
- Azure SQL Server: Serwer jest potrzebny do wdrażania i zarządzania bazami danych SQL Server.
- Azure SQL Database: To w pełni zarządzana usługa bazy danych, która pozwala na hostowanie pojedynczych baz danych w chmurze Azure.
- Azure SQL Managed Instance: To dla większych wdrożeń w skali, obejmujących całe instancje SQL Server.
- Azure SQL Server na maszynach wirtualnych Azure: To najlepsze rozwiązanie dla architektur, w których chcesz mieć kontrolę nad systemem operacyjnym i instancją SQL Server.
Funkcje zabezpieczeń SQL Server
Dostęp sieciowy:
- Publiczny punkt końcowy (można ograniczyć dostęp do określonych sieci).
- Prywatne punkty końcowe.
- Możliwe jest również ograniczenie połączeń na podstawie nazw domen.
- Możliwe jest również zezwolenie usługom Azure na dostęp (np. do używania edytora zapytań w portalu lub zezwolenie maszynie wirtualnej Azure na połączenie).
Metody uwierzytelniania:
- Uwierzytelnianie tylko Entra: Musisz wskazać zasady Entra, które będą miały dostęp do usługi.
- Uwierzytelnianie zarówno SQL, jak i Microsoft Entra: Tradycyjne uwierzytelnianie SQL z nazwą użytkownika i hasłem obok Microsoft Entra.
- Tylko uwierzytelnianie SQL: Zezwala tylko na dostęp za pośrednictwem użytkowników bazy danych.
Należy pamiętać, że jeśli dozwolone jest jakiekolwiek uwierzytelnianie SQL, należy wskazać użytkownika administracyjnego (nazwa użytkownika + hasło), a jeśli wybrano uwierzytelnianie Entra ID, należy również wskazać przynajmniej jednego zasadę z dostępem administracyjnym.
Szyfrowanie:
-
Nazywa się to „Szyfrowanie danych w trybie przezroczystym” i szyfruje bazy danych, kopie zapasowe i logi w spoczynku.
-
Jak zawsze, domyślnie używany jest zarządzany klucz Azure, ale można również użyć klucza szyfrowania zarządzanego przez klienta (CMEK). Zarządzane tożsamości:
-
Możliwe jest przypisanie systemowych i użytkownikowych zarządzanych tożsamości (MIs).
-
Używane do uzyskiwania dostępu do klucza szyfrowania (jeśli używany jest CMEK) i innych usług z baz danych.
-
Aby zobaczyć przykłady usług Azure, które można uzyskać z bazy danych, sprawdź tę stronę dokumentacji.
-
Jeśli przypisano więcej niż jedną UMI, możliwe jest wskazanie domyślnej do użycia.
-
Możliwe jest skonfigurowanie tożsamości klienta federacyjnego do dostępu międzydzierżawczego.
Niektóre polecenia do uzyskiwania informacji wewnątrz magazynu blob z bazy danych 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:
- Przydatny do „łagodzenia potencjalnych luk w bazach danych oraz wykrywania anomalii”
- Porozmawiamy o Defenderze w osobnej lekcji (można go włączyć w kilku innych usługach Azure)
Kopie zapasowe:
- Częstotliwość tworzenia kopii zapasowych jest zarządzana w politykach retencji.
Usunięte bazy danych:
- Możliwe jest przywrócenie baz danych, które zostały usunięte z istniejących kopii zapasowych.
Azure SQL Database
Azure SQL Database to w pełni zarządzana platforma baz danych jako usługa (PaaS), która zapewnia skalowalne i bezpieczne rozwiązania baz danych relacyjnych. Jest oparta na najnowszych technologiach SQL Server i eliminuje potrzebę zarządzania infrastrukturą, co czyni ją popularnym wyborem dla aplikacji w chmurze.
Aby utworzyć bazę danych SQL, należy wskazać serwer SQL, na którym będzie hostowana.
Funkcje zabezpieczeń bazy danych SQL
- Zawsze aktualna: Działa na najnowszej stabilnej wersji SQL Server i automatycznie otrzymuje nowe funkcje oraz poprawki.
- Dziedziczone funkcje zabezpieczeń SQL Server:
- Uwierzytelnianie (SQL i/lub Entra ID)
- Przypisane tożsamości zarządzane
- Ograniczenia sieciowe
- Szyfrowanie
- Kopie zapasowe
- …
- Redundancja danych: Opcje to lokalna, strefowa, Geo lub Geo-Zone redundant.
- Księga: Kryptograficznie weryfikuje integralność danych, zapewniając, że wszelkie manipulacje są wykrywane. Przydatne dla finansów, medycyny i każdej organizacji zarządzającej wrażliwymi danymi.
Baza danych SQL może być częścią elastycznego zbioru. Elastyczne zbiory to opłacalne rozwiązanie do zarządzania wieloma bazami danych poprzez dzielenie konfigurowalnych zasobów obliczeniowych (eDTUs) i pamięci masowej, z ceną opartą wyłącznie na przydzielonych zasobach, a nie na liczbie baz danych.
Azure SQL Column Level Security (Maskowanie) & Row Level Security
Dynamiczne maskowanie danych w Azure SQL to funkcja, która pomaga chronić wrażliwe informacje, ukrywając je przed nieautoryzowanymi użytkownikami. Zamiast zmieniać rzeczywiste dane, dynamicznie maskuje wyświetlane dane, zapewniając, że wrażliwe szczegóły, takie jak numery kart kredytowych, są zasłonięte.
Dynamiczne maskowanie danych dotyczy wszystkich użytkowników, z wyjątkiem tych, którzy są odmaskowani (ci użytkownicy muszą być wskazani) oraz administratorów. Posiada opcję konfiguracji, która określa, którzy użytkownicy SQL są zwolnieni z dynamicznego maskowania danych, przy czym administratorzy są zawsze wyłączeni.
Azure SQL Row Level Security (RLS) to funkcja, która kontroluje, które wiersze użytkownik może przeglądać lub modyfikować, zapewniając, że każdy użytkownik widzi tylko dane istotne dla niego. Tworząc polityki zabezpieczeń z predykatami filtrującymi lub blokującymi, organizacje mogą egzekwować precyzyjny dostęp na poziomie bazy danych.
Azure SQL Managed Instance
Azure SQL Managed Instances są przeznaczone do większych wdrożeń w skali całej instancji SQL Server. Zapewniają niemal 100% zgodności z najnowszym silnikiem bazy danych SQL Server w wersji lokalnej (Enterprise Edition), który oferuje natywną implementację sieci wirtualnej (VNet), rozwiązującą powszechne problemy z bezpieczeństwem, oraz model biznesowy korzystny dla klientów SQL Server w wersji lokalnej.
Azure SQL Virtual Machines
Azure SQL Virtual Machines pozwala na kontrolowanie systemu operacyjnego i instancji SQL Server, ponieważ VM będzie uruchamiana w usłudze VM działającej na serwerze SQL.
Gdy tworzona jest maszyna wirtualna SQL, możliwe jest wybranie wszystkich ustawień VM (jak pokazano w lekcji o VM), które będą hostować serwer SQL.
- Oznacza to, że VM będzie miała dostęp do niektórych VNet(ów), może mieć przypisane tożsamości zarządzane, może mieć zamontowane udziały plików… co czyni przechodzenie z SQL do VM bardzo interesującym.
- Ponadto możliwe jest skonfigurowanie identyfikatora aplikacji i sekretu, aby umożliwić SQL dostęp do konkretnego skarbca kluczy, który może zawierać wrażliwe informacje.
Możliwe jest również skonfigurowanie takich rzeczy jak automatyczne aktualizacje SQL, automatyczne kopie zapasowe, uwierzytelnianie Entra ID oraz większość funkcji innych usług SQL.
Enumeration
# 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"
Dodatkowo, jeśli chcesz wyliczyć Dynamic Data Masking oraz Row Level policies w bazie danych, możesz zapytać:
--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;
Połącz i uruchom zapytania SQL
Możesz znaleźć ciąg połączenia (zawierający dane uwierzytelniające) z przykładu enumerating an 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;'
Możesz również użyć sqlcmd, aby uzyskać dostęp do bazy danych. Ważne jest, aby wiedzieć, czy serwer pozwala na publiczne połączenia az sql server show --name <server-name> --resource-group <resource-group>, a także czy reguła zapory pozwala naszemu adresowi IP na dostęp:
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
Odniesienia
- 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
Eskalacja Uprawnień
Po Eksploatacji
Utrzymywanie
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

