# Az - Storage Privesc

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

## Storage Privesc

ストレージに関する詳細情報は、以下を確認してください:

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

### `Microsoft.Storage/storageAccounts/listkeys/action`

この権限を持つプリンシパルは、ストレージアカウントの**アクセスキー**のリスト（および秘密値）を表示できるようになります。これにより、プリンシパルはストレージアカウントに対する権限を昇格させることができます。
```bash
az storage account keys list --account-name <acc-name>
```
### `Microsoft.Storage/storageAccounts/regenerateKey/action`

この権限を持つプリンシパルは、ストレージアカウントの**アクセスキー**の新しい秘密値を更新および取得することができます。これにより、プリンシパルはストレージアカウントに対する権限を昇格させることができます。

さらに、レスポンスには更新されたキーの値と更新されていないキーの値も含まれます：
```bash
az storage account keys renew --account-name <acc-name> --key key2
```
### `Microsoft.Storage/storageAccounts/write`

この権限を持つプリンシパルは、ネットワークルールやポリシーなどの設定を更新して、既存のストレージアカウントを作成または更新することができます。
```bash
# e.g. set default action to allow so network restrictions are avoided
az storage account update --name <acc-name> --default-action Allow

# e.g. allow an IP address
az storage account update --name <acc-name> --add networkRuleSet.ipRules value=<ip-address>
```
## Blobs Specific privesc

### `Microsoft.Storage/storageAccounts/blobServices/containers/immutabilityPolicies/write` | `Microsoft.Storage/storageAccounts/blobServices/containers/immutabilityPolicies/delete`

最初の権限はコンテナ内の**不変ポリシーを変更する**ことを許可し、2番目はそれらを削除することを許可します。

> [!NOTE]
> 不変ポリシーがロック状態にある場合、どちらの操作も行えないことに注意してください。
```bash
az storage container immutability-policy delete \
--account-name <STORAGE_ACCOUNT_NAME> \
--container-name <CONTAINER_NAME> \
--resource-group <RESOURCE_GROUP>

az storage container immutability-policy update \
--account-name <STORAGE_ACCOUNT_NAME> \
--container-name <CONTAINER_NAME> \
--resource-group <RESOURCE_GROUP> \
--period <NEW_RETENTION_PERIOD_IN_DAYS>
```
## ファイル共有特有の特権昇格

### `Microsoft.Storage/storageAccounts/fileServices/takeOwnership/action`

この権限を持つユーザーは、共有ファイルシステム内のファイルの所有権を取得できるはずです。

### `Microsoft.Storage/storageAccounts/fileServices/fileshares/files/modifypermissions/action`

この権限を持つユーザーは、共有ファイルシステム内のファイルの権限を変更できるはずです。

### `Microsoft.Storage/storageAccounts/fileServices/fileshares/files/actassuperuser/action`

この権限を持つユーザーは、スーパーユーザーとしてファイルシステム内でアクションを実行できるはずです。

### `Microsoft.Storage/storageAccounts/localusers/write (Microsoft.Storage/storageAccounts/localusers/read)`

この権限を持つ攻撃者は、Azure Storage アカウント（階層名前空間で構成されている）用の新しいローカルユーザーを作成および更新（`Microsoft.Storage/storageAccounts/localusers/read` 権限がある場合）できます。これには、ユーザーの権限やホームディレクトリを指定することが含まれます。この権限は、攻撃者が読み取り（r）、書き込み（w）、削除（d）、リスト（l）などの特定の権限を持つストレージアカウントを自分に付与できるため、重要です。さらに、これに使用される認証方法は、Azure生成のパスワードやSSHキーのペアです。ユーザーがすでに存在するかどうかのチェックはないため、既存の他のユーザーを上書きすることができます。攻撃者は特権を昇格させ、ストレージアカウントへのSSHアクセスを取得し、機密データを露出または侵害する可能性があります。
```bash
az storage account local-user create \
--account-name <STORAGE_ACCOUNT_NAME> \
--resource-group <RESOURCE_GROUP_NAME> \
--name <LOCAL_USER_NAME> \
--permission-scope permissions=rwdl service=blob resource-name=<CONTAINER_NAME> \
--home-directory <HOME_DIRECTORY> \
--has-ssh-key false/true # Depends on the auth method to use
```
### `Microsoft.Storage/storageAccounts/localusers/regeneratePassword/action`

この権限を持つ攻撃者は、Azure Storage アカウント内のローカルユーザーのパスワードを再生成できます。これにより、攻撃者はユーザーの新しい認証情報（SSH または SFTP パスワードなど）を取得する能力を得ます。これらの認証情報を利用することで、攻撃者はストレージアカウントへの不正アクセスを行ったり、ファイル転送を行ったり、ストレージコンテナ内のデータを操作したりすることができます。これにより、データの漏洩、破損、またはストレージアカウントの内容の悪意のある変更が発生する可能性があります。
```bash
az storage account local-user regenerate-password \
--account-name <STORAGE_ACCOUNT_NAME> \
--resource-group <RESOURCE_GROUP_NAME> \
--name <LOCAL_USER_NAME>
```
Azure Blob StorageにSFTPを介してアクセスするには（is_hns_enabledはtrueである必要があります）、ローカルユーザーを介してSFTPを使用できます（接続するためにsshキーを使用することもできます）：
```bash
sftp <storage-account-name>.<local-user-name>@<storage-account-name>.blob.core.windows.net
#regenerated-password
```
### `Microsoft.Storage/storageAccounts/restoreBlobRanges/action`, `Microsoft.Storage/storageAccounts/blobServices/containers/read`, `Microsoft.Storage/storageAccounts/read` && `Microsoft.Storage/storageAccounts/listKeys/action`

これらの権限を持つ攻撃者は、削除されたバージョンIDを指定することで削除されたコンテナを復元したり、以前にソフト削除された場合にコンテナ内の特定のBlobを復元したりすることができます。この特権昇格により、攻撃者は永久に削除される予定だった機密データを回復できる可能性があり、無許可のアクセスにつながる可能性があります。
```bash
#Restore the soft deleted container
az storage container restore \
--account-name <STORAGE_ACCOUNT_NAME> \
--name <CONTAINER_NAME> \
--deleted-version <VERSION>

#Restore the soft deleted blob
az storage blob undelete \
--account-name <STORAGE_ACCOUNT_NAME> \
--container-name <CONTAINER_NAME> \
--name "fileName.txt"
```
### `Microsoft.Storage/storageAccounts/fileServices/shares/restore/action` && `Microsoft.Storage/storageAccounts/read`

これらの権限を持つ攻撃者は、削除されたバージョンIDを指定することで削除されたAzureファイル共有を復元できます。この特権の昇格により、攻撃者は永久に削除される予定だった機密データを回復できる可能性があり、無許可のアクセスにつながる可能性があります。
```bash
az storage share-rm restore \
--storage-account <STORAGE_ACCOUNT_NAME> \
--name <FILE_SHARE_NAME> \
--deleted-version <VERSION>
```
## その他の興味深い権限 (TODO)

- Microsoft.Storage/storageAccounts/blobServices/containers/blobs/manageOwnership/action: ブロブの所有権を変更します
- Microsoft.Storage/storageAccounts/blobServices/containers/blobs/modifyPermissions/action: ブロブの権限を変更します
- Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action: ブロブコマンドの結果を返します
- Microsoft.Storage/storageAccounts/blobServices/containers/blobs/immutableStorage/runAsSuperUser/action

## 参考文献

- [https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/storage#microsoftstorage](https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/storage#microsoftstorage)
- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support)

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