2026盘古石杯线下 2026 团队赛

2026盘古石决赛服务器server部分

围绕 2026盘古石杯线下 的公开复盘与解题记录。

上传者:DaSuA1 发布日期:2026-06-14 31 次阅读

容器密码:e10adc3949ba59abbe56e057f20f883e

ZFS基础学习

参考:https://szclsya.me/zh-cn/posts/storage/zfs-intro/

ZFS几大概念:写时复制,由此引伸磁盘快照,RAIDZ,存储池

ZFS存储池​

ZFS 则整合了逻辑卷管理功能,因此一个存储池可以被部署在许多块存储盘之上。存储池在 ZFS 中被称为 zpool。在一个 zpool 里面可以存在多个 VDEV (Virtual DEVices, 虚拟设备) 。写入 zpool 的数据将被分散到各个 VDEV 上,有点类似于 RAID0。

如果你曾经配过 RAID 阵列的话,这样做也许听上去蠢极了,毕竟只要一个 VDEV 失效,整个阵列就完蛋了。不过 ZFS 允许在 VDEV 级别上创建冗余,这样就可以保证 VDEV 在合理的冗余配置下不会轻易失效。这样做也使扩展和收缩存储池极为灵活:只需增减 VDEV 即可。集成逻辑卷管理及 RAID 也意味着硬件 RAID 系统中常见的 Write hole 问题不会影响到 ZFS。

为了适应不同的可靠性要求,存储数据的 VDEV 分为以下几种:

  • single: 简单的单盘 VDEV,无冗余
  • mirror: 镜像 VDEV,允许多块存储盘,只要一块可用就可以保证数据安全,性能最高,类似于 RAID 1
  • RAIDz1, RAIDz2, RAIDz3: 允许多块存储盘,各自在数据丢失前允许 1/2/3 块盘失效 相应的,最少需要 3/4/5 块存储盘 使用校验信息块,类似于 RAID 5/6
#架构如下
物理磁盘
sdb
sdc
sdd
 │
 └─────────────┐
               ▼
       Pool(存储池)
       pgscup2026-js
               │
      ┌────────┴────────┐
      ▼                 ▼
 Dataset             Dataset
 data                web
      │                 │
      ▼                 ▼
 /home/data          /web
      │                 │
      ▼                 ▼
   文件                网站源码
#命令
zpool status					#存储池状态
pool: pgscup2026-js

zpool status -P					#查看池中的磁盘

zpool create tank mirror sdb sdc	#mirror,类比raid1

zpool create tank raidz sdb sdc sdd		#raidz,类比raid5

zfs list						#查看所有数据集
pgscup2026-js
pgscup2026-js/data
pgscup2026-js/web

zfs create pgscup2026-js/test		#创建数据集

zfs get mountpoint pgscup2026-js/web		#查看挂载点

zfs set mountpoint=/var/www pgscup2026-js/web		#修改原挂载点

zfs set quota=10G pgscup2026-js/web			#限制容量

zfs snapshot pgscup2026-js/web@bak1			#创建快照

zfs list -t snapshot				#查看快照

zfs destroy pgscup2026-js/web@bak1		#删除快照

zfs rollback pgscup2026-js/web@bak1		#回滚

zfs mount		#查看数据集挂载情况

服务器

1、对服务器进行系统取证,提取该服务器安装的操作系统版本名称?[答案格式:XX XX.XX]

Ubuntu 24.04

2、对服务器进行内核取证,提取该服务器的完整内核版本号?[答案格式:1.0.0-000-xxxx]

6.8.0-110-generic

3、对服务器进行取证分析,提取系统所有ZFS存储池名称?[答案格式:英文字母、数字、符号的组合] pgscup2026-js

image.png

发现/web /home/data都是ext4,应该是zfs没挂载全,/web /home/data都没挂载上

root@ubuntu:~# zpool list
NAME            SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
pgscup2026-js   119G  1.09G   118G        -         -     0%     0%  1.00x    ONLINE  -
root@ubuntu:~# zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
pgscup2026-js       1.09G   114G    24K  /pgscup2026-js
pgscup2026-js/data   267M   114G    98K  /home/data
pgscup2026-js/web    852M   114G   852M  /web

root@ubuntu:~# df -Th /
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4  9.8G  8.7G  631M  94% /
root@ubuntu:~# df -Th /web
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4  9.8G  8.7G  631M  94% /
root@ubuntu:~# df -Th /home/data
Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4  9.8G  8.7G  631M  94% /

root@ubuntu:~# zfs mount
pgscup2026-js                   /pgscup2026-js

ZFS Dataset 有一个属性叫 canmount,如果显示 noautooff,ZFS 不会自动挂载这个 Dataset。

noauto:只能手动挂载 off:永不挂载。

所以得先把这个值设置为on,之后再手动挂载

zfs set canmount=on pgscup2026-js/data
zfs set canmount=on pgscup2026-js/web
zfs mount pgscup2026-js/data
zfs mount pgscup2026-js/web

但是挂载报错,原来是数据集被加密了

root@ubuntu:~# zfs get encryption,keylocation,keyformat,keystatus pgscup2026-js/web 
NAME			 PROPERTY 		VALUE 		SOURCE 
pgscup2026-js/web encryption 	aes-256-gcm 	- 
pgscup2026-js/web keylocation 	prompt 		   local 
pgscup2026-js/web keyformat 	passphrase 		- 
pgscup2026-js/web keystatus 	unavailable 	-

现在需要输入秘钥,来解密数据集。

zfs load-key pgscup2026-js/web

直接在xways暴力去搜pgscup2026-js/web,找到密码P9sCup@2o26!@#

image.png image.png

4、对服务器进行取证分析,ZFS池下的数据集采用的加密算法?[答案格式:XXX-XXX-XXX] aes-256-gcm

zfs get encryption pgscup2026-js/data 使用算法ZFS原生加密AES-256-GCM

5、对服务器进行取证分析,ZFS池下的数据集配置的keylocation参数值?[答案格式:字母小写]

zfs get keylocation pgscup2026-js/data 表示需要人工输入密码才能加载密钥

6、对服务器进行取证分析,ZFS池的三块磁盘组成的RAID类型?[答案格式:raid-5] mirror

image.png

7、对服务器进行取证分析,Docker默认bridge网络的网关IP?[答案格式:xxx.xxx.xxx.1] 172.17.0.1

image.png

8、对服务器进行取证分析,docker镜像和容器的保存路径?[答案格式:/xx/xx/xx] /web/docker

docker info | grep "Docker Root Dir"

9、对服务器进行取证分析,数据库的root密码是什么?[答案格式:P@ssw0rd] Pgscup@2o26!@#

挂载上/home/data后在目录下搜索password字段就可以找到密码 image.png

10、对服务器进行取证分析,直播后台管理系统(live-admin)监听端口?[答案格式:8000] 3003

直播后台管理系统,挂载完web就可以看到其他的网站源码了 image.png

image.png

11、对暗夜直播接口进行取证分析,用户登录API的完整RESTful路径?[答案格式:/xxx/xxx/xxx] /webapi/user/login

注意题目说是暗夜直播接口 image.png

12、对暗夜直播进行取证分析,直播前台服务监听的网络接口地址是什么?[答案格式:127.0.0.1] 0.0.0.0

那就去找暗夜直播网站源码 image.png

发现源码先启动一波,但是ss -tulpn | grep 3000,发现仅能127.0.0.1访问。

虽然启动文件写的是0.0.0.0,但是是nuxt框架,没有特意编辑那么就是127.0.0.1写死,所以需要在nuxt.config.js添加

server: {
    host: process.env.HOST || '0.0.0.0',
    port: process.env.PORT || 3000
  }

之后就可以访问暗夜直播网站了

13、对暗夜直播进行取证分析,admin用户密码使用bcrypt哈希时指定的盐轮数(salt rounds)?[答案格式:数字] 10

现在思路是找数据库,看到挂载的pgscup2026-js/data这底下有个快照文件夹 image.png

对这个数据集回复一下快照zfs rollback pgscup2026-js/data@20260418,里面有mysql、redis等数据库文件。里面直接就有mysql数据库的运行数据了,可以利用这些进行恢复。 image.png

docker run -d \
  --name live_platform \
  -p 3306:3306 \
  -v /home/data/mysql:/var/lib/mysql \
  -v /home/data/conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro \
  mysql:5.7

直接这么导入docker就可以,密码是刚刚找到的Pgscup@2o26!@#。可以看到$10代表加密了十轮 image.png

拿navicat连一下,开启ssh连接数据库即可。

14、对服务器进行取证分析,盛世皇朝站后台运行在哪个端口?[答案格式:8000] 8081

/web/lottery-1/lottery-admin/src/main/resources/application.yml这里可以看到 image.png

先分析下源码结构, 是个Maven多模块Spring Boot Java项目

/web/lottery-1
├── pom.xml                    # 父 Maven 项目
├── lottery-web/               # 前台 Web
├── lottery-admin/             # 后台管理
├── lottery-mobile/            # 移动端
├── lottery-task/              # 定时任务
└── lottery-api/               # 公共 API/依赖模块

主要代码在各模块的:

/web/lottery-1/lottery-web/src/main/java
/web/lottery-1/lottery-admin/src/main/java
/web/lottery-1/lottery-mobile/src/main/java
/web/lottery-1/lottery-task/src/main/java

启动入口类

/web/lottery-1/lottery-web/src/main/java/me/zohar/WebApplication.java
/web/lottery-1/lottery-admin/src/main/java/me/zohar/AdminApplication.java
/web/lottery-1/lottery-mobile/src/main/java/me/zohar/MobileApplication.java
/web/lottery-1/lottery-task/src/main/java/me/zohar/TaskApplication.java

已经编译好的 jar

/web/lottery-1/lottery-web/target/lottery-web-0.0.1-SNAPSHOT.jar
/web/lottery-1/lottery-admin/target/lottery-admin-0.0.1-SNAPSHOT.jar
/web/lottery-1/lottery-mobile/target/lottery-mobile-0.0.1-SNAPSHOT.jar
/web/lottery-1/lottery-task/target/lottery-task-0.0.1-SNAPSHOT.jar

15、对盛世皇朝平台进行分析,盛世皇朝平台连接的数据库名称?[答案格式:字母小写] lottery

刚刚看到网站名称就叫lottery-1,这里数据库叫lottery

16、对盛世皇朝平台进行分析,后台启动所对应的配置文件的绝对路径是什么?[答案格式:/xxx/xxx/xxx]

前面已经提到了/web/lottery-1/lottery-admin/src/main/resources/application.yml

17、对盛世皇朝平台进行分析,后台用户密码加密的加密方法是什么?[答案格式:字母小写] bcrypt

image.png

18、对暗夜直播礼物系统进行取证分析,统计所有礼物的总价值(total_price)?[答案格式:10000]

进数据库直接查 image.png

19、对暗夜直播充值系统进行取证分析,统计所有的直播记录数?[答案格式:10000] 250644

image.png

20、对盛世皇朝后台进行取证分析,给出标题为“公司入款卡停用”的公告发布时间?[答案格式:YYYY-MM-DD-HH:mm:ss‌] 2019-05-27 00:00:00

image.png