从两种方法,入手26年FIC服务器取证

前言:这次依旧一上来就奔着服务器去,真是一场酣畅淋漓哈基米啊,且听我我娓娓道来:…

由于刚比完赛咕了一会,后面做了一天之后发现软件授权到期了,于是wp暂时做的晚了一会,作为补偿,部分题目给出了两种解题方法,分别是我比赛时没有仿真成功的翻文件系统的做法,一个是后续仿真成功的做法,如果使用命令能更简单的做出会给出相关做法:

首先感谢两位队友,队友强强,这次比赛最终名次综合职业组和学生组是十几名名拿到了一等奖,虽然能有50支队伍,但是emmm….最终应该是没法进入总决赛了,学校大佬太多,主办方限制只给出两个队伍,呜呜呜呜…


前置准备

毕竟是弘连的比赛,先用他们的软件分析一下

1777259474015

火眼分析出来只有系统引导那些文件,其他都是未分配簇,直接仿真也无果(故事伏笔),我的第一想法是这是个raid盘,于是用了火眼自家的raid重组软件,记得先导入root的,再导入volume的填好参数之后点生成文件,不得不说火眼的交互和UI确实做的不错,不像是那种古早软件。

1777259946075

按照参数填好,生成一个逻辑盘,里面有一个.001文件,然后把这个文件扔进去火眼分析,然后噩梦就开始了…

期初火眼分析一直分析不出来,应该是因为没有引导和启动盘的原因,但是我太菜了不知道怎么手动加进去这个.001里面,于是开始投向美亚取证大师,最后艰苦等了三四十分钟,美亚先分析出来了,美亚有时候感觉确实快一点,但是美亚感觉交互和UI做的没有火眼那么顺眼,点击反馈也是火眼好一些,分析出来的完整度也是各有各的擅长之处,只能说各有千秋吧。然后做题做到中途,手贱把这个重组raid的软件关掉了,结果连逻辑磁盘也掉了,隐隐感觉不对劲,一点击任意一个文件果然检材未上线报500错误,然后发现重组之后文件名会根据当前时间戳改变,于是把文件名改成一致的,结果.001文件好像直接变成0kb大小了,于是我又跑了一遍分析,又是艰苦的40分钟,结果跑完之后发现可以直接改检材来源路径……白白浪费40分钟,到这里其实已经很麻烦了,但是…

主办方其实在比赛前应该是23号(个人根据版本号的猜测)?推了一个新的火眼仿真取证版本4.6.5.2643,我比赛的时候才看到,也没有来得及更新了,我的版本还在4.6.5.2622,赛后才发现其实最新版的仿真软件能一键仿真出来,不用做任何处理,不要重组raid,也不需要看条带大小,也不用找起始扇区,只需要把两个e01文件导入然后仿真即可,仿真出来是一个图形化界面的ubuntu(服务器怎么会用GUI呢?肯定有问题),emmm道心破碎了,还是经验不够丰富,确实之前一直没有仿真的习惯,都是在文件系统翻找的,以后一定一来就先仿真。以后一定记得赛前检查版本更新做好准备呜呜呜。

记住要先添加E01再添加E02

1777261442739

1777261374093


服务器部分

1、该服务器主机操作系统版本为

在美亚软件里面梭出来是1777261942044

按照他的格式应该是写:

1
13.0

2、该服务器根分区硬盘的uuid号为

uuid在最初的文件里面也有

1777262048562

也可以去fstab找,进/etc/fstab,这里简要介绍一下这个文件后面会用到,操作系统启动时会自动读取这个文件的内容,按里面配置,自动挂载硬盘,里面存有设备的UUID(3231e52f-5e15-44c4-b224-e29cb4201c0e),盘符挂载点(把子卷@rootfs挂载到/),还有文件系统(btrfs)等等

1777287299787

1
3231e52f-5e15-44c4-b224-e29cb4201c0e

3、该服务器中最新的docker镜像创建时间为

1
docker images --format "{{.Repository}}\t{{.CreatedAt}}" | sort -k2r

其中format里面,.Repository是镜像名,.CreatedAt是创建时间,管道输入降序排列。诶?这时你是不是开始懵了,为什么我的命令执行会出错呢?为什么我的docker找不到呢?为什么我仿真出来的的fstab内容和你的不一样呢?

正如前面怀疑为什么服务器会使用图形化界面,这里肯定有问题,于是怀疑是不是仿真的不完整,还是启动的磁盘不对,这里涉及到一些知识点,我们先看挂载信息

1
cat /proc/self/mountinfo

挂载信息会输出出来一坨东西,或者看看挂载点,这个更好看一点

1
findmnt /

1777299452935

这里看到一个overlay,overlay是一个分层文件系统常在docker里面见到,意思是当前根目录并不是挂载在一个真是的物理磁盘中,而是一个叠加的虚拟文件系统,按理来说这个系统应该是来源于一个真实的物理磁盘,类似于/dev/md0才对,这里已经初见端倪,我们再来看看根目录的结构

1777336174982

可以看到,目录下有很多的映射,这一般是因为docker的隔离环境并不是真正独立的Linux系统,许多文件依旧是通过映射而依赖宿主机的配置。最主要的还是.dockerenv这个文件,这个文件是系统启动时用来判断改系统为docker还是非docker的判断文件,内容一般为空,但是看到这个文件,说明当前环境是存在于一个docker中,大概是因为启动的时候把docker当做启动盘挂载,而没有挂载宿主机的盘符,这里开始分开来有多种做法

方法一

方法一是最简单的,既然知道了是docker里面,退出来就行了,按住ctrl+alt+F2,再以root登录,密码123456,这就进来真正的系统了

1778034557395

直接运行刚刚的命令就好

1778034829579

u22是最新的,把这个时间格式转换一下即可

1
2026-04-16T07:15:50.535713491Z

方法二

虽然这个方法比较麻烦一些,但是毕竟是我比赛时没有仿真成功的做法,翻文件夹还是能翻到的

重点来了,还记得前面说的fstab文件吗?系统启动的时候会自动根据这个文件的配置来挂载目录,回忆一下这个文件的内容

1
>UUID=3231e52f-5e15-44c4-b224-e29cb4201c0e / btrfs defaults,subvol=@rootfs 0 0

这句话是原系统自己的配置,意思是:

1
>开机时把 UUID=3231... 的 btrfs 文件系统,以 subvol=@rootfs 的方式挂到 /

所以正确的根目录应该是/dev/md0 的 @rootfs 子卷,说明白一点就是说主系统的根目录应该是/dev/md0这个物理磁盘里面的,而前面我们发现当前根目录挂载来源是overlay,我们只需要把宿主机的物理磁盘挂载起来就好了

挂载命令

1
2
3
4
5
6
7
8
# 创建挂载点
sudo mkdir -p /mnt/realroot

# 直接挂载,ro表示只读
sudo mount -o ro,subvol=@rootfs /dev/md0 /mnt/realroot

# 查看挂载出来的文件系统
ls /mnt/realroot

执行完这些挂载之后,在/mnt/evidence/下的就是宿主机真实的目录,如果想要也可以使用chroot目录切换一下根目录,看起来很麻烦,这次仿真也花了我不少时间,不停的问ai不停的敲命令,但其实算下来从头到尾使用的命令并没有几条,对于那些大佬来说应该是洒洒水吧呜呜呜,不过这次赛后复盘仿真也确实学到了不少

1777338793788

回到第三题

前面挂载出来了磁盘,但是执行docker的命令还会出错,应该是要手动指定docker demon(ai说这个比较麻烦),但是我们挂载起来了就可以去翻文件系统了(毕竟是翻文件的做法…)

可以先提个权,不然读一些文件不方便,改一下/etc/ssh/sshd_config,把这两项原本的注释改掉改成启用状态:

1
2
PermitRootLogin yes
PasswordAuthentication yes
  1. 先来找docker数据存储目录
    • data下有一个image,这是 Docker 的镜像管理目录
    • 在这个目录下一直往下看到了sha256的json,这里存有以 sha256 digest 为文件名保存的镜像(一般docker都是在这里)
  2. 找到存储目录之后/mnt/realroot/data/image/overlay2/imagedb/content/sha256,在这里看任意一个json文件,发现有一坨东西输出出来,于是把他输出的格式扔给豆包,让豆包生成一个命令能迅速过滤我们想要的内容以及排序
豆包给出的命令:
1
grep -ro '"created":"[^"]*"' . | cut -d'"' -f4 | sort -r | head

1777347248956

答案

1
2026-04-16T07:15:50.535713491Z

4、该服务器根分区快照路径为

前面fstab里面看到是btrfs的文件系统,执行命令:

1
btrfs subvolume list /mnt/realroot

发现没有安装btrfs工具,先安装一下apt install -y btrfs-progs

1777347622767

  • @rootfs:这是你系统当前的活动根子卷(就是你正在用的系统)
  • root/history:这就是你要找的根分区快照
1
root/history

5、该网站后台管理入口对应的文件名为

打开网站根目录,readme里面没有找到有用的东西,看到user.php,进去确认一下

1777347851278

注意,这里直接在终端cat中文会乱码,可以使用图形化界面来读取(也是派上用场了?!)

1777348411434

里面说admin.php是后台入口,并且说记得把admin.php改名,当前根目录没有admin.php,怀疑这就是改名后的文件,最终我们在aa下找到备份的admin.php,发现和user.php内容一样,确定user.php就是后台入口。

1
user.php

6、该网站设置的icp备案号为

在网站根目录下直接命令递归搜icp,-r表示递归搜索,-i表示不区分大小写,当然也可以分析出文件之后直接查找相关内容,都很快

1
grep -ri "icp" ./

1777382342783

1
icp1919810

7、该网站设置的主域名为

一开始是想去nginx配置文件里面看反向代理配置,但是好像没发现域名?应该是没有配置,只好会到网站目录查找,看有RSS订阅,点进去看看,果然有域名www.2026fic.forensix,但是其实严格来说的话这个算是子域名,主域名也就是根域名应该是2026fic.forensix,一般情况下会把这两个其中一个重定向到另一个,让不管用户搜哪个都能找到网站,但是也有很多不使用根域名的情况,这里存疑,毕竟问的是网站配置的域名,就写www.2026fic.forensix吧。

1777383659267

1
www.2026fic.forensix

8、该网站分类3中,视频的拼音为

其实没有太读懂这题的意思,感觉上有可能是重构出网站之后会能很简单的看出。为什么会问拼音呢?一个视频的拼音应该存在哪里呢?这种应该是动态的东西,大概率是在数据库里?不清楚先去看看,先找一下数据库连接文件,找到是database.php,看看数据库密码连接

1777386148639

但是后续启动数据库启动不了,依旧是依赖问题,还是得回到真实物理机环境中,所以这题只好使用仿真的做法了。这个数据库是在容器里面的(后面的题目有做到),是在lxc容器里面,我这里默认是没有启动的,不清楚是不是我一开始在docker里面改了一些东西的原因,如果你的数据库直接连接也无法连接上,请去docker里面启动一下容器,或者把mysql拉到宿主机来连接,连接上之后看到很多个表,但是只有少数的表有信息,比如mac_type,里面有一个字段是en_type,英文名应该就是这个字段,刚好看到一个值是fenlei3?中文名因为编码的问题在nevicat里面看不到,可以使用命令查一下,当然不查也基本确定就是这个答案了

1
SELECT type_id, type_name, type_en FROM mac_type WHERE type_id=3;

1778041596531

1
fenlei3

9、该站点设置页面中,被使用的前端模板来自于哪个源文件?

application/extra/maccms.php这个macCMS 的配置文件里面写了一行配置

1
'template_dir' => '001tep'

模板文件在这个目录下/001tep/

里面的info.ini就是模板的配置源文件,但是具体问的是哪个不清楚,其实模板的源文件还有很多个,像是改目录/html下面的也都是,站点设置页面究竟是哪一个?有点不理解是哪一个,比赛的时候也没搞清楚,猜测是配置页面info.ini

1
info.ini

10、该网站的伪静态规则配置文件sm3值为

伪配置文件,应该就在我们刚刚看到的两个nginx配置文件中的一个nginx.confsites-available两个的其中一个,看看哪个是已经启用的(找不到命令记得安装,突然想起来)

1
nginx -t

1777514844835

nginx是正在用的,看了一眼刚好另一个文件名是default,应该就是他了,计算他的sm3值就行

1777515870781

1
e73407468e6f52af54c7b14632eeeb9be25b05106d06c4c3085fc843c223793f

11、该网站关联的数据库的ip地址为

网站下的数据库相关配置文件里面只写了mytidb

1777516252347

看看hosts文件里面的解析

1777516422724

1
10.0.3.100

12、该网站数据库使用了哪一类容器技术

查一下mytidb这个文件名,找到三个全是lxc下的,豆包查了一下lxc也是一个容器技术,那应该就是他了

1777517327011

1
lxc

13、运行在4000端口的备份数据库版本号为

可以查一下4000端口是哪个服务比较常用,查到刚好是TIDB,是数据库服务那应该大差不差了,TiDB 可以理解为是一个分布式版MySQL,底层是多服务器集群,语法和mysql完全一模一样,也伪装成一个mysql数据库

1777517561862

如果服务没启动可以去启动起来

1777518357396

命令直接就可以查看到版本是v7.5.0

1
ps aux | grep tidb-server

也可以连接上数据库之后select version()查看完整的版本号

1
8.0.11-TIDB-v7.5.0

当然也有另外一种做法

这个lxc目录下的mytidb只有一个config文件,看了内容之后知道真正的tidb的路径为/db/tidb/

1778060415009

找到配置文件

1778073752772

1
cat /db/tidb/etc/systemd/system/tidb.service

查看可知版本是v7.5.0

1778073876434

1
v7.5.0

14、新注册用户数量最多的日期为

这里开始基本都是查数据库里面的信息,可以直接用nevicat连接可视化查看,也可以使用命令查

mac_user表的user_reg_time字段,存有用户的创建时间

1
2
3
4
5
6
>SELECT DATE(FROM_UNIXTIME(user_reg_time)) reg_date
>FROM mac_user
>WHERE user_reg_time > 0
>GROUP BY reg_date
>ORDER BY COUNT(*) DESC
>LIMIT 1;

查出来答案是:

1
2026-04-15

15、马慧美最后一次登录该网站的ip为

同样是查数据库

mac_user表的user_name字段,看名字都是拼音存储的,并且首字母大写,直接搜Ma Hui Mei,找到user_last_login_ip的值是858461603是32 位无符号整数,转成点分十进制就行了

1
51.43.21.163

16、以下哪个文件系统未被使用

首先前面又提到btrfs是主文件系统,lsblk -f看一下文件系统信息,可以看到有btrfs和lvm,大概率也能排除ntfs,这是win常用的文件系统,xfs也没看到,而且这道题好像是多选题,排除了两个那另外两个就是答案了

1778074855908

1
AC

17、该服务器安装了以下那些数据库服务

有三个都是前面看文件系统的时候见过的,一个是pg,一个是mysql,还有tidb,如果不确定也可以看看当前运行的进程也能找到pg,mysql,tidb

1
ACD