20 KiB
Az - Cuentas de Almacenamiento y Blobs
{{#include ../../../banners/hacktricks-training.md}}
Información Básica
Las Cuentas de Almacenamiento de Azure son servicios fundamentales en Microsoft Azure que proporcionan almacenamiento en la nube escalable, seguro y altamente disponible para varios tipos de datos, incluidos blobs (objetos grandes binarios), archivos, colas y tablas. Sirven como contenedores que agrupan estos diferentes servicios de almacenamiento bajo un único espacio de nombres para una gestión fácil.
Opciones de configuración principales:
- Cada cuenta de almacenamiento debe tener un nombre único en todas las Azure.
- Cada cuenta de almacenamiento se despliega en una región o en una zona extendida de Azure.
- Es posible seleccionar la versión premium de la cuenta de almacenamiento para un mejor rendimiento.
- Es posible seleccionar entre 4 tipos de redundancia para proteger contra fallos de rack, disco y centro de datos.
Opciones de configuración de seguridad:
- Requerir transferencia segura para operaciones de API REST: Requerir TLS en cualquier comunicación con el almacenamiento.
- Permitir habilitar acceso anónimo en contenedores individuales: Si no, no será posible habilitar el acceso anónimo en el futuro.
- Habilitar acceso con clave de cuenta de almacenamiento: Si no, el acceso con Claves Compartidas estará prohibido.
- Versión mínima de TLS.
- Ámbito permitido para operaciones de copia: Permitir desde cualquier cuenta de almacenamiento, desde cualquier cuenta de almacenamiento del mismo inquilino de Entra o desde cuentas de almacenamiento con puntos finales privados en la misma red virtual.
Opciones de Almacenamiento de Blobs:
- Permitir replicación entre inquilinos.
- Nivel de acceso: Caliente (datos de acceso frecuente), Frío y Frío (datos de acceso raro).
Opciones de Red:
- Acceso a la red:
- Permitir desde todas las redes.
- Permitir desde redes virtuales seleccionadas y direcciones IP.
- Deshabilitar el acceso público y usar acceso privado.
- Puntos finales privados: Permite una conexión privada a la cuenta de almacenamiento desde una red virtual.
Opciones de protección de datos:
- Restauración en el tiempo para contenedores: Permite restaurar contenedores a un estado anterior.
- Requiere que la versionado, el cambio de alimentación y la eliminación suave de blobs estén habilitados.
- Habilitar eliminación suave para blobs: Permite un período de retención en días para blobs eliminados (incluso sobrescritos).
- Habilitar eliminación suave para contenedores: Permite un período de retención en días para contenedores eliminados.
- Habilitar eliminación suave para comparticiones de archivos: Permite un período de retención en días para comparticiones de archivos eliminadas.
- Habilitar versionado para blobs: Mantener versiones anteriores de tus blobs.
- Habilitar cambio de alimentación de blobs: Mantener registros de creación, modificación y eliminación de cambios en blobs.
- Habilitar soporte de inmutabilidad a nivel de versión: Permite establecer una política de retención basada en el tiempo a nivel de cuenta que se aplicará a todas las versiones de blobs.
- El soporte de inmutabilidad a nivel de versión y la restauración en el tiempo para contenedores no se pueden habilitar simultáneamente.
Opciones de configuración de cifrado:
- Tipo de cifrado: Es posible usar claves gestionadas por Microsoft (MMK) o claves gestionadas por el cliente (CMK).
- Habilitar cifrado de infraestructura: Permite cifrar los datos "para más seguridad".
Puntos finales de almacenamiento
| Servicio de Almacenamiento | Punto final |
|---|---|
| Almacenamiento de Blobs | https://.blob.core.windows.nethttps://.blob.core.windows.net/?restype=container&comp=list |
| Almacenamiento de Data Lake | https://.dfs.core.windows.net |
| Azure Files | https://.file.core.windows.net |
| Almacenamiento de Colas | https://.queue.core.windows.net |
| Almacenamiento de Tablas | https://.table.core.windows.net |
Exposición Pública
Si "Permitir acceso público a Blob" está habilitado (deshabilitado por defecto), al crear un contenedor es posible:
- Dar acceso público para leer blobs (necesitas conocer el nombre).
- Listar blobs del contenedor y leer.
- Hacerlo completamente privado.
Conectar a Almacenamiento
Si encuentras algún almacenamiento al que puedas conectarte, podrías usar la herramienta Microsoft Azure Storage Explorer para hacerlo.
Acceso al Almacenamiento
RBAC
Es posible usar principios de Entra ID con roles RBAC para acceder a cuentas de almacenamiento y es la forma recomendada.
Claves de Acceso
Las cuentas de almacenamiento tienen claves de acceso que se pueden usar para acceder a ellas. Esto proporciona acceso total a la cuenta de almacenamiento.

Claves Compartidas y Claves Compartidas Lite
Es posible generar Claves Compartidas firmadas con las claves de acceso para autorizar el acceso a ciertos recursos a través de una URL firmada.
Note
Ten en cuenta que la parte
CanonicalizedResourcerepresenta el recurso de servicios de almacenamiento (URI). Y si alguna parte de la URL está codificada, también debe estar codificada dentro deCanonicalizedResource.
Note
Esto es utilizado por defecto por
azcli para autenticar solicitudes. Para hacer que use las credenciales del principal de Entra ID, indica el parámetro--auth-mode login.
- Es posible generar una clave compartida para servicios de blob, cola y archivo firmando la siguiente información:
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;
- Es posible generar una clave compartida para los servicios de tabla firmando la siguiente información:
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
- Es posible generar una clave compartida ligera para los servicios de blob, cola y archivo firmando la siguiente información:
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
- Es posible generar una lite shared key for table services firmando la siguiente información:
StringToSign = Date + "\n"
CanonicalizedResource
Luego, para usar la clave, se puede hacer en el encabezado de Autorización siguiendo la sintaxis:
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)
Las Firmas de Acceso Compartido (SAS) son URLs seguras y limitadas en el tiempo que otorgan permisos específicos para acceder a recursos en una cuenta de Azure Storage sin exponer las claves de acceso de la cuenta. Mientras que las claves de acceso proporcionan acceso administrativo completo a todos los recursos, SAS permite un control granular al especificar permisos (como lectura o escritura) y definir un tiempo de expiración.
Tipos de SAS
- SAS de delegación de usuario: Esto se crea a partir de un principal de Entra ID que firmará el SAS y delegará los permisos del usuario al SAS. Solo se puede usar con blob y almacenamiento de data lake (docs). Es posible revocar todos los SAS delegados generados por el usuario.
- Aunque es posible generar un SAS de delegación con "más" permisos de los que tiene el usuario. Sin embargo, si el principal no los tiene, no funcionará (sin privesc).
- SAS de servicio: Esto se firma utilizando una de las claves de acceso de la cuenta de almacenamiento. Se puede usar para otorgar acceso a recursos específicos en un solo servicio de almacenamiento. Si la clave se renueva, el SAS dejará de funcionar.
- SAS de cuenta: También se firma con una de las claves de acceso de la cuenta de almacenamiento. Otorga acceso a recursos a través de los servicios de la cuenta de almacenamiento (Blob, Queue, Table, File) y puede incluir operaciones a nivel de servicio.
Una URL SAS firmada por una clave de acceso se ve así:
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
Una URL SAS firmada como delegación de usuario se ve así:
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
Nota algunos parámetros http:
- El parámetro
seindica la fecha de expiración del SAS - El parámetro
spindica los permisos del SAS - El
siges la firma que valida el SAS
Permisos SAS
Al generar un SAS, es necesario indicar los permisos que debe otorgar. Dependiendo del objeto sobre el cual se está generando el SAS, se pueden incluir diferentes permisos. Por ejemplo:
- (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
Soporte SFTP para Azure Blob Storage
Azure Blob Storage ahora admite el Protocolo de Transferencia de Archivos SSH (SFTP), lo que permite la transferencia y gestión segura de archivos directamente a Blob Storage sin requerir soluciones personalizadas o productos de terceros.
Características Clave
- Soporte de Protocolo: SFTP funciona con cuentas de Blob Storage configuradas con espacio de nombres jerárquico (HNS). Esto organiza los blobs en directorios y subdirectorios para una navegación más fácil.
- Seguridad: SFTP utiliza identidades de usuario locales para la autenticación y no se integra con RBAC o ABAC. Cada usuario local puede autenticarse a través de:
- Contraseñas generadas por Azure
- Pares de claves SSH públicas y privadas
- Permisos Granulares: Se pueden asignar permisos como Leer, Escribir, Eliminar y Listar a usuarios locales para hasta 100 contenedores.
- Consideraciones de Red: Las conexiones SFTP se realizan a través del puerto 22. Azure admite configuraciones de red como firewalls, puntos finales privados o redes virtuales para asegurar el tráfico SFTP.
Requisitos de Configuración
- Espacio de Nombres Jerárquico: HNS debe estar habilitado al crear la cuenta de almacenamiento.
- Cifrado Soportado: Requiere algoritmos criptográficos aprobados por el Ciclo de Vida de Desarrollo de Seguridad de Microsoft (SDL) (por ejemplo, rsa-sha2-256, ecdsa-sha2-nistp256).
- Configuración de SFTP:
- Habilitar SFTP en la cuenta de almacenamiento.
- Crear identidades de usuario locales con permisos apropiados.
- Configurar directorios de inicio para los usuarios para definir su ubicación de inicio dentro del contenedor.
Permisos
| Permiso | Símbolo | Descripción |
|---|---|---|
| Leer | r |
Leer el contenido del archivo. |
| Escribir | w |
Subir archivos y crear directorios. |
| Listar | l |
Listar contenidos de directorios. |
| Eliminar | d |
Eliminar archivos o directorios. |
| Crear | c |
Crear archivos o directorios. |
| Modificar Propiedad | o |
Cambiar el usuario o grupo propietario. |
| Modificar Permisos | p |
Cambiar ACLs en archivos o directorios. |
Enumeración
{{#tabs }} {{#tab name="az cli" }}
# 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>
{{#endtab }}
{{#tab name="Az PowerShell" }}
# Get storage accounts
Get-AzStorageAccount | fl
# Get rules to access the storage account
Get-AzStorageAccount | select -ExpandProperty NetworkRuleSet
# Get IPs
(Get-AzStorageAccount | select -ExpandProperty NetworkRuleSet).IPRules
# Get containers of a storage account
Get-AzStorageContainer -Context (Get-AzStorageAccount -name <NAME> -ResourceGroupName <NAME>).context
# Get blobs inside container
Get-AzStorageBlob -Container epbackup-planetary -Context (Get-AzStorageAccount -name <name> -ResourceGroupName <name>).context
# Get a blob from a container
Get-AzStorageBlobContent -Container <NAME> -Context (Get-AzStorageAccount -name <NAME> -ResourceGroupName <NAME>).context -Blob <blob_name> -Destination .\Desktop\filename.txt
# Create a Container Policy
New-AzStorageContainerStoredAccessPolicy `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context `
-Container <container-name> `
-Policy <policy-name> `
-Permission racwdl `
-StartTime (Get-Date "2023-11-22T00:00Z") `
-ExpiryTime (Get-Date "2024-11-22T00:00Z")
#Get Container policy
Get-AzStorageContainerStoredAccessPolicy `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context `
-Container "storageaccount1994container"
# Queue Management
Get-AzStorageQueue -Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context
(Get-AzStorageQueue -Name <NAME> -Context (Get-AzStorageAccount -name <NAME> -ResourceGroupName <NAME>).Context).QueueClient.PeekMessage().Value
#Blob Container
Get-AzStorageBlob -Container <container-name> -Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context
Get-AzStorageBlobContent `
-Container <container-name> `
-Blob <blob-name> `
-Destination <local-path> `
-Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context
Set-AzStorageBlobContent `
-Container <container-name> `
-File <local-file-path> `
-Blob <blob-name> `
-Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context
# Shared Access Signatures (SAS)
Get-AzStorageContainerAcl `
-Container <container-name> `
-Context (Get-AzStorageAccount -Name <NAME> -ResourceGroupName <NAME>).Context
New-AzStorageBlobSASToken `
-Context $ctx `
-Container <container-name> `
-Blob <blob-name> `
-Permission racwdl `
-ExpiryTime (Get-Date "2024-12-31T23:59:00Z")
{{#endtab }} {{#endtabs }}
Comparticiones de Archivos
{{#ref}} az-file-shares.md {{#endref}}
Escalamiento de Privilegios
{{#ref}} ../az-privilege-escalation/az-storage-privesc.md {{#endref}}
Post Explotación
{{#ref}} ../az-post-exploitation/az-blob-storage-post-exploitation.md {{#endref}}
Persistencia
{{#ref}} ../az-persistence/az-storage-persistence.md {{#endref}}
Referencias
- https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction
- https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview
- https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support
{{#include ../../../banners/hacktricks-training.md}}