Az - SQL

Reading time: 18 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は、4つの主要な提供物で構成されています:

  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 Security Features

ネットワークアクセス:

  • 公開エンドポイント(特定のネットワークへのアクセスを制限できます)。
  • プライベートエンドポイント。
  • ドメイン名に基づいて接続を制限することも可能です。
  • Azureサービスがアクセスできるようにすることも可能です(ポータル内のクエリエディタを使用するためや、Azure VMが接続できるようにするため)。

認証方法:

  • Microsoft Entra-only 認証: サービスにアクセスするEntraプリンシパルを指定する必要があります。
  • SQLとMicrosoft Entraの両方の認証: ユーザー名とパスワードを使用した従来のSQL認証とMicrosoft Entraの併用。
  • SQLのみの認証: データベースユーザーを介してのみアクセスを許可します。

SQL認証が許可されている場合、管理者ユーザー(ユーザー名 + パスワード)を指定する必要があり、Entra ID認証が選択されている場合は、管理アクセスを持つ少なくとも1つのプリンシパルを指定する必要があります。

暗号化:

  • 「透過的データ暗号化」と呼ばれ、データベース、バックアップ、およびログを静止状態で暗号化します。

  • 常に、デフォルトでAzure管理キーが使用されますが、顧客管理暗号化キー(CMEK)も使用できます。 管理されたID:

  • システムおよびユーザー管理のMIを割り当てることが可能です。

  • 暗号化キー(CMEKが使用されている場合)やデータベースからの他のサービスにアクセスするために使用されます。

  • データベースからアクセスできるAzureサービスのいくつかの例については、このドキュメントのページを確認してください。

  • 1つ以上の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 Database Security Features

  • 常に最新: 最新の安定版SQL Serverで実行され、新機能やパッチを自動的に受け取ります。
  • 継承されたSQL Serverのセキュリティ機能:
  • 認証 (SQLおよび/またはEntra ID)
  • 割り当てられたマネージドID
  • ネットワーク制限
  • 暗号化
  • バックアップ
  • データ冗長性: オプションはローカル、ゾーン、地理的または地理的ゾーン冗長です。
  • 台帳: データの整合性を暗号的に検証し、改ざんが検出されることを保証します。金融、医療、機密データを管理する組織にとって有用です。

SQLデータベースはエラスティックプールの一部である可能性があります。エラスティックプールは、複数のデータベースを管理するためのコスト効果の高いソリューションで、構成可能なコンピュート (eDTUs) とストレージリソースを共有し、価格はデータベースの数ではなく、割り当てられたリソースに基づいています。

Azure SQL Column Level Security (Masking) & Row Level Security

Azure SQLの動的データマスキングは、機密情報を保護するための機能で、無許可のユーザーから隠します。実際のデータを変更するのではなく、表示されるデータを動的にマスクし、クレジットカード番号などの機密情報が隠されることを保証します。

動的データマスキングは、マスクされていないユーザー(これらのユーザーは指定する必要があります)と管理者を除くすべてのユーザーに影響します。動的データマスキングから免除されるSQLユーザーを指定する構成オプションがあり、管理者は常に除外されます

**Azure SQL Row Level Security (RLS)**は、ユーザーが表示または変更できる行を制御する機能で、各ユーザーが自分に関連するデータのみを表示できるようにします。フィルターまたはブロック述語を使用してセキュリティポリシーを作成することで、組織はデータベースレベルでの細かいアクセス制御を強制できます。

Azure SQL Managed Instance

Azure SQL Managed Instancesは、大規模なSQL Serverインスタンススコープの展開向けです。最新のSQL Serverオンプレミス(Enterprise Edition)データベースエンジンとの互換性がほぼ100%で、一般的なセキュリティの懸念に対処するネイティブの仮想ネットワーク(VNet)実装を提供し、オンプレミスのSQL Server顧客にとって有利なビジネスモデルを提供します。

Azure SQL Virtual Machines

Azure SQL Virtual Machinesは、オペレーティングシステムとSQL Serverインスタンスを制御できるようにします。VMサービスでSQLサーバーを実行するVMが生成されます。

SQL仮想マシンが作成されると、SQLサーバーをホストするVMのすべての設定を選択することが可能です(VMレッスンに示されているように)。

  • これは、VMがいくつかのVNetにアクセスし、マネージドIDが添付されている可能性があり、ファイル共有がマウントされることを意味します… SQLからVMへのピボットが非常に興味深いです。
  • さらに、特定のキーコンテナにアクセスするためにSQLがアプリIDとシークレットを構成することも可能で、そこには機密情報が含まれている可能性があります。

自動SQL更新、自動バックアップ、Entra ID認証、その他のSQLサービスのほとんどの機能などを構成することも可能です。

Enumeration

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"

データベース内でダイナミックデータマスキングおよび行レベルポリシーを列挙したい場合は、次のクエリを実行できます:

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>

参考文献

権限昇格

Az - SQL Privesc

ポストエクスプロイテーション

Az - SQL Post Exploitation

永続性

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をサポートする