Az - SQL

Reading time: 13 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

Azure SQL

Azure SQL - це сімейство керованих, безпечних та інтелектуальних продуктів, які використовують движок бази даних SQL Server в хмарі Azure. Це означає, що вам не потрібно турбуватися про фізичне адміністрування ваших серверів, і ви можете зосередитися на управлінні вашими даними.

Azure SQL складається з чотирьох основних пропозицій:

  1. Azure SQL Server: Сервер потрібен для розгортання та управління базами даних SQL Server.
  2. Azure SQL Database: Це повністю керована служба бази даних, яка дозволяє вам розміщувати окремі бази даних в хмарі Azure.
  3. Azure SQL Managed Instance: Це для масштабних, повних розгортань SQL Server.
  4. Azure SQL Server на Azure VMs: Це найкраще для архітектур, де ви хочете контроль над операційною системою та екземпляром SQL Server.

SQL Server Security Features

Доступ до мережі:

  • Публічний кінцевий пункт (можна обмежити доступ до конкретних мереж).
  • Приватні кінцеві пункти.
  • Також можливо обмежити з'єднання на основі доменних імен.
  • Також можливо дозволити службам Azure отримувати доступ (наприклад, для використання редактора запитів у порталі або для дозволу підключення Azure VM).

Методи аутентифікації:

  • Аутентифікація тільки для Microsoft Entra: Вам потрібно вказати принципи Entra, які матимуть доступ до служби.
  • Аутентифікація як SQL, так і Microsoft Entra: Традиційна SQL аутентифікація з ім'ям користувача та паролем разом з Microsoft Entra.
  • Тільки SQL аутентифікація: Дозволяє доступ лише через користувачів бази даних.

Зверніть увагу, що якщо дозволена будь-яка SQL аутентифікація, потрібно вказати адміністративного користувача (ім'я користувача + пароль), а якщо вибрана аутентифікація Entra ID, також потрібно вказати принаймні одного принципа з адміністративним доступом.

Шифрування:

  • Це називається "Прозоре шифрування даних" і шифрує бази даних, резервні копії та журнали в спокої.

  • Як завжди, за замовчуванням використовується керований ключ Azure, але також може бути використаний ключ шифрування, керований клієнтом (CMEK). Керовані ідентичності:

  • Можливо призначити системні та користувацькі керовані MI.

  • Використовується для доступу до ключа шифрування (якщо використовується CMEK) та інших служб з бази даних.

  • Для деяких прикладів служб Azure, до яких можна отримати доступ з бази даних, перегляньте цю сторінку документації

  • Якщо призначено більше ніж одну UMI, можливо вказати за замовчуванням ту, що потрібно використовувати.

  • Можливо налаштувати федеративну клієнтську ідентичність для доступу між орендарями.

Деякі команди для доступу до інформації всередині блоб-сховища з бази даних 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:

  • Корисний для “зменшення потенційних вразливостей бази даних та виявлення аномальних активностей”
  • Ми поговоримо про Defender в окремому уроці (його можна активувати в кількох інших службах Azure)

Резервні копії:

  • Частота резервного копіювання керується політиками зберігання.

Видалені бази даних:

  • Можливо відновити БД, які були видалені з існуючих резервних копій.

Azure SQL Database

Azure SQL Database є повністю керованою платформою бази даних як послуга (PaaS), яка надає масштабовані та безпечні рішення реляційних баз даних. Вона побудована на останніх технологіях SQL Server і усуває потребу в управлінні інфраструктурою, що робить її популярним вибором для хмарних додатків.

Щоб створити SQL базу даних, потрібно вказати SQL сервер, на якому вона буде розміщена.

Функції безпеки SQL бази даних

  • Завжди актуальна: Працює на останній стабільній версії SQL Server і автоматично отримує нові функції та патчі.
  • Спадкові функції безпеки SQL Server:
  • Аутентифікація (SQL та/або Entra ID)
  • Призначені керовані ідентичності
  • Обмеження мережі
  • Шифрування
  • Резервні копії
  • Резервування даних: Варіанти - локальне, зональне, гео або гео-зональне резервування.
  • Леджер: Він криптографічно перевіряє цілісність даних, забезпечуючи виявлення будь-якого підроблення. Корисно для фінансових, медичних та будь-яких організацій, що управляють чутливими даними.

SQL база даних може бути частиною еластичного пулу. Еластичні пулу є економічно вигідним рішенням для управління кількома базами даних шляхом спільного використання налаштовуваних обчислювальних (eDTUs) та сховищ ресурсів між ними, з ціноутворенням, що базується виключно на виділених ресурсах, а не на кількості баз даних.

Azure SQL Безпека на рівні стовпців (Маскування) та Безпека на рівні рядків

Динамічне маскування даних Azure SQL є функцією, яка допомагає захистити чутливу інформацію, приховуючи її від несанкціонованих користувачів. Замість того, щоб змінювати фактичні дані, вона динамічно маскує відображувані дані, забезпечуючи, щоб чутливі деталі, такі як номери кредитних карток, були приховані.

Динамічне маскування даних впливає на всіх користувачів, крім тих, хто не підлягає маскуванню (ціх користувачів потрібно вказати) та адміністраторів. Є опція конфігурації, яка вказує, які SQL користувачі звільнені від динамічного маскування даних, при цьому адміністратори завжди виключені.

Безпека на рівні рядків Azure SQL (RLS) є функцією, яка контролює, які рядки користувач може переглядати або змінювати, забезпечуючи, щоб кожен користувач бачив лише дані, що стосуються його. Створюючи політики безпеки з предикатами фільтрації або блокування, організації можуть забезпечити детальний доступ на рівні бази даних.

Azure SQL Керовані екземпляри

Azure SQL Керовані екземпляри призначені для масштабних, повних розгортань SQL Server. Вони забезпечують майже 100% сумісність з останнім SQL Server на місцях (Enterprise Edition) Database Engine, який надає рідну реалізацію віртуальної мережі (VNet), що вирішує поширені проблеми безпеки, та бізнес-модель, вигідну для клієнтів SQL Server на місцях.

Azure SQL Віртуальні машини

Azure SQL Віртуальні машини дозволяють контролювати операційну систему та екземпляр SQL Server, оскільки ВМ буде запущена в службі ВМ, що працює на SQL сервері.

Коли створюється SQL Віртуальна машина, можливо вибрати всі налаштування ВМ (як показано в уроці ВМ), які будуть хостити SQL сервер.

  • Це означає, що ВМ буде отримувати доступ до деяких VNet(ів), може мати прикріплені керовані ідентичності, може мати змонтовані файлові спільноти… що робить поворот з SQL на ВМ дуже цікавим.
  • Більше того, можливо налаштувати ідентифікатор програми та секрет для дозволу SQL доступу до конкретного сховища ключів, яке може містити чутливу інформацію.

Також можливо налаштувати такі речі, як автоматичні оновлення SQL, автоматичні резервні копії, аутентифікацію Entra ID та більшість функцій інших служб SQL.

Перерахування

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"

Додатково, якщо ви хочете перерахувати Dynamic Data Masking та Row Level policies у базі даних, ви можете виконати запит:

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;

Підключення та виконання SQL запитів

Ви можете знайти рядок підключення (що містить облікові дані) з прикладу перерахування 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;'

Ви також можете використовувати sqlcmd для доступу до бази даних. Важливо знати, чи дозволяє сервер публічні з'єднання az sql server show --name <server-name> --resource-group <resource-group>, а також чи дозволяє правило брандмауера нашій IP-адресі доступ:

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

References

Підвищення привілеїв

Az - SQL Privesc

Постексплуатація

Az - SQL Post Exploitation

Постійність

Az - SQL Persistence

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks