用Scalpel緊急找回丟失的文件
譯文【51CTO.com快譯】系統(tǒng)管理員的部分職責(zé)是幫助用戶(hù)管理數(shù)據(jù)。這么做的一個(gè)重要方面是,確保貴公司有良好的備份計(jì)劃,用戶(hù)定期備份,或者使定期備份實(shí)現(xiàn)自動(dòng)化。
然而糟糕的情況時(shí)而會(huì)發(fā)生。文件誤刪除,文件系統(tǒng)損壞或分區(qū)丟失,無(wú)論出于何種原因,備份都未含有你需要的內(nèi)容。
在試圖恢復(fù)丟失的數(shù)據(jù)之前,你得先查明數(shù)據(jù)丟失的原因。用戶(hù)可能只是放錯(cuò)了文件,或者用戶(hù)不知道有備份。但如果用戶(hù)確實(shí)刪除了沒(méi)有備份的文件,你就需要恢復(fù)刪除的文件。不過(guò)如果分區(qū)表被打亂了,文件其實(shí)根本沒(méi)有丟失,你可能需要考慮用TestDisk(https://www.redhat.com/sysadmin/recover-partition-files-testdisk)來(lái)恢復(fù)分區(qū)表或分區(qū)本身。
如果文件或分區(qū)恢復(fù)不成功,或只恢復(fù)了一部分,該如何是好?這時(shí)候Scalpel(https://github.com/sleuthkit/scalpel)出場(chǎng)了。 Scalpel基于描述獨(dú)特文件類(lèi)型的模式來(lái)執(zhí)行文件雕復(fù)(file carving)。它基于二進(jìn)制字符串和正則表達(dá)式查找這些模式,然后相應(yīng)提取文件。
該工具目前未加以維護(hù),但向來(lái)可靠,編譯和運(yùn)行起來(lái)完全符合預(yù)期。如果你運(yùn)行Red Hat Enterprise Linux(RHEL)7、RHEL 8或Fedora,可以從klaatu.fedorapeople.org下載Scalpel的RPM安裝程序及依賴(lài)項(xiàng)libtre。
Scalpel入手
Scalpel捆綁有全面的文件類(lèi)型及獨(dú)特的識(shí)別功能。有時(shí),可以通過(guò)頭尾部的可預(yù)測(cè)文本來(lái)識(shí)別文件:
- htm n 50000
而有時(shí)需要神秘的十六進(jìn)制代碼:
- jpg y 200000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9
Scalpel要求你復(fù)制/etc/scalpel.conf,編輯副本以添加希望恢復(fù)的文件類(lèi)型,將不需要的文件類(lèi)型排除在外。比如,如果你知道沒(méi)有或不關(guān)心.fws文件,就在文件中將該行注釋掉。這么做可以加快恢復(fù)過(guò)程并減少誤報(bào)。
在配置文件中,文件定義的格式從左到右如下:
- 文件擴(kuò)展名。
- 頭尾部是不是區(qū)分大小寫(xiě)(y或n)。
- 希望Scalpel找到的最小和***的文件。
- 識(shí)別文件開(kāi)始的標(biāo)準(zhǔn)頭部。
- 識(shí)別文件結(jié)束的標(biāo)準(zhǔn)尾部。
footer字段是可選的。如果未提供footer,Scalpel提取你設(shè)為文件類(lèi)型***值的字節(jié)數(shù)。
你可能發(fā)現(xiàn)恢復(fù)工作只搶救了文件的一部分,比如這個(gè)主體恢復(fù)的JPG:
圖1. 不完整的JPG文件
此結(jié)果意味著你可能需要增加文件的邊界***值,然后重新掃描,以便文件的末尾也能恢復(fù):
圖2. 修復(fù)后的JPG文件
定義新文件類(lèi)型
首先拷貝Scalpel配置文件。如果你的所有用戶(hù)生成類(lèi)似的數(shù)據(jù),整個(gè)公司可能只需要一個(gè)配置文件?;蛘?,每個(gè)部門(mén)都有一個(gè)配置文件可能更好。
要將自己的文件類(lèi)型添加到Scalpel配置,先做一番調(diào)查取證分析。
若是文本文件,***有某種可預(yù)測(cè)的結(jié)構(gòu)。比如說(shuō),XML文件可能以
- $ head --bytes 8 example.xcf | hexdump --canonical
- 00000000 67 69 6d 70 20 78 63 66 |gimp xcf|
- 00000008
此輸出來(lái)自Red Hat Enterprise Linux 8系統(tǒng)。在較舊系統(tǒng)上,可能需要較舊的語(yǔ)法:
- $ head --bytes 8 example.xcf | hexdump -C
- 00000000 67 69 6d 70 20 78 63 66 |gimp xcf|
- 00000008
hexdump的標(biāo)準(zhǔn)輸出在最左列顯示地址,在最右邊顯示解碼值。中間列顯示的是XCF文件***行的前8個(gè)字節(jié)的十六進(jìn)制字節(jié)。
/etc/scalpel.conf中的大多數(shù)二進(jìn)制文件看起來(lái)與該輸出很相似,只是這些值以\ x換碼序列開(kāi)頭,表示這些數(shù)字實(shí)際上是十六進(jìn)制數(shù)字。比如說(shuō),JPG文件在配置文件中看起來(lái)這樣:
- jpg y 200000000 \xff\xd8\xff\xe0\x00\x10 \xff\xd9
將該值與你的系統(tǒng)上任何JPG文件的前6個(gè)字節(jié)的測(cè)試十六進(jìn)制值(因?yàn)檫@是scalpel.conf在其JPG定義中包含的字節(jié)數(shù))進(jìn)行比較:
- $ head --bytes 6 example.jpg | | hexdump --canonical
- 00000000 ff d8 ff e0 00 10 |......|
- 00000006
將尾部與***2個(gè)字節(jié)進(jìn)行比較以匹配配置文件顯示的內(nèi)容:
- $ tail --bytes -2 example.jpg | hexdump --canonical
- 00000000 ff d9 |..|
- 00000002
這些值匹配,因此你可以確信有效的JPG文件可能都以可預(yù)測(cè)的順序開(kāi)始和結(jié)束。
注意:scalpel.conf文件中的Ogg條目具有誤導(dǎo)性,因?yàn)樗鼪](méi)有\(zhòng) x換碼序列。如果你需要恢復(fù)Ogg文件,請(qǐng)解決此問(wèn)題或替換其定義。
開(kāi)始動(dòng)手
現(xiàn)在,為你需要恢復(fù)的所有文件(比如前面例子中的XCF)獲得同樣的信心級(jí)別。重申一下,這是你定義問(wèn)題驅(qū)動(dòng)器常見(jiàn)的二進(jìn)制文件類(lèi)型的工作流程:
1. 使用head -bytes n命令,獲取文件類(lèi)型的前幾個(gè)字節(jié)的十六進(jìn)制值。
2. 使用tail --bytes -n命令,獲取***幾個(gè)字節(jié)。
3. 對(duì)幾個(gè)相同類(lèi)型的不同文件重復(fù)此過(guò)程,以確認(rèn)此模式的一致性,根據(jù)需要調(diào)整頭部和尾部模式的長(zhǎng)度。
4. 在自定義Scalpel配置中輸入頭部值和尾部值,使用\ x表示法將每個(gè)字節(jié)標(biāo)識(shí)為十六進(jìn)制字符。
針對(duì)需要恢復(fù)的每個(gè)重要的二進(jìn)制文件類(lèi)型,按此順序操作。
如果文件是純文本,提供通用頭部和尾部,比如代表shell腳本的#!/bin/sh、代表帶有h1級(jí)標(biāo)題的標(biāo)記文件的#(#后面的空格很重要)、代表XML文件的
準(zhǔn)備好運(yùn)行Scalpel時(shí),創(chuàng)建一個(gè)可以放置已搶救文件的目錄:
- $ mkdir /run/media/seth/rescuer/scalped
注意:請(qǐng)勿在含有丟失數(shù)據(jù)的同一個(gè)卷上創(chuàng)建此目錄。
如果問(wèn)題驅(qū)動(dòng)器尚未掛載,請(qǐng)掛載,然后運(yùn)行Scalpel:
- $ scalpel -c my-scalpel.conf \
- -o /run/media/seth/rescuer/scalped \
- /run/media/seth/victim
還可以在磁盤(pán)映像上運(yùn)行Scalpel:
- $ scalpel -c my-scalpel.conf \
- -o ~/scalped ~/victim.img
Scalpel運(yùn)行完畢后,請(qǐng)?jiān)谥付ǖ膿尵饶夸浿胁榭次募?/p>
總之,***進(jìn)行備份,那樣可以避免文件恢復(fù)。但萬(wàn)一發(fā)生最壞的情況,不妨試試Scalpel、慎重雕復(fù)。
原文標(biāo)題:Find lost files with Scalpel,作者:Seth Kenlon
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】