拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

我爱Linux CTF取证实战:从镜像分析到提取flag全流程

我爱Linux CTF取证实战:从镜像分析到提取flag全流程

1. 拿到题目先别慌:整体思路拆解

“我爱Linux”这道题躺在BUUCTF的Misc分类里有段时间了,乍一看名字像是给Linux初学者灌鸡汤,实际上手才知道,它考的是你能不能把一个Linux系统当成“案发现场”去排查。题面往往只丢给你一个文件,没有太多提示,很多人第一反应是拿记事本打开看,看半天全是乱码,然后就卡住了。

这类题在CTF里有个专门的说法,叫Linux取证,核心目标就是让你通过磁盘镜像、日志文件、命令历史这些零碎信息,把出题人埋进去的flag挖出来。跟Web题直接打漏洞、Reverse题拖到IDA里逆向不一样,Misc取证题更贴近真实世界的安全运维场景:一台Linux机器被人动过手脚,你作为排查人员,要从文件系统里找到攻击者留下的痕迹。

我复盘这道题的时候,把完整思路拆成了五个层次,按顺序走完基本不会漏线索:

  • 识别文件类型,搞清楚手里拿到的到底是什么东西
  • 挂载或解包,让镜像里的文件系统变得可读
  • 搜集系统基本信息,包括用户、内核版本、发行版类型
  • 检查用户痕迹,重点是shell历史、计划任务、最近访问文件
  • 全文搜索flag特征,配合删除文件恢复工具兜底

这五步看起来简单,但每一步都有对应的Linux命令和细节坑。比如挂载镜像时权限不够怎么办,历史命令文件被清空了去哪找残留,flag藏在 compressed 文件里怎么发现。文章后面我会逐个展开,先把框架立住。

说句实在话,这道题对有Linux基础的人很友好,因为它考的都不是偏门技巧,全是运维日常会碰到的操作。但对纯Windows环境入门CTF的新手来说,第一个坎就是Linux命令不熟,第二个坎是不理解文件系统的布局,所以做题过程本身就是一次很扎实的Linux实战训练。

2. 环境准备:Kali虚拟机与高频命令清单

做“我爱Linux”之前,先把工作环境搭好。我推荐直接用Kali Linux的虚拟机,理由很简单:大部分Misc取证工具在Kali里预装好了,省去一个个编译安装的时间。如果你主力机是Windows,用VMware或VirtualBox装一个Kali,分配2核CPU和4G内存就够跑本题了。

装好系统之后,进入终端,先用几条命令确认基础环境:

uname -a cat /etc/os-release which file strings grep mount binwalk foremost

这几条命令分别确认内核版本、发行版信息以及常用工具是否可用。实测中如果binwalk或foremost没装,执行apt install binwalk foremost补上就行。

2.1 高频命令速查:先掌握这10个就够用

“我爱Linux”涉及的Linux命令不算多,但每一条都值得认真理解。我整理了一份高频命令清单,做题前过一遍,效率会高很多:

命令核心用途本题典型场景
file判断文件真实类型看题目压缩包解出来的是什么格式
ls -la列出包括隐藏文件在内的所有文件找.bash_history、.secret这类隐藏线索
strings提取文件中的可打印字符串在二进制或ramdisk里搜flag
grep -r递归搜索文本内容全盘搜flag、ctf关键字
mount挂载文件系统把磁盘镜像挂到本机目录
cat查看文件内容读配置文件、flag文件
find按名字或属性查找文件定位可疑文件
tar/unzip解包常见压缩格式解开题目给的第一层压缩包
history查看当前shell的历史命令模拟排查别人动过的系统
extundelete恢复ext系列文件系统已删除文件出题人删掉flag后的补救

你先别急着把命令背下来,理解每个命令在“排查”场景下怎么用,比死记选项更重要。比如strings加| grep flag这种管道组合,才是做题时真正的常态。

2.2 为什么推荐在Kali里做而不是直接Windows工具一把梭

有人可能会说,Windows下用WinHex、DiskGenius也能看镜像,何必装个虚拟机这么麻烦。这个想法我以前也有过,被现实教育了两次之后彻底改观。

Linux取证的关键动作是“挂载文件系统”,也就是把镜像里的ext4分区直接当成一个目录来浏览。Windows原生不认识ext4,你得额外装第三方驱动或软件,而且很多只读挂载工具对损坏镜像的容错很差,一遇到异常分区就直接罢工。Kali原生支持ext2、ext3、ext4、xfs等主流文件系统,mount命令一条搞定,遇到问题还能方便地用fsck修复,整个排查链路是通的。

再有一个原因,题目环境本身就是Linux,你在Kali里操作时自然而然会接触到目录结构、权限体系、命令管道这些知识点,做完题积累的经验可以无缝迁移到真实的Linux运维里。我见过不少新手在Windows下用工具点点点把题做出来了,问他为什么这么操作,答不上来,换个类似的题又不会了。这不是做题,是背答案。

3. 核心实操:镜像分析与信息搜集

环境准备好之后,就进入正式做题环节。以下步骤以“题目给的是一个磁盘镜像文件”为例展开,这是“我爱Linux”最常见的出题形式。如果拿到的是tar包或core dump文件,处理思路类似,我会在第四部分补充说明。

3.1 第一步:识别文件类型,别被扩展名骗了

拿到题目压缩包,先解压:

tar -xvf 我爱Linux.tar.gz

解出来通常是一个没有扩展名或者扩展名很迷惑的文件,比如叫linux或flag.img。此时千万先别急着改后缀,直接用file命令看真实类型:

file linux

输出可能是Linux rev 1.0 ext4 filesystem data,也可能是DOS/MBR boot sector,还有可能是gzip compressed data。这一步决定了后面用什么工具链。

我见过有人拿到ext4镜像,非要先用WinHex打开,看到一堆十六进制就懵了。正确做法是识别出ext4之后,直接进入挂载环节。如果输出提示是压缩数据,就继续解压一层,直到露出真正的文件系统镜像为止。

注意:file命令识别的是一段数据的“特征头”,不是万能的。个别镜像被二次打包或加密后,file给出的结果会有误导性,这时可以辅助用binwalk扫描一下文件结构。

3.2 第二步:挂载镜像,让文件系统可读

识别出ext4镜像后,把它挂载到本地目录:

mkdir /mnt/linux mount linux /mnt/linux ls /mnt/linux

这里有两个高频坑,我先提前说一下:

第一个坑是权限不足,普通用户执行mount会提示only root can do this,需要用sudo。第二个坑是挂载后显示只读,这往往是因为镜像本身是只读的或者文件系统有日志未恢复,可以用:

mount -o loop,ro linux /mnt/linux

loop选项让镜像作为块设备挂载,ro表示只读,避免做题过程中意外修改损坏镜像。如果你对镜像文件系统完整性存疑,可以先把镜像复制一份再挂载副本,反正镜像一般不大。

挂载成功后,大概率会看到以下标准目录:

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

看到这棵树,思路就要立刻切换到“排查一台陌生Linux”模式了。

3.3 第三步:按目录逐层排查,优先看敏感位置

照我的经验,排查顺序建议是home -> root -> etc -> var -> tmp,也就是先看用户目录,再看系统配置,最后看临时文件。

ls -la /mnt/linux/home/ ls -la /mnt/linux/root/

-a参数很关键,普通ls看不到以点开头的隐藏文件,而这道题的线索经常就藏在隐藏文件里。如果home目录下有个用户叫linux,就进到/home/linux/里仔细翻:

ls -la /mnt/linux/home/linux/ cat /mnt/linux/home/linux/.bash_history

.bash_history是这个题目的高频考点。出题人模拟了一个用户操作Linux的过程,历史命令里可能残留了创建flag、移动flag、甚至删除flag的记录。你哪怕只找到一条mv flag.txt /tmp/,也能顺藤摸瓜找到位置。

我碰到过一种变体,历史命令被故意清空了,但/root/.bash_history或者/home/user/.zsh_history里还有残留,所以两端都查一遍最稳妥。

3.4 第四步:检查系统关键配置,别漏掉用户与计划任务

信息搜集做到一半,记得去/etc目录里看看账号体系:

cat /mnt/linux/etc/passwd cat /mnt/linux/etc/shadow

passwd文件看有哪些用户,shadow文件里存的是密码哈希。在真实取证里,攻击者经常给自己留后门账号,CTF题也喜欢模仿这个套路,比如添加一个test用户或者backdoor用户。如果发现异常用户,就去它的 home 目录翻一翻。

计划任务也是出题人喜欢藏东西的地方:

cat /mnt/linux/etc/crontab ls -la /mnt/linux/etc/cron.d/ cat /mnt/linux/var/spool/cron/crontabs/*

如果发现一个fetchflag.sh每隔几分钟执行一次的定时任务,那么脚本内容里大概率直接写着flag路径,或者脚本本身可以执行输出flag。

3.5 第五步:全盘搜索flag特征,覆盖盲区

目录翻得差不多了,不管找没找到,都建议跑一次全盘特征搜索,防止漏掉藏在犄角旮旯的线索:

grep -r "flag" /mnt/linux/ --include="*.txt" --include="*.sh" --include="*.py" 2>/dev/null

这条命令可以找出文本类文件里的flag字样。如果出题人把flag做成图片或压缩包,文本搜索就扫不到,这时候换个思路,用find按时间或文件类型找:

find /mnt/linux -name "*.png" -o -name "*.jpg" -o -name "*.zip" -o -name "*.tar.gz" 2>/dev/null

这个方法可以快速定位非文本文件。实际操作中,我遇到过flag被写进一张PNG图片的元数据里,也遇到过塞进一个zip压缩包并加了弱密码。对待这些情况,图片就用strings提取信息,压缩包可以尝试直接解压或爆破弱口令。

3.6 第六步:删除文件恢复,出题人的“最后一层防线”

如果上面几步做完还没有flag,大概率是出题人把flag文件删掉了,这时候就得请出extundelete这类恢复工具。

恢复前先把镜像卸载,避免文件系统还在挂载状态时进行操作:

umount /mnt/linux extundelete linux --restore-all

执行后会在当前目录生成RECOVERED_FILES目录,里面是扫描到的已删除文件。恢复结果跟文件系统类型、删除后写入情况有关,不一定100%成功,但CTF镜像通常很小,删除后没有大量写入,恢复成功率还是很高的。

我实际操作时发现,用extundelete --restore-all恢复出来的文件可能有一堆乱码名称,不要慌,逐个file类型确认,再用strings扫一遍,大概率有惊喜。

3.7 解题全流程速查表

为了方便复盘,我把整个解题流程整理成了一张表,做题时可以直接对照操作:

阶段核心命令目标线索
类型识别file <镜像>判断是否ext4、gzip等格式
挂载系统mount -o loop,ro <镜像> /mnt/linux让目录可访问
用户痕迹cat .bash_history历史命令残留
系统配置cat /etc/passwd、cat /etc/crontab异常用户和计划任务
全局搜索grep -r "flag"flag特征字符串
删除恢复extundelete <镜像> --restore-all被删除的flag文件

4. 常见问题与排查技巧实录

做题做得多了,你会发现很多坑是共通的。下面这些问题是群里和评论区里被问得最多的,我把答案和当时踩坑的过程一起写出来,省得你再走一遍弯路。

4.1 挂载提示“wrong fs type”怎么办

这个提示通常意味着内核缺少对应文件系统的驱动,或者镜像压根不是文件系统镜像。先执行dmesg | tail看看内核日志有没有更具体的报错,然后确认file命令的输出。

如果镜像确实是ext4但系统不识别,可以尝试强制指定类型:

mount -t ext4 -o loop,ro linux /mnt/linux

如果还是失败,就用binwalk linux看看是不是有额外的偏移量。个别镜像前面被塞了几百字节的垃圾数据,导致内核识别不到ext4超级块,这时候mount -o loop,ro,offset=<偏移量>就能解决。

4.2 strings扫出来的内容太多,看不完怎么办

很多人习惯直接strings 文件 | grep flag,这是对的,但总有人漏掉信息,原因是flag关键字可能有大小写变形或者被拆成碎片。

推荐几个进阶搜法:

strings -n 6 文件 | grep -iE 'flag|ctf|key|secret|\{'

-n 6表示只提取长度不小于6的字符串,能过滤大量无意义的短字符。-iE是忽略大小写并支持扩展正则。如果你连{都没搜到,就缩小范围,从题目描述里找提示词。

4.3 教程里的命令敲了没反应,多半是没进对目录

有一个很低级但很多人犯过的错:挂载完镜像,忘了切目录,直接在宿主机根目录下开始翻找。排查时要时刻记住,镜像是挂载在/mnt/linux下的,你要找的东西都在这个挂载点里面,而不是在Kali本机的/home、/root下。

我建议做题时开两个终端,一个专门看镜像里的内容,一个用来执行工具命令,避免搞混当前目录。

4.4 如果题目给的是core dump文件,不是镜像

这道题在BUUCTF的某些版本里会给core dump文件,也就是进程崩溃时的内存快照。core dump不能挂载,但可以用strings和grep直接扫,因为进程内存里往往残留着环境变量、命令行参数、配置文件内容,flag经常直接躺在里面。

处理思路:

file core strings core | grep -i flag

如果strings输出里有大量二进制乱码,先用cat /proc/sys/kernel/core_pattern这类信息了解core的生成方式,再决定要不要用gdb加载分析。不过对Misc题来说,strings | grep已经能解决80%的问题。

4.5 恢复出来的文件打不开怎么办

extundelete恢复的文件偶尔会损坏,大概率是FAT表或inode信息不完整。这种情况下可以试试另一个工具ext4magic,它在某些场景下对已删除文件的恢复效果更好:

ext4magic linux -r -d recovered/

实在不行,还有终极方案:把镜像里未分配空间整体导出,再用foremost按文件特征去“雕刻”数据块重组文件:

dd if=linux of=unallocated.dd bs=4096 foremost -t all -i unallocated.dd

这个过程比较暴力,但胜在覆盖面广,适合最后兜底。

4.6 做完了发现没有flag,问题出在哪

我复盘过很多次这类情况,基本可以归纳成三种原因:

  • 信息搜集不完整,有些隐藏文件没看到,比如.bash_history、.secret这类需要ls -la才能发现的内容
  • flag藏在压缩包或图片里,没被文本搜索覆盖到
  • 出题人删除了文件且没有留下直接路径线索,漏了删除文件恢复这一步

一个稳妥的习惯是,每到一个目录就ls -la,看到任何可疑文件都先用file确认类型,再决定下一步动作。不要看文件名觉得没戏就跳过,出题人不会把flag命名为flag.txt等你来拿,反而经常起个readme、note之类的迷惑性名字。

提示:做题过程中建议保留一份操作日志,也就是把敲过的命令和输出记录下来。不仅方便复盘,写writeup时也能直接用,一举两得。

5. 这道题之外:Linux取证的实际价值

做完“我爱Linux”,别急着做下一道题,停一下,想想这道题练的是什么。表面上是解flag,实际上练的是对Linux系统布局的熟悉程度和信息排查的条理性。

真实世界的安全事件里,服务器被入侵后,第一件事就是做取证分析。攻击者留下了哪些后门账号、有没有改计划任务、删除了什么文件、历史命令里有没有异常操作,这些排查手法跟这道题几乎完全一致。只是现实系统比CTF镜像大得多、复杂得多,不可能用grep -r flag暴力搜索,而要依靠时间线分析、日志关联、文件完整性校验这些系统化手段。

当然,CTF题也有它的局限。镜像体积小、线索集中,属于“刻意布置过的现场”,真实服务器的排查要面对海量噪声,难度高好几个量级。但作为入门训练,它的价值在于让你建立“从文件系统还原事件经过”的思维模型,这个模型是可迁移的。

我再分享一个个人练习习惯:每做完一道Linux取证题,就把用到的命令整理成自己的速查笔记,并且标注每一步是在回答“什么问题”。比如ls -la回答的是“目录里有没有隐藏文件”,history回答的是“这个用户之前执行过什么操作”。积累多了之后,再遇到新镜像,思路会快很多,因为你不再是一条命令一条命令地试,而是带着问题去找答案。

如果有时间,还可以把题目镜像里用到的工具全部从源码编译一遍,比如extundelete、foremost,熟悉它们依赖什么库、处理流程是什么。这个过程有些枯燥,但对深入理解文件系统结构非常有帮助。我当初就是被一道恢复删除文件的题逼着去看了ext4的inode原理,从那之后再遇到文件系统问题,心里就踏实多了。

返回列表