Translated ['src/pentesting-cloud/azure-security/az-enumeration-tools.md

This commit is contained in:
Translator
2025-01-03 19:25:28 +00:00
parent 48c4f40907
commit a7f66ced9e
3 changed files with 395 additions and 82 deletions

View File

@@ -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://<SMC-URL>/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 <app-name> --resource-group <res-group>` o `az rest --method POST --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/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 <app-name> --resource-group <res-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 <res-group> -n <name>`
## 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 <name> --resource-group <res-group>
@@ -51,18 +103,24 @@ az webapp show --name <name> --resource-group <res-group>
az webapp list-instances --name <name> --resource-group <res-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 <app-name> --resource-group <res-group>
# Get access restrictions of an app
az webapp config access-restriction show --name <name> --resource-group <res-group>
# Remove access restrictions
az webapp config access-restriction remove --resource-group <res-group> -n <name> --rule-name <rule-name>
# Get connection strings of a webapp
az webapp config connection-string list --name <name> --resource-group <res-group>
# Get appsettings of an app
az webapp config appsettings list --name <name> --resource-group <res-group>
# Get SCM and FTP credentials
az webapp deployment list-publishing-profiles --name <name> --resource-group <res-group>
# Get configured Auth information
az webapp auth show --name <app-name> --resource-group <res-group>
# Get backups of a webapp
az webapp config backup list --webapp-name <name> --resource-group <res-group>
@@ -75,61 +133,39 @@ az webapp config snapshot list --resource-group <res-group> -n <name>
# Restore snapshot
az webapp config snapshot restore -g <res-group> -n <name> --time 2018-12-11T23:34:16.8388367
# Get connection strings of a webapp
az webapp config connection-string list --name <name> --resource-group <res-group>
# Get slots
az webapp deployment slot list --name <AppName> --resource-group <ResourceGroupName> --output table
az webapp show --slot <SlotName> --name <AppName> --resource-group <ResourceGroupName>
# Get traffic-routing
az webapp traffic-routing show --name <AppName> --resource-group <ResourceGroupName>
# Get used container by the app
az webapp config container show --name <name> --resource-group <res-group>
# Get storage account configurations of a webapp
az webapp config storage-account list --name <name> --resource-gl_group
az webapp config storage-account list --name <name> --resource-group <res-group>
# Get configured container (if any) in the webapp, it could contain credentials
az webapp config container show --name <name> --resource-group <res-group>
# Get Webjobs
az webapp webjob continuous list --resource-group <res-group> --name <app-name>
az webapp webjob triggered list --resource-group <res-group> --name <app-name>
# Read webjobs logs with Azure permissions
az rest --method GET --url "<SCM-URL>/vfs/data/jobs/<continuous | triggered>/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 '<username>:<password>' -v
# Get info of 1 funciton (although in the list you already get this info)
az functionapp show --name <app-name> --resource-group <res-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 <name> --resource-group <res-group>
# Get details about the source of the function code
az functionapp deployment source show \
--name <app-name> \
--resource-group <res-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 <name> \
--resource-group <res-group>
# Get settings (and privesc to the sorage account)
az functionapp config appsettings list --name <app-name> --resource-group <res-group>
# Check if a domain was assigned to a function app
az functionapp config hostname list --webapp-name <app-name> --resource-group <res-group>
# Get SSL certificates
az functionapp config ssl list --resource-group <res-group>
# Get network restrictions
az functionapp config access-restriction show --name <app-name> --resource-group <res-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/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"
# Get source code with Master Key of the function
curl "<script_href>?code=<master-key>"
## Python example
curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=<master-key>" -v
# Get source code
az rest --url "https://management.azure.com/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/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 <name> --resource-group <res-group>
```
{{#endtab }}
@@ -196,6 +232,40 @@ git clone 'https://<username>:<password>@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)