mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-29 06:03:26 -08:00
Translated ['src/pentesting-cloud/azure-security/az-services/az-app-serv
This commit is contained in:
@@ -0,0 +1,286 @@
|
||||
# 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) plaasvind nie. En as 'n **bestuursidentiteit** gebruik word, kan dit in staat wees om **privileges na hulle te verhoog**.
|
||||
|
||||
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 sal dit 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 word 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 (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.
|
||||
|
||||
## 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 **beide die SCM en 'n web- en API-koppelvlak bestuur** om 'n App Service te bestuur, en bied Git-gebaseerde ontplooiings, afstandsdebuginstrumente, en lêerbestuursfunksies. 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 Apps gebruik word, verskillend is, met die weergawe van die Funksie apps 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`: Verkry 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 daar 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 daar 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 web jobs:
|
||||
- **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 afgelope 20 minute ontvang het nie, sal die web job 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 verhoog.
|
||||
|
||||
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 Apps
|
||||
|
||||
Basies **Azure Funksie apps 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 apps 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 apps).
|
||||
|
||||
## 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 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>
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="Az Powershell" }}
|
||||
```powershell
|
||||
# Get App Services and Function Apps
|
||||
Get-AzWebApp
|
||||
# Get only App Services
|
||||
Get-AzWebApp | ?{$_.Kind -notmatch "functionapp"}
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="az kry alles" }}
|
||||
```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 }}
|
||||
|
||||
#### Verkry geloofsbriewe & kry toegang tot die webapp kode
|
||||
```bash
|
||||
# Get connection strings that could contain credentials (with DBs for example)
|
||||
az webapp config connection-string list --name <name> --resource-group <res-group>
|
||||
## Check how to use the DBs connection strings in the SQL page
|
||||
|
||||
# Get credentials to access the code and DB credentials if configured.
|
||||
az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>
|
||||
|
||||
|
||||
# Get git URL to access the code
|
||||
az webapp deployment source config-local-git --resource-group <res-group> -n <name>
|
||||
|
||||
# Access/Modify the code via git
|
||||
git clone 'https://<username>:<password>@name.scm.azurewebsites.net/repo-name.git'
|
||||
## In my case the username was: $nameofthewebapp and the password some random chars
|
||||
## If you change the code and do a push, the app is automatically redeployed
|
||||
```
|
||||
{{#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 deur 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-repo.
|
||||
|
||||
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 deur 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}}
|
||||
Reference in New Issue
Block a user