容器密码: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

发现/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,如果显示 noauto 或 off,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!@#

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

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

8、对服务器进行取证分析,docker镜像和容器的保存路径?[答案格式:/xx/xx/xx] /web/docker
docker info | grep "Docker Root Dir"
9、对服务器进行取证分析,数据库的root密码是什么?[答案格式:P@ssw0rd] Pgscup@2o26!@#
挂载上/home/data后在目录下搜索password字段就可以找到密码

10、对服务器进行取证分析,直播后台管理系统(live-admin)监听端口?[答案格式:8000] 3003
直播后台管理系统,挂载完web就可以看到其他的网站源码了


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

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

发现源码先启动一波,但是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这底下有个快照文件夹

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

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代表加密了十轮

拿navicat连一下,开启ssh连接数据库即可。
14、对服务器进行取证分析,盛世皇朝站后台运行在哪个端口?[答案格式:8000] 8081
/web/lottery-1/lottery-admin/src/main/resources/application.yml这里可以看到

先分析下源码结构, 是个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

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

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

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