Az - SQL

Reading time: 12 minutes

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

Azure SQL

Azure SQL은 Azure 클라우드의 SQL Server 데이터베이스 엔진을 사용하는 관리형, 안전하고 지능적인 제품군입니다. 이는 서버의 물리적 관리에 대해 걱정할 필요가 없으며, 데이터 관리에 집중할 수 있음을 의미합니다.

Azure SQL은 네 가지 주요 제공 사항으로 구성됩니다:

  1. Azure SQL Server: SQL Server 데이터베이스의 배포 및 관리를 위해 필요한 서버입니다.
  2. Azure SQL Database: Azure 클라우드에서 개별 데이터베이스를 호스팅할 수 있는 완전 관리형 데이터베이스 서비스입니다.
  3. Azure SQL Managed Instance: 더 큰 규모의 전체 SQL Server 인스턴스 범위 배포를 위한 것입니다.
  4. Azure SQL Server on Azure VMs: 운영 체제와 SQL Server 인스턴스에 대한 제어를 원하는 아키텍처에 가장 적합합니다.

SQL Server 보안 기능

네트워크 접근:

  • 공용 엔드포인트(특정 네트워크에 대한 접근 제한 가능).
  • 사설 엔드포인트.
  • 도메인 이름에 따라 연결을 제한하는 것도 가능합니다.
  • Azure 서비스가 접근할 수 있도록 허용하는 것도 가능합니다(예: 포털에서 쿼리 편집기를 사용하거나 Azure VM이 연결하도록 허용).

인증 방법:

  • Microsoft Entra 전용 인증: 서비스에 접근할 Entra 주체를 지정해야 합니다.
  • SQL 및 Microsoft Entra 인증 모두: 사용자 이름과 비밀번호를 사용하는 전통적인 SQL 인증과 Microsoft Entra가 함께 사용됩니다.
  • SQL 전용 인증: 데이터베이스 사용자만을 통해 접근을 허용합니다.

SQL 인증이 허용되는 경우 관리 사용자(사용자 이름 + 비밀번호)를 지정해야 하며, Entra ID 인증이 선택된 경우 최소한 하나의 관리 접근 권한이 있는 주체를 지정해야 합니다.

암호화:

  • "투명 데이터 암호화"라고 하며, 데이터베이스, 백업 및 로그를 정지 상태에서 암호화합니다.

  • 항상 기본적으로 Azure 관리 키가 사용되지만, 고객 관리 암호화 키(CMEK)도 사용할 수 있습니다. 관리형 ID:

  • 시스템 및 사용자 관리 MIs를 할당할 수 있습니다.

  • 암호화 키에 접근하는 데 사용됩니다(사용되는 경우 CMEK) 및 데이터베이스의 다른 서비스에 접근하는 데 사용됩니다.

  • 데이터베이스에서 접근할 수 있는 Azure 서비스의 몇 가지 예는 이 문서 페이지를 확인하세요.

  • 여러 UMI가 할당된 경우 사용할 기본 UMI를 지정할 수 있습니다.

  • 크로스 테넌트 접근을 위한 연합 클라이언트 ID를 구성할 수 있습니다.

SQL 데이터베이스에서 blob 저장소 내부의 정보에 접근하기 위한 몇 가지 명령:

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 서비스에서 활성화할 수 있습니다).

백업:

  • 백업 빈도는 보존 정책에서 관리됩니다.

삭제된 데이터베이스:

  • 기존 백업에서 삭제된 DB를 복원할 수 있습니다.

Azure SQL Database

Azure SQL Database는 **완전 관리형 데이터베이스 플랫폼 서비스(PaaS)**로, 확장 가능하고 안전한 관계형 데이터베이스 솔루션을 제공합니다. 최신 SQL Server 기술을 기반으로 하며 인프라 관리의 필요성을 없애, 클라우드 기반 애플리케이션에 인기 있는 선택입니다.

SQL 데이터베이스를 생성하려면 호스팅될 SQL 서버를 지정해야 합니다.

SQL 데이터베이스 보안 기능

  • 항상 최신 상태: 최신 안정 버전의 SQL Server에서 실행되며 새로운 기능과 패치를 자동으로 받습니다.
  • 상속된 SQL Server 보안 기능:
  • 인증(SQl 및/또는 Entra ID)
  • 할당된 관리 ID
  • 네트워크 제한
  • 암호화
  • 백업
  • 데이터 중복성: 옵션은 로컬, 존, 지리적 또는 지리적-존 중복입니다.
  • 원장: 데이터의 무결성을 암호학적으로 검증하여 변조가 감지되도록 합니다. 재무, 의료 및 민감한 데이터를 관리하는 모든 조직에 유용합니다.

SQL 데이터베이스는 탄력적 풀의 일부가 될 수 있습니다. 탄력적 풀은 여러 데이터베이스를 관리하기 위한 비용 효율적인 솔루션으로, 구성 가능한 컴퓨팅(eDTUs) 및 저장소 리소스를 공유하며, 가격은 데이터베이스 수가 아닌 할당된 리소스에 따라 결정됩니다.

Azure SQL 열 수준 보안(마스킹) 및 행 수준 보안

Azure SQL의 동적 데이터 마스킹은 민감한 정보를 보호하기 위해 무단 사용자로부터 숨기는 기능입니다. 실제 데이터를 변경하는 대신, 표시된 데이터를 동적으로 마스킹하여 신용 카드 번호와 같은 민감한 세부 정보가 가려지도록 합니다.

동적 데이터 마스킹은 마스킹되지 않은 사용자(이 사용자들은 지정되어야 함)와 관리자를 제외한 모든 사용자에게 영향을 미칩니다. 동적 데이터 마스킹에서 면제되는 SQL 사용자를 지정하는 구성 옵션이 있으며, 관리자는 항상 제외됩니다.

**Azure SQL 행 수준 보안(RLS)**은 사용자가 볼 수 있거나 수정할 수 있는 행을 제어하는 기능으로, 각 사용자가 자신과 관련된 데이터만 볼 수 있도록 보장합니다. 필터 또는 차단 술어로 보안 정책을 생성함으로써 조직은 데이터베이스 수준에서 세밀한 접근 제어를 시행할 수 있습니다.

Azure SQL 관리형 인스턴스

Azure SQL 관리형 인스턴스는 대규모 전체 SQL Server 인스턴스 범위 배포를 위한 것입니다. 최신 SQL Server 온프레미스(Enterprise Edition) 데이터베이스 엔진과 거의 100% 호환성을 제공하며, 일반적인 보안 문제를 해결하는 네이티브 가상 네트워크(VNet) 구현과 온프레미스 SQL Server 고객에게 유리한 비즈니스 모델을 제공합니다.

Azure SQL 가상 머신

Azure SQL 가상 머신운영 체제와 SQL Server 인스턴스를 제어할 수 있게 해주며, SQL 서버를 실행하는 VM 서비스에서 VM이 생성됩니다.

SQL 가상 머신이 생성될 때 SQL 서버를 호스팅할 VM의 모든 설정을 선택할 수 있습니다(VM 수업에서 보여준 대로).

  • 이는 VM이 일부 VNet에 접근하고, 관리 ID가 연결될 수 있으며, 파일 공유가 마운트될 수 있음을 의미합니다… SQL에서 VM으로의 피벗이 매우 흥미로워집니다.
  • 또한, SQL이 특정 키 볼트에 접근할 수 있도록 앱 ID 및 비밀을 구성할 수 있으며, 이 키 볼트는 민감한 정보를 포함할 수 있습니다.

자동 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 정책을 열거하고 싶다면, 다음과 같이 쿼리할 수 있습니다:

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;

Connect and run SQL queries

You could find a connection string (containing credentials) from example enumerating an 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

Privilege Escalation

Az - SQL Privesc

Post Exploitation

Az - SQL Post Exploitation

Persistence

Az - SQL Persistence

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기