Skip to content

Esta herramienta no está afiliada a Microsoft Corporation ni cuenta con su aprobación o patrocinio. Azure, Microsoft Azure y Microsoft Defender for Cloud son marcas comerciales del grupo de empresas Microsoft. Los demás nombres son marcas comerciales de sus respectivos propietarios.

Exfiltración de datos en Azure Storage: SAS y logs de blobs

Investiga una exfiltración en Azure Storage: listAccountSas y listKeys en el Activity Log, ráfagas de GetBlob en los logs de blobs, hashes de SAS y qué rotar.

Publicado el 6 min de lectura

En resumen. La exfiltración desde almacenamiento deja dos tipos de rastros. En el Activity Log: listKeys/action, listAccountSas/action, listServiceSas/action y cambios de configuración que abren la cuenta (allowBlobPublicAccess: true, cortafuegos con defaultAction: Allow). En los logs de recursos de almacenamiento (StorageRead / StorageBlobLogs, solo si están activados): solicitudes GetBlob con la IP del autor, el tipo de autenticación, un hash de la SAS o del token, la clave del objeto y los bytes devueltos. Una SAS firmada en el cliente con una clave de cuenta nunca se registra al crearse; solo la ves cuando se usa. Rotar las dos claves de la cuenta revoca las SAS de cuenta y de servicio.

La cuenta de almacenamiento es donde están los datos. Tras un compromiso en la nube, la pregunta casi siempre es «¿qué se llevaron?», y en el almacenamiento de blobs esa pregunta tiene respuesta, siempre que existiera la configuración de diagnóstico adecuada.

Cómo llegan los atacantes a los datos

VíaRastro en el plano de control (Activity Log)Rastro en el plano de datos (log de almacenamiento)
Leer las claves de la cuenta y firmar su propia SAS sin conexiónMicrosoft.Storage/storageAccounts/listKeys/actionGetBlob con autenticación SAS o AccountKey
Pedir a Azure Resource Manager que genere una SAS de cuenta o de serviciolistAccountSas/action / listServiceSas/actionGetBlob con autenticación SAS, statusText SASSuccess
Usar una identidad de Entra con un rol de datos (Storage Blob Data Reader…)Posiblemente antes un roleAssignments/writeGetBlob con OAuth, object ID del solicitante
Hacer público un contenedorstorageAccounts/write o containers/write con acceso públicoGetBlob con Anonymous
Abrir el cortafuegos del almacenamientostorageAccounts/write con defaultAction: Allow o acceso de red público habilitadoSolicitudes desde IP que antes estaban bloqueadas

MITRE ATT&CK registra la recopilación como T1530 Data from Cloud Storage. Storm-0501, según documenta Microsoft Threat Intelligence, usó listkeys/action y exfiltró con AzCopy antes de borrar en masa cuentas de almacenamiento.

El problema de las SAS: su creación es invisible

Una firma de acceso compartido (SAS) es una URL firmada. La documentación de Microsoft no deja lugar a dudas: no es posible auditar la generación de tokens SAS, y Azure Storage no hace ningún seguimiento de ellos (información general de SAS). Una SAS firmada en local con una clave de cuenta no genera ningún evento. Lo que sí puedes ver:

  • listKeys/action: alguien obtuvo las claves (y podía firmar SAS sin límite y sin conexión).
  • listAccountSas/action / listServiceSas/action: alguien pidió a ARM que firmara una. El cuerpo de la solicitud muestra servicios, permisos, inicio y caducidad solicitados.
  • Cada uso de una SAS, en los logs de recursos de almacenamiento, si están activados.

La recomendación de Microsoft de no permitir la autorización con clave compartida (Shared Key) en las cuentas que no la necesitan elimina toda la categoría: sin Shared Key, las SAS de cuenta y de servicio dejan de funcionar.

Leer StorageBlobLogs

La referencia de supervisión de Blob Storage documenta los campos. Los que importan para la exfiltración:

Campo (exportación a almacenamiento)EjemploPor qué
operationNameGetBlob, ListBlobs, PutBlob, DeleteBlobQué pasó
callerIpAddress203.0.113.66:51234Desde dónde (fíjate en el puerto como sufijo)
identity.typeSAS, AccountKey, OAuth, AnonymousCómo se autorizó la solicitud
identity.tokenHashkey1(…),SasSignature(…)Qué clave firmó la SAS y un SHA-256 de la propia SAS
identity.requester.objectIdGUIDLa identidad de Entra, en OAuth
properties.objectKey/account/container/blobQué blob
properties.responseBodySizebytesCuánto salió
properties.userAgentHeaderAzCopy/10.x …Qué herramienta
statusCode / statusText200 / SASSuccessÉxito o fallo

El hash SasSignature(…) es tu pivote: todas las solicitudes con el mismo hash usaron el mismo token SAS, lo tuviera quien lo tuviera. El analizador lo usa como entidad para los accesos SAS (se muestra como sas:<prefijo del hash>), de modo que una SAS filtrada aparece como una sola entidad con sus IP y su total de bytes.

Los logs de almacenamiento son voluminosos. El analizador deja fuera de la tabla de eventos las lecturas rutinarias, pero las cuenta y evalúa todas.

Qué marca el analizador

ReglaDetectaNivel
AZ-ST-001SAS de cuenta o de servicio generada mediante ARM (listAccountSas, listServiceSas)Alto
AZ-ST-002Claves de la cuenta listadas o regeneradasBajo
AZ-ST-003Acceso anónimo a blobs habilitado en la cuenta o en un contenedorAlto
AZ-ST-004Cortafuegos del almacenamiento abierto a todas las redesMedio
AZ-ST-005Descarga masiva: al menos 50 blobs distintos leídos por la misma identidad desde la misma IP en 60 minutos, con el total de bytesAlto
AZ-ST-006Lecturas anónimas de blobsMedio
AZ-VM-005Disco o snapshot exportado con una URL SASAlto

AZ-ST-002 es bajo a propósito: el explorador de almacenamiento del portal, las Function Apps y las herramientas de copia de seguridad listan claves continuamente. Se vuelve interesante junto a otros hallazgos.

Dimensionar la exposición

La notificación de brechas necesita hechos, no «el atacante tenía acceso a la cuenta». Constrúyelos con los logs:

  1. Enumera los blobs leídos por la entidad / hash de SAS / IP sospechosos: claves de objeto, tamaños, marcas de tiempo. El analizador Azure Forensics los agrupa por identidad, IP y cuenta, con el total de bytes.
  2. Separa lecturas de listados. ListBlobs revela nombres; GetBlob revela contenido.
  3. Comprueba las lecturas parciales. Un campo downloadRange indica que solo se transfirió parte del blob.
  4. Comprueba escrituras y eliminaciones (StorageWrite, StorageDelete): los actores de tipo ransomware borran después de copiar.
  5. Comprueba los demás servicios. Los logs de blobs no cubren Files, Queues ni Tables; cada uno tiene sus propias categorías de logs.

Por ejemplo, en el ejemplo ficticio del sitio, una SAS usada desde una IP lee 330 blobs de copia de seguridad distintos en 18 minutos, unos 48,6 GB en total. Esa cifra, por contenedor, es la que necesitan los equipos jurídicos.

Remediación

  • Rota las dos claves de la cuenta de almacenamiento. Microsoft documenta que las SAS de cuenta y de servicio se firman con la clave de la cuenta, así que regenerarla las invalida. Las SAS de delegación de usuario se revocan revocando las claves de delegación de usuario.
  • Desactiva el acceso anónimo y restaura el cortafuegos (acción predeterminada Deny, puntos de conexión privados).
  • Valora no permitir la autorización con Shared Key.
  • Activa ya StorageRead / StorageWrite / StorageDelete en el servicio de blobs de las cuentas sensibles.
  • Determina qué datos se leyeron, por las obligaciones de notificación (por ejemplo, la notificación a la autoridad de control en 72 horas del RGPD, artículo 33).

Artículos relacionados

Artículos relacionados

Análisis de flow logs de NSG y VNet en respuesta a incidentes: formato de tuplas, bytes y estados de flujo, exfiltración, minería, IP atacantes y puntos ciegos.
Cómo abusan los atacantes de entidades de servicio e identidades administradas de Azure: secretos filtrados, robo de tokens IMDS, credenciales federadas.
Configuraciones de diagnóstico borradas, exportación del Activity Log eliminada, planes de Defender en Free, bloqueos y NSG: detectar la evasión en Azure.

Esta herramienta no está afiliada a Microsoft Corporation ni cuenta con su aprobación o patrocinio. Azure, Microsoft Azure y Microsoft Defender for Cloud son marcas comerciales del grupo de empresas Microsoft. Los demás nombres son marcas comerciales de sus respectivos propietarios.