PowerJob 命令执行漏洞
近期PowerJob爆发因未授权访问导致远程代码执行漏洞,本人曾在年初对此项目进行过源代码审计并输出两篇报告,因此决定借此机会发布文章水一下博客。
项目介绍
PowerJob是一个开源分布式计算和作业调度框架,它允许开发人员轻松地在自己的应用程序中调度任务。
项目地址
https://github.com/PowerJob/PowerJob
https://gitee.com/KFCFans/PowerJob
https://www.yuque.com/powerjob/guidence
受影响的组件:
https://mvnrepository.com/artifact/tech.powerjob/powerjob-official-processors
漏洞概述
PowerJob的官方推荐组件powerjob-official-processors中存在命令执行漏洞,攻击者可未授权加载恶意shell脚本执行系统命令。
影响版本
PowerJob <= 4.2.0
环境搭建
本次漏洞环境搭建有两种方式可选:
①:参考官方的docker-compose快速部署方案:
https://www.yuque.com/powerjob/guidence/docker-compose
②:在windows的idea中进行项目配置和打包将jar包部署到linux环境下运行,具体如下:
1、下载源码,解压后导入IDEA,使用maven进行依赖编译。
最新稳定版(4.2.0)源码下载地址:
https://github.com/PowerJob/PowerJob/tags
2、在POM文件中加入官方处理器(powerjob-official-processors)依赖
文件路径:PowerJob-4.2.0\powerjob-worker-samples\pom.xml
3、初始化数据库。
sql文件路径:
PowerJob-4.2.0\others\powerjob-mysql.sql
数据源配置文件路径:
PowerJob-4.2.0\powerjob-server\powerjob-server-starter\src\main\resources\application-daily.properties
4、启动PowerJobServerApplication
访问PowerJob控制台,初始化应用。
访问Web页面:http://localhost:7700/
点击应用注册按钮,填写应用名称(appName)和密码。
例如:apptest/123456
5、初始化 PowerJob-worker。
在配置文件中配置powerjob.worker.app-name信息,该字段与注册时填写的appname一致。
配置文件路径:
PowerJob-4.2.0\powerjob-worker-samples\src\main\resources\application.properties
配置完成后重启SampleApplication服务。
访问控制台,输入刚才注册的账号密码进行登录,登录成功后即可在首页看到机器信息。
6、将当前windows环境迁移至linux。
6.1:将当前windows中mysql的数据库文件迁移至linux。
转存储windows mysql的数据库文件,导出结构和数据,迁移至linux的mysql中。
6.2:修改springboot配置文件中的ip地址。
PowerJobServerApplication
SampleApplication
6.3:依次将两个jar包复制到linux目录下并运行
先运行powerjob-server-starter-4.2.0.jar,再运行powerjob-worker-samples-4.2.0.jar。
运行命令:Java -jar xxx.jar
漏洞复现
1、登录PowerJob控制台
http://172.25.4.233:7700/
2、进入任务管理—>新建任务
必须填写配置如下,其余字段可选填。
1、任务名称:
2、任务参数:ping xxx.dnslog.cn(从http://dnslog.cn/获取)
3、定时信息:API
4、执行配置:单机执行、内建、
tech.powerjob.official.processors.impl.script.ShellProcessor
3、运行任务,并查看日志和dnslog网站是否回显。
4、点击“更多—运行记录——日志”查看信息
INFO [SYSTEM] Generate executable file successfully, path: /root/powerjob/worker/official_script_processor/shell_493428527211741312.sh
对日志进行简单分析,发现系统将任务参数写入.sh文件并执行
在dnslog网站上获得回显,漏洞验证完成。
至此,漏洞复现完成,上述操作所对应的Restful api接口均未进行身份效验,因此攻击者可构造一个含有恶意命令参数的任务并执行。
漏洞分析
定位到缺陷组件代码位置:
tech.powerjob.official.processors.impl.script.ShellProcessor
#getRunCommandfan
getRunCommand方法接收前台传递的String类型的参数。
最终在AbstractScriptProcessor#process0方法中执行目标脚本触发命令执行
修复方式
项目方表示一直将PowerJob按纯内网系统去设计,因此在安全上一直没有过多的处理。由于近期漏洞的影响,项目方也发现还是存在不少外网部署使用的用户,因此在后续版本会全面引入用户身份和权限体系来解决这个问题。
临时缓解措施:目前暂无修复方案,请不要将项目部署在外网。