漏洞描述:
HertzBeat 是一个易用友好的开源实时监控告警系统,无需 Agent,高性能集群,兼容 Prometheus,提供强大的自定义监控和状态页构建能力。
受影响版本中未对用户可控的 yaml 文件有效过滤,经过身份验证的攻击者可构造恶意的 yaml 文件远程执行任意代码。
环境搭建:
下载源码本地部署
https://github.com/apache/hertzbeat/archive/refs/tags/v1.5.0.zip
后端环境,导入idea中maven加载依赖直接运行即可:
前端环境,需要nodejs npm ng,在web-app文件夹下先后执行npm install
ng serve --open启动前端环境:
登录后台:
漏洞分析:
这里直接全局搜yaml.load(),往回追溯调用
依赖也是符合漏洞版本的:
全局搜索parseImport调用,发现在org.dromara.hertzbeat.manager.service.impl.AbstractImExportServiceImpl#importConfig中有调用,这是org.dromara.hertzbeat.manager.service.impl.YamlImExportServiceImpl所实现的抽象类,直接搜importConfig调用,发现有两个controller层的调用:
先看org.dromara.hertzbeat.manager.controller.MonitorsController#export(org.springframework.web.multipart.MultipartFile),http接口为api/monitors/import
代码很简单,直接调用org.dromara.hertzbeat.manager.service.impl.MonitorServiceImpl#importConfig,来判断上传文件后缀名,这里若传入的是.yaml,则type为YAML
再从imExportServiceMap取imExportService对应的实现类,去调用相应方法
这样整个线就串上了
调试一下:
这里参考https://github.com/artsploit/yaml-payload 上传yaml文件:
另外一条路由也是同样的利用方式,就不具体分析了,直接贴出相关代码:
org.dromara.hertzbeat.alert.controller.AlertDefinesController#importDefines
org.dromara.hertzbeat.alert.service.impl.AlertDefineServiceImpl#importConfig
org.dromara.hertzbeat.alert.service.impl.AlertDefineAbstractImExportServiceImpl#importConfig
org.dromara.hertzbeat.alert.service.impl.AlertDefineYamlImExportServiceImpl#parseImport
总的来说漏洞并不复杂,引用了不安全的第三方组件并且入口可控,唯一美中不足的是需要权限去RCE
参考
https://github.com/artsploit/yaml-payload