mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-15 22:32:31 -08:00
Translated ['src/pentesting-cloud/azure-security/az-enumeration-tools.md
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user