Az - ストレージアカウントとBlob

Reading time: 21 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 Storage Accountsは、Microsoft Azureの基本的なサービスで、スケーラブルで安全かつ高可用性のあるクラウドストレージをさまざまなデータタイプに提供します。これには、Blob(バイナリ大オブジェクト)、ファイル、キュー、テーブルが含まれます。これらは、簡単な管理のために単一の名前空間の下で異なるストレージサービスをグループ化するコンテナとして機能します。

主な構成オプション:

  • すべてのストレージアカウントは、Azure全体でユニークな名前を持つ必要があります。
  • すべてのストレージアカウントは、リージョンまたはAzure拡張ゾーンにデプロイされます。
  • より良いパフォーマンスのために、ストレージアカウントのプレミアムバージョンを選択することが可能です。
  • ラック、ドライブ、データセンターの障害から保護するために、4種類の冗長性を選択できます。

セキュリティ構成オプション:

  • REST API操作のために安全な転送を要求: ストレージとの通信にTLSを要求します。
  • 個々のコンテナでの匿名アクセスを有効にすることを許可: そうでない場合、将来的に匿名アクセスを有効にすることはできません。
  • ストレージアカウントキーアクセスを有効にする: そうでない場合、共有キーによるアクセスは禁じられます。
  • 最小TLSバージョン
  • コピー操作の許可されたスコープ: すべてのストレージアカウントから、同じEntraテナントのすべてのストレージアカウントから、または同じ仮想ネットワーク内のプライベートエンドポイントを持つストレージアカウントからのアクセスを許可します。

Blobストレージオプション:

  • クロステナントレプリケーションを許可
  • アクセス層: ホット(頻繁にアクセスされるデータ)、クール、コールド(まれにアクセスされるデータ)

ネットワークオプション:

  • ネットワークアクセス:
  • すべてのネットワークから許可
  • 選択した仮想ネットワークとIPアドレスから許可
  • 公開アクセスを無効にし、プライベートアクセスを使用
  • プライベートエンドポイント: 仮想ネットワークからストレージアカウントへのプライベート接続を許可します。

データ保護オプション:

  • コンテナのポイントインタイムリストア: コンテナを以前の状態に復元することを許可します。
  • バージョニング、変更フィード、Blobソフト削除を有効にする必要があります。
  • Blobのソフト削除を有効にする: 削除されたBlob(上書きされたものも含む)に対して日数の保持期間を有効にします。
  • コンテナのソフト削除を有効にする: 削除されたコンテナに対して日数の保持期間を有効にします。
  • ファイル共有のソフト削除を有効にする: 削除されたファイル共有に対して日数の保持期間を有効にします。
  • Blobのバージョニングを有効にする: Blobの以前のバージョンを保持します。
  • Blob変更フィードを有効にする: Blobの作成、変更、削除の変更をログに保持します。
  • バージョンレベルの不変性サポートを有効にする: すべてのBlobバージョンに適用される時間ベースの保持ポリシーをアカウントレベルで設定できます。
  • バージョンレベルの不変性サポートとコンテナのポイントインタイムリストアは同時に有効にすることはできません。

暗号化構成オプション:

  • 暗号化タイプ: Microsoft管理キー(MMK)または顧客管理キー(CMK)を使用することが可能です。
  • インフラストラクチャ暗号化を有効にする: データを「より安全に」二重暗号化することを許可します。

ストレージエンドポイント

ストレージサービスエンドポイント
Blobストレージhttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
データレイクストレージhttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
キューストレージhttps://.queue.core.windows.net
テーブルストレージhttps://.table.core.windows.net

公開露出

「Blobの公開アクセスを許可」が有効(デフォルトでは無効)になっている場合、コンテナを作成する際に次のことが可能です:

  • Blobを読むための公開アクセスを提供(名前を知っている必要があります)。
  • コンテナのBlobをリストし、読むことができます。
  • 完全にプライベートにすることができます。

ストレージへの接続

接続できるストレージを見つけた場合、Microsoft Azure Storage Explorerツールを使用して接続できます。

ストレージへのアクセス

RBAC

ストレージアカウントにアクセスするために、RBACロールを使用してEntra IDプリンシパルを使用することが可能で、推奨される方法です。

アクセスキー

ストレージアカウントには、アクセスするために使用できるアクセスキーがあります。これにより、ストレージアカウントへの完全なアクセスが提供されます。

共有キーとライト共有キー

特定のリソースへのアクセスを認可するために、アクセスキーで署名された共有キーを生成することが可能です。

note

CanonicalizedResource部分は、ストレージサービスリソース(URI)を表します。URLの任意の部分がエンコードされている場合、CanonicalizedResource内でもエンコードする必要があります。

note

これはデフォルトでaz cliによって使用されます。Entra IDプリンシパルの資格情報を使用するには、パラメータ--auth-mode loginを指定します。

  • Blob、キュー、ファイルサービスのための共有キーを生成することが可能で、次の情報に署名します:
bash
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
Content-Language + "\n" +
Content-Length + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
If-Modified-Since + "\n" +
If-Match + "\n" +
If-None-Match + "\n" +
If-Unmodified-Since + "\n" +
Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
  • テーブルサービスのための共有キーを生成することは、以下の情報に署名することで可能です:
bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
  • Blob、キュー、ファイルサービスのためのライト共有キーを生成することが可能で、以下の情報に署名します:
bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
  • テーブルサービスのためのライト共有キーを生成することが可能です。次の情報に署名します:
bash
StringToSign = Date + "\n"
CanonicalizedResource

その後、キーを使用するには、次の構文に従ってAuthorizationヘッダーに記述できます:

bash
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=

PUT http://myaccount/mycontainer?restype=container&timeout=30 HTTP/1.1
x-ms-version: 2014-02-14
x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
Content-Length: 0

Shared Access Signature (SAS)

Shared Access Signatures (SAS) は、アカウントのアクセスキーを公開することなく、Azure Storage アカウント内のリソースにアクセスするための特定の権限を付与する安全で時間制限のある URL です。アクセスキーはすべてのリソースに対する完全な管理アクセスを提供しますが、SAS は権限(読み取りや書き込みなど)を指定し、期限を定義することで、より細かい制御を可能にします。

SAS タイプ

  • ユーザー委任 SAS: これは Entra ID プリンシパル から作成され、SAS に署名し、ユーザーから SAS への権限を委任します。これは blob およびデータレイクストレージ でのみ使用できます (docs)。生成されたすべてのユーザー委任 SAS を 取り消す ことが可能です。
  • ユーザーが持っている権限よりも「多くの」権限を持つ委任 SAS を生成することは可能ですが、プリンシパルがそれらの権限を持っていない場合は機能しません(権限昇格はありません)。
  • サービス SAS: これはストレージアカウントの アクセスキー のいずれかを使用して署名されます。これは、単一のストレージサービス内の特定のリソースへのアクセスを付与するために使用できます。キーが更新されると、SAS は機能しなくなります。
  • アカウント SAS: これもストレージアカウントの アクセスキー のいずれかで署名されます。これは、ストレージアカウントサービス(Blob、Queue、Table、File)全体のリソースへのアクセスを付与し、サービスレベルの操作を含むことができます。

アクセスキー で署名された SAS URL は次のようになります:

  • https://<container_name>.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D

ユーザー委任 として署名された SAS URL は次のようになります:

  • https://<container_name>.blob.core.windows.net/testing-container?sp=r&st=2024-11-22T15:07:40Z&se=2024-11-22T23:07:40Z&skoid=d77c71a1-96e7-483d-bd51-bd753aa66e62&sktid=fdd066e1-ee37-49bc-b08f-d0e152119b04&skt=2024-11-22T15:07:40Z&ske=2024-11-22T23:07:40Z&sks=b&skv=2022-11-02&spr=https&sv=2022-11-02&sr=c&sig=7s5dJyeE6klUNRulUj9TNL0tMj2K7mtxyRc97xbYDqs%3D

いくつかの http パラメータ に注意してください:

  • se パラメータは SAS の 有効期限 を示します
  • sp パラメータは SAS の 権限 を示します
  • sig は SAS を検証するための 署名 です

SAS 権限

SAS を生成する際には、付与すべき権限を示す必要があります。SAS が生成されるオブジェクトによって、異なる権限が含まれる場合があります。例えば:

  • (a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete

SFTP サポート for Azure Blob Storage

Azure Blob Storage は現在、SSH ファイル転送プロトコル (SFTP) をサポートしており、カスタムソリューションやサードパーティ製品を必要とせずに、Blob Storage への安全なファイル転送と管理を可能にします。

主な機能

  • プロトコルサポート: SFTP は階層名前空間 (HNS) で構成された Blob Storage アカウントで動作します。これにより、Blob をディレクトリおよびサブディレクトリに整理し、ナビゲーションを容易にします。
  • セキュリティ: SFTP は認証のためにローカルユーザーのアイデンティティを使用し、RBAC や ABAC とは統合されていません。各ローカルユーザーは次の方法で認証できます:
  • Azure 生成のパスワード
  • 公開鍵-秘密鍵の SSH キーペア
  • 細かい権限: 読み取り、書き込み、削除、リストなどの権限を最大 100 のコンテナに対してローカルユーザーに割り当てることができます。
  • ネットワークの考慮事項: SFTP 接続はポート 22 を通じて行われます。Azure は、SFTP トラフィックを保護するためにファイアウォール、プライベートエンドポイント、または仮想ネットワークなどのネットワーク構成をサポートしています。

セットアップ要件

  • 階層名前空間: ストレージアカウントを作成する際に HNS を有効にする必要があります。
  • サポートされる暗号化: Microsoft Security Development Lifecycle (SDL) に承認された暗号アルゴリズム (例: rsa-sha2-256, ecdsa-sha2-nistp256) が必要です。
  • SFTP 設定:
  • ストレージアカウントで SFTP を有効にします。
  • 適切な権限を持つローカルユーザーのアイデンティティを作成します。
  • コンテナ内でのユーザーの開始位置を定義するために、ユーザーのホームディレクトリを構成します。

権限

権限シンボル説明
読み取りrファイルの内容を読み取ります。
書き込みwファイルをアップロードし、ディレクトリを作成します。
リストlディレクトリの内容をリストします。
削除dファイルまたはディレクトリを削除します。
作成cファイルまたはディレクトリを作成します。
所有権の変更o所有するユーザーまたはグループを変更します。
権限の変更pファイルまたはディレクトリの ACL を変更します。

列挙

bash
# Get storage accounts
az storage account list #Get the account name from here

# BLOB STORAGE
## List containers
az storage container list --account-name <name>
## Check if public access is allowed
az storage container show-permission \
--account-name <acc-name> \
-n <container-name>
## Make a container public
az storage container set-permission \
--public-access container \
--account-name <acc-name> \
-n <container-name>
## List blobs in a container
az storage blob list \
--container-name <container name> \
--account-name <account name>
## Download blob
az storage blob download \
--account-name <account name> \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
## Create container policy
az storage container policy create \
--account-name mystorageaccount \
--container-name mycontainer \
--name fullaccesspolicy \
--permissions racwdl \
--start 2023-11-22T00:00Z \
--expiry 2024-11-22T00:00Z

# QUEUE
az storage queue list --account-name <name>
az storage message peek --account-name <name> --queue-name <queue-name>

# ACCESS KEYS
az storage account keys list --account-name <name>
## Check key policies (expiration time?)
az storage account show -n <name> --query "{KeyPolicy:keyPolicy}"
## Once having the key, it's possible to use it with the argument --account-key
## Enum blobs with account key
az storage blob list \
--container-name <container name> \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw=="
## Download a file using an account key
az storage blob download \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--name <blob name> \
--file </path/to/local/file>
## Upload a file using an account key
az storage blob upload \
--account-name <account name> \
--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \
--container-name <container name> \
--file </path/to/local/file>

# SAS
## List access policies
az storage <container|queue|share|table> policy list \
--account-name <acc name> \
--container-name <container name>

## Generate SAS with all permissions using an access key
az storage <container|queue|share|table|blob> generate-sas \
--permissions acdefilmrtwxy \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
-n <container-name>

## Generate SAS with all permissions using via user delegation
az storage <container|queue|share|table|blob> generate-sas \
--permissions acdefilmrtwxy \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name> \
--as-user --auth-mode login \
-n <container-name>

## Generate account SAS
az storage account generate-sas \
--expiry 2024-12-31T23:59:00Z \
--account-name <acc-name>  \
--services qt \
--resource-types sco \
--permissions acdfilrtuwxy

## Use the returned SAS key with the param --sas-token
## e.g.
az storage blob show \
--account-name <account name> \
--container-name <container name> \
--sas-token 'se=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3D' \
--name 'asd.txt'

#Local-Users
## List users
az storage account local-user list \
--account-name <storage-account-name> \
--resource-group <resource-group-name>
## Get user
az storage account local-user show \
--account-name <storage-account-name> \
--resource-group <resource-group-name> \
--name <local-user-name>

## List keys
az storage account local-user list \
--account-name <storage-account-name> \
--resource-group <resource-group-name>

ファイル共有

Az - File Shares

権限昇格

Az - Storage Privesc

ポストエクスプロイト

Az - Blob Storage Post Exploitation

永続性

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