Az - Storage Accounts & Blobs

Reading time: 13 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의 기본 서비스로, 다양한 데이터 유형에 대한 확장 가능하고 안전하며 고가용성의 클라우드 스토리지를 제공합니다, 여기에는 blobs(바이너리 대용량 객체), 파일, 큐 및 테이블이 포함됩니다. 이들은 이러한 다양한 스토리지 서비스를 단일 네임스페이스 아래에서 쉽게 관리할 수 있도록 그룹화하는 컨테이너 역할을 합니다.

주요 구성 옵션:

  • 모든 스토리지 계정은 모든 Azure에서 유일한 이름을 가져야 합니다.
  • 모든 스토리지 계정은 지역 또는 Azure 확장 영역에 배포됩니다.
  • 더 나은 성능을 위해 스토리지 계정의 프리미엄 버전을 선택할 수 있습니다.
  • 랙, 드라이브 및 데이터 센터의 실패로부터 보호하기 위해 4가지 유형의 중복성 중에서 선택할 수 있습니다.

보안 구성 옵션:

  • REST API 작업에 대한 보안 전송 요구: 스토리지와의 모든 통신에서 TLS 요구
  • 개별 컨테이너에서 익명 액세스 허용: 그렇지 않으면 향후 익명 액세스를 활성화할 수 없습니다.
  • 스토리지 계정 키 액세스 활성화: 그렇지 않으면 공유 키로의 액세스가 금지됩니다.
  • 최소 TLS 버전
  • 복사 작업에 대한 허용 범위: 모든 스토리지 계정, 동일한 Entra 테넌트의 모든 스토리지 계정 또는 동일한 가상 네트워크의 개인 엔드포인트가 있는 스토리지 계정에서 허용합니다.

Blob Storage 옵션:

  • 크로스 테넌트 복제 허용
  • 액세스 계층: 핫(자주 액세스되는 데이터), 쿨 및 콜드(드물게 액세스되는 데이터)

네트워킹 옵션:

  • 네트워크 액세스:
  • 모든 네트워크에서 허용
  • 선택된 가상 네트워크 및 IP 주소에서 허용
  • 공용 액세스를 비활성화하고 개인 액세스를 사용
  • 개인 엔드포인트: 가상 네트워크에서 스토리지 계정으로의 개인 연결을 허용합니다.

데이터 보호 옵션:

  • 컨테이너에 대한 시점 복원: 컨테이너를 이전 상태로 복원할 수 있습니다.
  • 버전 관리, 변경 피드 및 blob 소프트 삭제가 활성화되어야 합니다.
  • blob에 대한 소프트 삭제 활성화: 삭제된 blob(덮어쓴 경우에도)에 대한 보존 기간을 일수로 설정합니다.
  • 컨테이너에 대한 소프트 삭제 활성화: 삭제된 컨테이너에 대한 보존 기간을 일수로 설정합니다.
  • 파일 공유에 대한 소프트 삭제 활성화: 삭제된 파일 공유에 대한 보존 기간을 일수로 설정합니다.
  • blob에 대한 버전 관리 활성화: 이전 버전의 blob을 유지합니다.
  • blob 변경 피드 활성화: blob에 대한 생성, 수정 및 삭제 변경 사항의 로그를 유지합니다.
  • 버전 수준 불변성 지원 활성화: 모든 blob 버전에 적용되는 시간 기반 보존 정책을 계정 수준에서 설정할 수 있습니다.
  • 버전 수준 불변성 지원과 컨테이너에 대한 시점 복원은 동시에 활성화할 수 없습니다.

암호화 구성 옵션:

  • 암호화 유형: Microsoft 관리 키(MMK) 또는 고객 관리 키(CMK)를 사용할 수 있습니다.
  • 인프라 암호화 활성화: "더 많은 보안을 위해" 데이터를 이중으로 암호화할 수 있습니다.

스토리지 엔드포인트

스토리지 서비스엔드포인트
Blob storagehttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
Data Lake Storagehttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
Queue storagehttps://.queue.core.windows.net
Table storagehttps://.table.core.windows.net

공개 노출

"Blob 공개 액세스 허용"이 활성화된 경우(기본적으로 비활성화됨), 컨테이너를 생성할 때 다음을 수행할 수 있습니다:

  • blob 읽기에 대한 공개 액세스 제공(이름을 알아야 함).
  • 컨테이너 blob 나열읽기.
  • 완전히 비공개로 만들기

스토리지에 연결

연결할 수 있는 스토리지를 찾으면 Microsoft Azure Storage Explorer 도구를 사용할 수 있습니다.

스토리지 접근

RBAC

Entra ID 주체와 함께 RBAC 역할을 사용하여 스토리지 계정에 접근할 수 있으며, 이는 권장되는 방법입니다.

액세스 키

스토리지 계정에는 액세스할 수 있는 액세스 키가 있습니다. 이는 스토리지 계정에 대한 전체 액세스를 제공합니다.

공유 키 및 라이트 공유 키

특정 리소스에 대한 액세스를 승인하기 위해 액세스 키로 서명된 공유 키를 생성할 수 있습니다.

note

CanonicalizedResource 부분은 스토리지 서비스 리소스(URI)를 나타냅니다. URL의 어떤 부분이 인코딩된 경우, CanonicalizedResource 내에서도 인코딩되어야 합니다.

note

이는 기본적으로 az cli에 의해 요청을 인증하는 데 사용됩니다. Entra ID 주체 자격 증명을 사용하려면 --auth-mode login 매개변수를 지정하십시오.

  • 다음 정보를 서명하여 blob, queue 및 file 서비스에 대한 공유 키를 생성할 수 있습니다:
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, queue 및 file 서비스에 대한 lite 공유 키를 생성할 수 있습니다:
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

공유 액세스 서명 (SAS)

공유 액세스 서명(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

Azure Blob Storage에 대한 SFTP 지원

Azure Blob Storage는 이제 SSH 파일 전송 프로토콜(SFTP)을 지원하여 사용자 정의 솔루션이나 타사 제품 없이 Blob Storage에 직접 안전한 파일 전송 및 관리를 가능하게 합니다.

주요 기능

  • 프로토콜 지원: SFTP는 계층적 네임스페이스(HNS)로 구성된 Blob Storage 계정과 함께 작동합니다. 이는 블롭을 디렉터리 및 하위 디렉터리로 구성하여 탐색을 용이하게 합니다.
  • 보안: SFTP는 인증을 위해 로컬 사용자 신원을 사용하며 RBAC 또는 ABAC와 통합되지 않습니다. 각 로컬 사용자는 다음을 통해 인증할 수 있습니다:
  • Azure에서 생성된 비밀번호
  • 공개-개인 SSH 키 쌍
  • 세분화된 권한: 읽기, 쓰기, 삭제 및 목록과 같은 권한을 최대 100개의 컨테이너에 대해 로컬 사용자에게 부여할 수 있습니다.
  • 네트워킹 고려 사항: SFTP 연결은 포트 22를 통해 이루어집니다. Azure는 SFTP 트래픽을 보호하기 위해 방화벽, 개인 엔드포인트 또는 가상 네트워크와 같은 네트워크 구성을 지원합니다.

설정 요구 사항

  • 계층적 네임스페이스: 스토리지 계정을 생성할 때 HNS가 활성화되어야 합니다.
  • 지원되는 암호화: Microsoft 보안 개발 수명 주기(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 지원하기