# Az - App Services

{{#include ../../../banners/hacktricks-training.md}}

## App Service Basiese Inligting

Azure App Services stel ontwikkelaars in staat om **webtoepassings, mobiele toepassings agtergronde, en API's naatloos te bou, te ontplooi en te skaal**. Dit ondersteun verskeie programmeertale en integreer met verskeie Azure gereedskap en dienste vir verbeterde funksionaliteit en bestuur.

Elke toepassing loop binne 'n sandbox, maar isolasie hang af van App Service planne:

- Toepassings in Gratis en Gedeelde vlakke loop op **gedeelde VM's**
- Toepassings in Standaard en Premium vlakke loop op **toegewyde VM's wat slegs deur toepassings** in dieselfde App Service plan gedeel word.
- Die Isolated vlakke loop op **toegewyde VM's op toegewyde virtuele netwerke**, wat die isolasie van die toepassings verbeter.

> [!WARNING]
> Let daarop dat **geen** van daardie isolasies **voorkom** dat ander algemene **web kwesbaarhede** (soos lêeroplaai, of inspuitings) voorkom nie. En as 'n **bestuursidentiteit** gebruik word, kan dit in staat wees om **privileges na hulle te eskaleer**.

Toepassings het 'n paar interessante konfigurasies:

- **Always On**: Verseker dat die toepassing altyd loop. As dit nie geaktiveer is nie, sal die toepassing stop loop na 20 minute van inaktiwiteit en weer begin wanneer 'n versoek ontvang word.
- Dit is noodsaaklik as jy 'n webjob het wat deurlopend moet loop, aangesien die webjob sal stop as die toepassing stop.
- **SSH**: As geaktiveer, kan 'n gebruiker met genoeg toestemming aan die toepassing koppel met SSH.
- **Debugging**: As geaktiveer, kan 'n gebruiker met genoeg toestemming die toepassing debugeer. Dit is egter outomaties elke 48 uur gedeaktiveer.
- **Web App + Databasis**: Die webkonsol laat jou toe om 'n Toepassing met 'n databasis te skep. In hierdie geval is dit moontlik om die databasis te kies om te gebruik (SQLAzure, PostgreSQL, MySQL, MongoDB) en dit laat jou ook toe om 'n Azure Cache vir Redis te skep.
- Die URL wat die geloofsbriewe vir die databasis en Redis bevat, sal in die **appsettings** gestoor word.
- **Container**: Dit is moontlik om 'n houer na die App Service te ontplooi deur die URL van die houer en die geloofsbriewe om toegang te verkry aan te dui.
- **Mounts**: Dit is moontlik om 5 mounts van Stoor rekeninge te skep, wat Azure Blob (Slegs Lees) of Azure Files is. Die konfigurasie sal die toegangsleutel oor die Stoor Rekening stoor.
- **Netwerking**: Kan publiek beskikbaar wees of slegs toeganklike private eindpunte vanaf 'n VNet.

## Basiese Verifikasie

Wanneer 'n webtoepassing (en 'n Azure funksie gewoonlik) geskep word, is dit moontlik om aan te dui of jy wil hê **Basiese Verifikasie moet geaktiveer wees** (standaard gedeaktiveer). Dit **aktiveer SCM (Source Control Manager) en FTP (File Transfer Protocol)** vir die toepassing sodat dit moontlik sal wees om die toepassing met hierdie tegnologieë te ontplooi.

Om toegang tot die SCM en die FTP bedieners te verkry, is 'n **gebruikersnaam en wagwoord** nodig. Daarom bied Azure 'n paar **API's om die URL's** na hierdie platforms en die geloofsbriewe te verkry.

Die **FTP bediener het geen spesiale magie nie**, net met die geldige URL, gebruikersnaam en wagwoord is dit moontlik om te koppel en lees- en skryfrechten oor die App omgewing te verkry.

Die SCM
Dit is moontlik om aan die SCM te koppel met 'n webblaaier in `https://<SMC-URL>/BasicAuth` en al die lêers en ontplooiings daar te kontroleer.

### Kudu

Kudu is die platform wat **sowel die SCM as 'n web- en API-koppelvlak bestuur** om 'n App Service te bestuur, en bied Git-gebaseerde ontplooiings, afstandsdebuginstrumente, en lêerbestuursvermoëns. Dit is toeganklik deur die SCM URL wat in die webtoepassing gedefinieer is.

Let daarop dat die Kudu weergawes wat deur App Services en deur Funksie Toepassings gebruik word, verskillend is, met die weergawe van die Funksie toepassings baie meer beperk.

Sommige interessante eindpunte wat jy in Kudu kan vind, is:
- `/BasicAuth`: Jy moet hierdie pad toegang om **binne Kudu aan te meld**.
- `/DebugConsole`: 'n Konsol wat jou toelaat om opdragte in die omgewing waar Kudu loop uit te voer.
- Let daarop dat hierdie omgewing **nie toegang het** tot die metadata diens om tokens te verkry nie.
- `/webssh/host`: 'n Web-gebaseerde SSH-kliënt wat jou toelaat om binne die houer waar die toepassing loop te koppel.
- Hierdie omgewing **het toegang tot die metadata diens** om tokens van die toegewyde bestuurde identiteite te verkry.
- `/Env`: Kry inligting oor die stelsel, app instellings, omgewing veranderlikes, verbinding stringe en HTTP koppe.
- `/wwwroot/`: Die wortelgids van die webtoepassing. Jy kan al die lêers hier aflaai.

Boonop was Kudu eens opensource in [https://github.com/projectkudu/kudu](https://github.com/projectkudu/kudu) maar die projek is gedeaktiveer en deur die gedrag van die huidige Kudu in Azure met die ou een te vergelyk, is dit moontlik om te sien dat **verskeie dinge reeds verander het**.

## Bronne

App Services laat toe om die kode as 'n zip-lêer standaard op te laai, maar dit laat ook toe om met 'n derdeparty diens te verbind en die kode daarvandaan te verkry.

- Die tans ondersteunde derdeparty bronne is **Github** en **Bitbucket**.
- Jy kan die verifikasietokens verkry deur `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"` te loop.
- Azure sal standaard 'n **Github Aksie** opstel om die kode na die App Service te ontplooi elke keer as die kode opgedateer word.
- Dit is ook moontlik om 'n **afgeleë git-repo** (met gebruikersnaam en wagwoord) aan te dui om die kode daarvandaan te verkry.
- Jy kan die geloofsbriewe na die afgeleë repo verkry deur `az webapp deployment source show --name <app-name> --resource-group <res-group>` of `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"`.
- Dit is ook moontlik om 'n **Azure Repository** te gebruik.
- Dit is ook moontlik om 'n **lokale git-repo** te konfigureer.
- Jy kan die URL van die git-repo verkry met `az webapp deployment source show --name <app-name> --resource-group <res-group>` en dit gaan die SCM URL van die toepassing wees.
- Om dit te kloon, sal jy die SCM geloofsbriewe nodig hê wat jy kan verkry met `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>`.

## Webjobs

Azure WebJobs is **agtergrondtake wat in die Azure App Service omgewing loop**. Dit stel ontwikkelaars in staat om skripte of programme saam met hul webtoepassings uit te voer, wat dit makliker maak om asynchrone of tydsintensiewe operasies soos lêerverwerking, datahantering, of geskeduleerde take te hanteer.
Daar is 2 tipes webjobs:
- **Deurlopend**: Loop eindeloos in 'n lus en word geaktiveer sodra dit geskep word. Dit is ideaal vir take wat konstante verwerking vereis. As die toepassing egter stop loop omdat Always On gedeaktiveer is en dit nie 'n versoek in die laaste 20 minute ontvang het nie, sal die webjob ook stop.
- **Geaktiveer**: Loop op aanvraag of gebaseer op 'n skedule. Dit is die beste geskik vir periodieke take, soos batch data-opdaterings of onderhoudsroetines.

Webjobs is baie interessant vanuit 'n aanvallers perspektief, aangesien dit gebruik kan word om **kode** in die omgewing uit te voer en **privileges** na die aangehegte bestuurde identiteite te eskaleer.

Boonop is dit altyd interessant om die **logs** wat deur die Webjobs gegenereer word, te kontroleer, aangesien dit **sensitiewe inligting** kan bevat.

## Slots

Azure App Service Slots word gebruik om **verskillende weergawes van die toepassing** na dieselfde App Service te ontplooi. Dit stel ontwikkelaars in staat om nuwe funksies of veranderinge in 'n aparte omgewing te toets voordat hulle dit na die produksie omgewing ontplooi.

Boonop is dit moontlik om 'n **persentasie van die verkeer** na 'n spesifieke slot te lei, wat nuttig is vir A/B toetsing, en vir **agterdeurdoeleindes**.

## Azure Funksie Toepassings

Basies **Azure Funksie toepassings is 'n substel van Azure App Service** in die webkonsol en as jy na die webkonsol gaan en al die app dienste lys of `az webapp list` in az cli uitvoer, sal jy in staat wees om **die Funksie toepassings ook daar gelys te sien**.

Daarom het beide dienste eintlik meestal die **dieselfde konfigurasies, funksies en opsies in die az cli**, alhoewel hulle dit dalk 'n bietjie anders konfigureer (soos standaardwaardes van appsettings of die gebruik van 'n Stoor Rekening in die Funksie toepassings).

## Enumerasie

{{#tabs }}
{{#tab name="az" }}
```bash
# List webapps
az webapp list
## Less information
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>

# Get instances of a webapp
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 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>

# Get backups scheduled for a webapp
az webapp config backup show --webapp-name <name> --resource-group <res-group>

# Get snapshots
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 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 (contains access key)
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 git URL to access the code
az webapp deployment source config-local-git --resource-group <res-group> -n <name>

# 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/"

# 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 connections of a webapp
az webapp conection list --name <name> --resource-group <res-group>

# Get hybrid-connections of a webapp
az webapp hybrid-connections list --name <name> --resource-group <res-group>

# Get configured SMC users by your account
az webapp deployment user show
## If any user is created, the username should appear in the "publishingUserName" field
```
{{#endtab }}

{{#tab name="Az Powershell" }}
```bash
Get-Command -Module Az.Websites

# Get App Services and Function Apps
Get-AzWebApp
# Get only App Services
Get-AzWebApp | ?{$_.Kind -notmatch "functionapp"}

# Retrieves details of a specific App Service Environment in the specified resource group.
Get-AzAppServiceEnvironment -ResourceGroupName <ResourceGroupName> -Name <Name>
# Retrieves the access restriction configuration for a specified Web App.
Get-AzWebAppAccessRestrictionConfig -ResourceGroupName <ResourceGroupName> -Name <Name>
# Retrieves the SSL certificates for a specified resource group.
Get-AzWebAppCertificate -ResourceGroupName <ResourceGroupName>
# Retrieves the continuous deployment URL for a containerized Web App.
Get-AzWebAppContainerContinuousDeploymentUrl -ResourceGroupName <ResourceGroupName> -Name <Name>
# Retrieves the list of continuous WebJobs for a specified Web App.
Get-AzWebAppWebJob -ResourceGroupName <ResourceGroupName> -AppName <AppName>
# Retrieves the list of triggered WebJobs for a specified Web App.
Get-AzWebAppTriggeredWebJob -ResourceGroupName <ResourceGroupName> -AppName <AppName>

# Retrieves details of a deleted Web App in the specified resource group.
Get-AzDeletedWebApp -ResourceGroupName <ResourceGroupName> -Name <Name>
# Retrieves a list of snapshots for a specified Web App.
Get-AzWebAppSnapshot -ResourceGroupName <ResourceGroupName> -Name <Name>
# Retrieves the history of a specific triggered WebJob for a Web App.
Get-AzWebAppTriggeredWebJobHistory -ResourceGroupName <ResourceGroupName> -AppName <AppName> -Name <Name>

# Retrieves information about deployment slots for a specified Web App.
Get-AzWebAppSlot -ResourceGroupName <ResourceGroupName> -Name <Name>
# Retrieves the continuous WebJobs for a specific deployment slot of a Web App.
Get-AzWebAppSlotWebJob -ResourceGroupName <ResourceGroupName> -AppName <AppName> -SlotName <SlotName>
# Retrieves the triggered WebJobs for a specific deployment slot of a Web App.
Get-AzWebAppSlotTriggeredWebJob -ResourceGroupName <ResourceGroupName> -AppName <AppName> -SlotName <SlotName>
# Retrieves the history of a specific triggered WebJob for a deployment slot of a Web App.
Get-AzWebAppSlotTriggeredWebJobHistory -ResourceGroupName <ResourceGroupName> -AppName <AppName> -SlotName <SlotName> -Name <Name>
# Retrieves the continuous WebJobs for a Web App.
Get-AzWebAppContinuousWebJob -ResourceGroupName <ResourceGroupName> -AppName <AppName>
# Retrieves the continuous WebJobs for a specific deployment slot of a Web App.
Get-AzWebAppSlotContinuousWebJob -ResourceGroupName <ResourceGroupName> -AppName <AppName> -SlotName <SlotName>

# Retrieves the traffic routing rules for a Web App.
Get-AzWebAppTrafficRouting -ResourceGroupName <ResourceGroupName> -WebAppName <WebAppName> -RuleName <RuleName>

# Retrieves details of a specific backup for a Web App.
Get-AzWebAppBackup -ResourceGroupName <ResourceGroupName> -Name <Name> -BackupId <BackupId>
# Retrieves the backup configuration for a Web App.
Get-AzWebAppBackupConfiguration -ResourceGroupName <ResourceGroupName> -Name <Name>
# Retrieves the list of all backups for a Web App.
Get-AzWebAppBackupList -ResourceGroupName <ResourceGroupName> -Name <Name>
```
{{#endtab }}

{{#tab name="az get all" }}
```bash
#!/bin/bash

# Get all App Service and Function Apps

# Define Azure subscription ID
azure_subscription="your_subscription_id"

# Log in to Azure
az login

# Select Azure subscription
az account set --subscription $azure_subscription

# Get all App Services in the specified subscription
list_app_services=$(az appservice list --query "[].{appServiceName: name, group: resourceGroup}" -o tsv)

# Iterate over each App Service
echo "$list_app_services" | while IFS=$'\t' read -r appServiceName group; do
# Get the type of the App Service
service_type=$(az appservice show --name $appServiceName --resource-group $group --query "kind" -o tsv)

# Check if it is a Function App and print its name
if [ "$service_type" == "functionapp" ]; then
echo "Function App Name: $appServiceName"
fi
done
```
{{#endtab }}
{{#endtabs }}


{{#ref}}
../az-privilege-escalation/az-app-services-privesc.md
{{#endref}}

## Voorbeelde om Web Apps te genereer

### Python van plaaslik

Hierdie tutoriaal is gebaseer op die een van [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
```
Inlog in die SCM-portaal of inlog via FTP, dit is moontlik om in `/wwwroot` die gecomprimeerde lêer `output.tar.gz` te sien wat die kode van die webapp bevat.

> [!TIP]
> Net om via FTP te verbind en die lêer `output.tar.gz` te wysig, is nie genoeg om die kode wat deur die webapp uitgevoer word, te verander nie.

**'n Aanvaller kan hierdie lêer aflaai, dit wysig en weer oplaai om arbitrêre kode in die webapp uit te voer.**

### Python van Github

Hierdie tutoriaal is gebaseer op die vorige een, maar gebruik 'n Github-bewaarplek.

1. Fork die repo msdocs-python-flask-webapp-quickstart in jou Github-rekening.
2. Skep 'n nuwe python Web App in Azure.
3. In `Deployment Center` verander die bron, log in met Github, kies die geforkte repo en klik `Save`.

Soos in die vorige geval, inlog in die SCM-portaal of inlog via FTP, dit is moontlik om in `/wwwroot` die gecomprimeerde lêer `output.tar.gz` te sien wat die kode van die webapp bevat.

> [!TIP]
> Net om via FTP te verbind en die lêer `output.tar.gz` te wysig en 'n implementering weer te aktiveer, is nie genoeg om die kode wat deur die webapp uitgevoer word, te verander nie.

## Privilege Escalation

{{#ref}}
../az-privilege-escalation/az-app-services-privesc.md
{{#endref}}

## References

- [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}}
