用Scalpel緊急找回丟失的文件
譯文【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】