Apache Airflow Security
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apache Airflow służy jako platforma do orkiestrowania i planowania potoków danych lub przepływów pracy. Termin "orkiestracja" w kontekście potoków danych oznacza proces aranżowania, koordynowania i zarządzania złożonymi przepływami danych pochodzącymi z różnych źródeł. Głównym celem tych orkiestrujących potoków danych jest dostarczenie przetworzonych i nadających się do użycia zbiorów danych. Zbiory te są szeroko wykorzystywane przez wiele aplikacji, w tym, ale nie tylko, narzędzia do analizy biznesowej, modele nauki o danych i uczenia maszynowego, które są podstawą funkcjonowania aplikacji big data.
W zasadzie Apache Airflow pozwoli Ci zaplanować wykonanie kodu, gdy coś (zdarzenie, cron) się wydarzy.
Możesz użyć pliku konfiguracyjnego docker-compose z https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml, aby uruchomić kompletną środowisko docker apache airflow. (Jeśli jesteś na MacOS, upewnij się, że przydzielisz co najmniej 6 GB RAM dla VM docker).
Jednym z łatwych sposobów na uruchomienie apache airflow jest uruchomienie go z minikube:
Airflow może przechowywać wrażliwe informacje w swojej konfiguracji lub możesz znaleźć słabe konfiguracje:
Zanim zaczniesz atakować Airflow, powinieneś zrozumieć jak działają uprawnienia:
Jeśli masz dostęp do konsoli internetowej, możesz uzyskać dostęp do niektórych lub wszystkich następujących informacji:
Zmienne (Własne wrażliwe informacje mogą być tutaj przechowywane)
Połączenia (Własne wrażliwe informacje mogą być tutaj przechowywane)
Uzyskaj do nich dostęp w http://<airflow>/connection/list/
Konfiguracja (Wrażliwe informacje, takie jak secret_key
i hasła mogą być tutaj przechowywane)
Lista użytkowników i ról
Kod każdego DAG (który może zawierać interesujące informacje)
Zmienne mogą być przechowywane w Airflow, aby DAG mogły uzyskiwać ich wartości. Jest to podobne do sekretów innych platform. Jeśli masz wystarczające uprawnienia, możesz uzyskać do nich dostęp w GUI w http://<airflow>/variable/list/
.
Airflow domyślnie pokaże wartość zmiennej w GUI, jednak zgodnie z tym możliwe jest ustawienie listy zmiennych, których wartość będzie wyświetlana jako gwiazdki w GUI.
Jednak te wartości mogą być nadal pobrane za pomocą CLI (musisz mieć dostęp do bazy danych), wykonywania dowolnego DAG, API uzyskującego dostęp do punktu końcowego zmiennych (API musi być aktywowane) i nawet samego GUI! Aby uzyskać dostęp do tych wartości z GUI, po prostu wybierz zmienne, do których chcesz uzyskać dostęp i kliknij na Akcje -> Eksportuj. Innym sposobem jest przeprowadzenie bruteforce na ukrytej wartości za pomocą filtrowania wyszukiwania, aż ją uzyskasz:
Jeśli konfiguracja expose_config
jest ustawiona na True, z rolą Użytkownika i wyżej można czytać konfigurację w sieci. W tej konfiguracji pojawia się secret_key
, co oznacza, że każdy użytkownik z tym ważnym kluczem może utworzyć własny podpisany cookie, aby podszyć się pod inne konto użytkownika.
Jeśli masz uprawnienia do zapisu w miejscu, gdzie DAGi są zapisywane, możesz po prostu stworzyć jeden, który wyśle ci reverse shell. Zauważ, że ten reverse shell będzie wykonywany wewnątrz kontenera airflow worker:
Jeśli ustawisz coś do wykonania w katalogu głównym kodu, w momencie pisania tego tekstu, zostanie to wykonane przez harmonogram po kilku sekundach od umieszczenia go w folderze DAG.
Jeśli uda ci się skompromentować maszynę w klastrze DAG, możesz stworzyć nowe skrypty DAG w folderze dags/
, a one będą replikowane w pozostałych maszynach w klastrze DAG.
Kiedy wykonujesz DAG z GUI, możesz przekazać argumenty do niego. Dlatego, jeśli DAG nie jest odpowiednio zakodowany, może być vulnerable to Command Injection. To właśnie wydarzyło się w tym CVE: https://www.exploit-db.com/exploits/49927
Wszystko, co musisz wiedzieć, aby zacząć szukać wstrzyknięć poleceń w DAGach, to że parametry są dostępne za pomocą kodu dag_run.conf.get("param_name")
.
Ponadto, ta sama podatność może wystąpić z zmiennymi (zauważ, że przy wystarczających uprawnieniach możesz kontrolować wartość zmiennych w GUI). Zmienne są dostępne za pomocą:
Jeśli są używane na przykład wewnątrz polecenia bash, możesz wykonać wstrzyknięcie polecenia.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)