# Az - File Shares

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

## 基本情報

**Azure Files** は、標準の **SMB (Server Message Block)** および **NFS (Network File System)** プロトコルを介してアクセス可能な共有ファイルストレージを提供する完全に管理されたクラウドファイルストレージサービスです。主に使用されるプロトコルはSMBですが、NFS Azureファイル共有はWindowsではサポートされていません（[**docs**](https://learn.microsoft.com/en-us/azure/storage/files/files-nfs-protocol)による）。これにより、複数の仮想マシン (VM) またはオンプレミスシステムによって同時にアクセス可能な高可用性のネットワークファイル共有を作成でき、環境間でシームレスなファイル共有が可能になります。

### アクセス階層

- **トランザクション最適化**: トランザクションが多い操作に最適化されています。
- **ホット**: トランザクションとストレージのバランスが取れています。
- **クール**: ストレージにコスト効果的です。
- **プレミアム**: 低遅延およびIOPS集中的なワークロードに最適化された高性能ファイルストレージです。

### バックアップ

- **日次バックアップ**: 指定された時間（例: 19.30 UTC）に毎日バックアップポイントが作成され、1日から200日間保存されます。
- **週次バックアップ**: 指定された曜日と時間（毎週日曜日の19.30）にバックアップポイントが作成され、1週間から200週間保存されます。
- **月次バックアップ**: 指定された日と時間（例: 毎月の最初の日曜日の19.30）にバックアップポイントが作成され、1ヶ月から120ヶ月保存されます。
- **年次バックアップ**: 指定された日と時間（例: 1月の最初の日曜日の19.30）にバックアップポイントが作成され、1年から10年間保存されます。
- **手動バックアップおよびスナップショットをいつでも実行することも可能です**。この文脈では、バックアップとスナップショットは実際には同じです。

### SMB経由でサポートされる認証

- **オンプレミスAD DS認証**: オンプレミスのActive Directory資格情報を使用し、Microsoft Entra IDと同期されているアイデンティティベースのアクセスを提供します。オンプレミスAD DSへのネットワーク接続が必要です。
- **Microsoft Entraドメインサービス認証**: Microsoft Entraドメインサービス（クラウドベースのAD）を利用して、Microsoft Entra資格情報を使用してアクセスを提供します。
- **ハイブリッドアイデンティティのためのMicrosoft Entra Kerberos**: Microsoft Entraユーザーがインターネット経由でAzureファイル共有をKerberosを使用して認証できるようにします。オンプレミスのドメインコントローラーへの接続を必要とせず、ハイブリッドMicrosoft Entra参加またはMicrosoft Entra参加のVMをサポートします。ただし、クラウド専用のアイデンティティはサポートされていません。
- **LinuxクライアントのためのAD Kerberos認証**: LinuxクライアントがオンプレミスAD DSまたはMicrosoft Entraドメインサービスを介してSMB認証のためにKerberosを使用できるようにします。

## 列挙

{{#tabs }}
{{#tab name="az" }}
```bash
# Get storage accounts
az storage account list #Get the account name from here

# List file shares
az storage share list --account-name <name>
az storage share-rm list --storage-account <name> # To see the deleted ones too --include-deleted
# Get dirs/files inside the share
az storage file list --account-name <name> --share-name <share-name>
## If type is "dir", you can continue enumerating files inside of it
az storage file list --account-name <name> --share-name <prev_dir/share-name>
# Download a complete share (with directories and files inside of them)
az storage file download-batch -d . --source <share-name> --account-name <name>
# List snapshots
az storage share snapshot --name <share-name>
# List file shares, including deleted ones
az rest --method GET \
--url "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}/fileServices/default/shares?%24skipToken=&%24maxpagesize=20&%24filter=&%24expand=deleted&api-version=2019-06-01"

# Get snapshots/backups
az storage share list --account-name <name> --include-snapshots --query "[?snapshot != null]"
# List contents of a snapshot/backup
az storage file list --account-name <name> --share-name <share-name> --snapshot <snapshot-version> #e.g. "2024-11-25T11:26:59.0000000Z"
# Download snapshot/backup
az storage file download-batch -d . --account-name <name> --source <share-name> --snapshot <snapshot-version>
```
{{#endtab }}

{{#tab name="Az Powershell" }}
```bash
Get-AzStorageAccount

# List File Shares
Get-AzStorageShare -Context (Get-AzStorageAccount -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>").Context

# Get Directories/Files Inside the Share
Get-AzStorageFile -ShareName "<share-name>" -Context (Get-AzStorageAccount -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>").Context
Get-AzStorageFile -ShareName "<share-name>" -Path "<share-directory-path>" -Context (Get-AzStorageAccount -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>").Context

# Download a Complete Share
Get-AzStorageFileContent -ShareName "<share-name>" -Destination "C:\Download" -Path "<share-directory-path>" -Context (Get-AzStorageAccount -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>").Context

# Get Snapshots/Backups
Get-AzStorageShare -Context (Get-AzStorageAccount -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>").Context | Where-Object { $_.SnapshotTime -ne $null }

# List Contents of a Snapshot/Backup
Get-AzStorageFile -ShareName "<share-name>" -Context (New-AzStorageContext -StorageAccountName "<storage-account-name>" -StorageAccountKey (Get-AzStorageAccountKey -ResourceGroupName "<resource-group-name>" -Name "<storage-account-name>" | Select-Object -ExpandProperty Value) -SnapshotTime "<snapshot-version>")

```
{{#endtab }}
{{#endtabs }}

> [!NOTE]
> デフォルトでは、`az` cliはアカウントキーを使用してキーに署名し、アクションを実行します。Entra IDプリンシパルの権限を使用するには、パラメータ`--auth-mode login --enable-file-backup-request-intent`を使用してください。

> [!TIP]
> 使用するアカウントキーを示すには、パラメータ`--account-key`を使用します\
> SASトークンを使用してアクセスするには、SASトークンと共にパラメータ`--sas-token`を使用します。

### 接続

これらは、執筆時にAzureが提案したファイル共有に接続するためのスクリプトです：

`<STORAGE-ACCOUNT>`、`<ACCESS-KEY>`、および`<FILE-SHARE-NAME>`のプレースホルダーを置き換える必要があります。

{{#tabs}}
{{#tab name="Windows"}}
```bash
$connectTestResult = Test-NetConnection -ComputerName filescontainersrdtfgvhb.file.core.windows.net -Port 445
if ($connectTestResult.TcpTestSucceeded) {
# Save the password so the drive will persist on reboot
cmd.exe /C "cmdkey /add:`"<STORAGE-ACCOUNT>.file.core.windows.net`" /user:`"localhost\<STORAGE-ACCOUNT>`" /pass:`"<ACCESS-KEY>`""
# Mount the drive
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\<STORAGE-ACCOUNT>.file.core.windows.net\<FILE-SHARE-NAME>" -Persist
} else {
Write-Error -Message "Unable to reach the Azure storage account via port 445. Check to make sure your organization or ISP is not blocking port 445, or use Azure P2S VPN, Azure S2S VPN, or Express Route to tunnel SMB traffic over a different port."
}
```
{{#endtab}}

{{#tab name="Linux"}}
```bash
sudo mkdir /mnt/disk-shareeifrube
if [ ! -d "/etc/smbcredentials" ]; then
sudo mkdir /etc/smbcredentials
fi
if [ ! -f "/etc/smbcredentials/<STORAGE-ACCOUNT>.cred" ]; then
sudo bash -c 'echo "username=<STORAGE-ACCOUNT>" >> /etc/smbcredentials/<STORAGE-ACCOUNT>.cred'
sudo bash -c 'echo "password=<ACCESS-KEY>" >> /etc/smbcredentials/<STORAGE-ACCOUNT>.cred'
fi
sudo chmod 600 /etc/smbcredentials/<STORAGE-ACCOUNT>.cred

sudo bash -c 'echo "//<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME> /mnt/<FILE-SHARE-NAME> cifs nofail,credentials=/etc/smbcredentials/<STORAGE-ACCOUNT>.cred,dir_mode=0777,file_mode=0777,serverino,nosharesock,actimeo=30" >> /etc/fstab'
sudo mount -t cifs //<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME> /mnt/<FILE-SHARE-NAME> -o credentials=/etc/smbcredentials/<STORAGE-ACCOUNT>.cred,dir_mode=0777,file_mode=0777,serverino,nosharesock,actimeo=30
```
{{#endtab}}

{{#tab name="macOS"}}
```bash
open smb://<STORAGE-ACCOUNT>:<ACCESS-KEY>@<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>
```
{{#endtab}}
{{#endtabs}}

### 定期ストレージ列挙 (アクセスキー、SAS...)

{{#ref}}
az-storage.md
{{#endref}}

## 権限昇格

ストレージの権限昇格と同じです:

{{#ref}}
../az-privilege-escalation/az-storage-privesc.md
{{#endref}}

## ポストエクスプロイト

{{#ref}}
../az-post-exploitation/az-file-share-post-exploitation.md
{{#endref}}

## 永続性

ストレージの永続性と同じです:

{{#ref}}
../az-persistence/az-storage-persistence.md
{{#endref}}

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