【51CTO.com快译】系统管理员的部分职责是帮助用户管理数据。这么做的一个重要方面是,确保贵公司有良好的备份计划,用户定期备份,或者使定期备份实现自动化。
然而糟糕的情况时而会发生。文件误删除,文件系统损坏或分区丢失,无论出于何种原因,备份都未含有你需要的内容。
在试图恢复丢失的数据之前,你得先查明数据丢失的原因。用户可能只是放错了文件,或者用户不知道有备份。但如果用户确实删除了没有备份的文件,你就需要恢复删除的文件。不过如果分区表被打乱了,文件其实根本没有丢失,你可能需要考虑用TestDisk(https://www.redhat.com/sysadmin/recover-partition-files-testdisk)来恢复分区表或分区本身。
如果文件或分区恢复不成功,或只恢复了一部分,该如何是好?这时候Scalpel(https://github.com/sleuthkit/scalpel)出场了。 Scalpel基于描述独特文件类型的模式来执行文件雕复(file carving)。它基于二进制字符串和正则表达式查找这些模式,然后相应提取文件。
该工具目前未加以维护,但向来可靠,编译和运行起来完全符合预期。如果你运行Red Hat Enterprise Linux(RHEL)7、RHEL 8或Fedora,可以从klaatu.fedorapeople.org下载Scalpel的RPM安装程序及依赖项libtre。
Scalpel入手
Scalpel捆绑有全面的文件类型及独特的识别功能。有时,可以通过头尾部的可预测文本来识别文件:
- htm n 50000
而有时需要神秘的十六进制代码:
- jpg y 200000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9
Scalpel要求你复制/etc/scalpel.conf,编辑副本以添加希望恢复的文件类型,将不需要的文件类型排除在外。比如,如果你知道没有或不关心.fws文件,就在文件中将该行注释掉。这么做可以加快恢复过程并减少误报。
在配置文件中,文件定义的格式从左到右如下:
- 文件扩展名。
- 头尾部是不是区分大小写(y或n)。
- 希望Scalpel找到的最小和***的文件。
- 识别文件开始的标准头部。
- 识别文件结束的标准尾部。
footer字段是可选的。如果未提供footer,Scalpel提取你设为文件类型***值的字节数。
你可能发现恢复工作只抢救了文件的一部分,比如这个主体恢复的JPG:
图1. 不完整的JPG文件
此结果意味着你可能需要增加文件的边界***值,然后重新扫描,以便文件的末尾也能恢复:
图2. 修复后的JPG文件
定义新文件类型
首先拷贝Scalpel配置文件。如果你的所有用户生成类似的数据,整个公司可能只需要一个配置文件。或者,每个部门都有一个配置文件可能更好。
要将自己的文件类型添加到Scalpel配置,先做一番调查取证分析。
若是文本文件,***有某种可预测的结构。比如说,XML文件可能以
- $ head --bytes 8 example.xcf | hexdump --canonical
- 00000000 67 69 6d 70 20 78 63 66 |gimp xcf|
- 00000008
此输出来自Red Hat Enterprise Linux 8系统。在较旧系统上,可能需要较旧的语法:
- $ head --bytes 8 example.xcf | hexdump -C
- 00000000 67 69 6d 70 20 78 63 66 |gimp xcf|
- 00000008
hexdump的标准输出在最左列显示地址,在最右边显示解码值。中间列显示的是XCF文件***行的前8个字节的十六进制字节。
/etc/scalpel.conf中的大多数二进制文件看起来与该输出很相似,只是这些值以\ x换码序列开头,表示这些数字实际上是十六进制数字。比如说,JPG文件在配置文件中看起来这样:
- jpg y 200000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9
将该值与你的系统上任何JPG文件的前6个字节的测试十六进制值(因为这是scalpel.conf在其JPG定义中包含的字节数)进行比较:
- $ head --bytes 6 example.jpg | | hexdump --canonical
- 00000000 ff d8 ff e0 00 10 |......|
- 00000006
将尾部与***2个字节进行比较以匹配配置文件显示的内容:
- $ tail --bytes -2 example.jpg | hexdump --canonical
- 00000000 ff d9 |..|
- 00000002
这些值匹配,因此你可以确信有效的JPG文件可能都以可预测的顺序开始和结束。
注意:scalpel.conf文件中的Ogg条目具有误导性,因为它没有\ x换码序列。如果你需要恢复Ogg文件,请解决此问题或替换其定义。
开始动手
现在,为你需要恢复的所有文件(比如前面例子中的XCF)获得同样的信心级别。重申一下,这是你定义问题驱动器常见的二进制文件类型的工作流程:
1. 使用head -bytes n命令,获取文件类型的前几个字节的十六进制值。
2. 使用tail --bytes -n命令,获取***几个字节。
3. 对几个相同类型的不同文件重复此过程,以确认此模式的一致性,根据需要调整头部和尾部模式的长度。
4. 在自定义Scalpel配置中输入头部值和尾部值,使用\ x表示法将每个字节标识为十六进制字符。
针对需要恢复的每个重要的二进制文件类型,按此顺序操作。
如果文件是纯文本,提供通用头部和尾部,比如代表shell脚本的#!/bin/sh、代表带有h1级标题的标记文件的#(#后面的空格很重要)、代表XML文件的
准备好运行Scalpel时,创建一个可以放置已抢救文件的目录:
- $ mkdir /run/media/seth/rescuer/scalped
注意:请勿在含有丢失数据的同一个卷上创建此目录。
如果问题驱动器尚未挂载,请挂载,然后运行Scalpel:
- $ scalpel -c my-scalpel.conf \
- -o /run/media/seth/rescuer/scalped \
- /run/media/seth/victim
还可以在磁盘映像上运行Scalpel:
- $ scalpel -c my-scalpel.conf \
- -o ~/scalped ~/victim.img
Scalpel运行完毕后,请在指定的抢救目录中查看文件。
总之,***进行备份,那样可以避免文件恢复。但万一发生最坏的情况,不妨试试Scalpel、慎重雕复。
原文标题:Find lost files with Scalpel,作者:Seth Kenlon
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】