器取證實戰(zhàn):從易失數(shù)據(jù)到已刪文件完整還原)
簡介Linux系統(tǒng)下的計算機取證技術(shù)研究是一份PDF格式的學術(shù)參考資料源自2014年《內(nèi)蒙古科技與經(jīng)濟》期刊。文章面向信息安全、系統(tǒng)運維、司法鑒定及應(yīng)急響應(yīng)領(lǐng)域的從業(yè)者與研究人員重點解決 Linux 環(huán)境下現(xiàn)場電子證據(jù)如何規(guī)范采集與分析的問題。由于 Linux 廣泛用于服務(wù)器端并存在安全隱患其取證流程對追蹤入侵鏈路、固定犯罪證據(jù)尤為重要。正文系統(tǒng)介紹取證三階段數(shù)據(jù)收集、數(shù)據(jù)分析與數(shù)據(jù)恢復并強調(diào)內(nèi)存、屏幕信息、網(wǎng)絡(luò)連接、運行進程等高易失性數(shù)據(jù)的采集順序與命令用法如使用 netstat 捕獲網(wǎng)絡(luò)連接、ps 查看進程列表在文件系統(tǒng)部分還講解 dd 做磁盤鏡像、日志文件與臨時文件中的痕跡分析以及恢復已刪除數(shù)據(jù)的常用思路。資源包僅含1個PDF文檔大小155KB內(nèi)容精煉、結(jié)構(gòu)清晰適合作為網(wǎng)絡(luò)安全課程、等級保護測評或入侵排查場景下的快速參考。目前已有205人學習下載可幫助讀者快速建立 Linux 取證的完整框架與實操意識。1. 取證不是重啟機器先搞清楚Linux下哪些數(shù)據(jù)能成為證據(jù)服務(wù)器被入侵后的第一反應(yīng)通常是拔網(wǎng)線、重啟服務(wù)、趕緊恢復業(yè)務(wù)但作為取證人員最怕的就是這種“熱心”。Linux 系統(tǒng)的取證難點不在于工具少而在于證據(jù)的易失性和文件系統(tǒng)的底層機制——你以為刪掉的日志、覆蓋過的文件、格式化的分區(qū)在 inode 和塊設(shè)備層面可能仍然完整。計算機取證技術(shù)研究落到 Linux 平臺上核心就三件事把易失數(shù)據(jù)按優(yōu)先級抓下來、對磁盤做位鏡像而不是復制文件、用只讀方式分析元數(shù)據(jù)。適合的人群是運維工程師、安全應(yīng)急響應(yīng)人員和剛轉(zhuǎn)行做取證分析的技術(shù)人員。讀完你應(yīng)該能獨立做一次硬盤鏡像、提取已刪除文件、重建時間線并知道每步操作為什么必須這么做。2. 證據(jù)固定與Linux文件系統(tǒng)元數(shù)據(jù)、日志域與哈希校驗2.1 證據(jù)易失性分級先抄內(nèi)存再碰磁盤計算機取證里有個基本原則叫“證據(jù)易失性分級”意思是數(shù)據(jù)越容易丟越要先采集。Linux 服務(wù)器的內(nèi)存中可能有正在運行的進程、網(wǎng)絡(luò)連接、解密后的明文這些數(shù)據(jù)在斷電后立刻消失所以優(yōu)先級最高。磁盤里的數(shù)據(jù)雖然持久但一旦操作系統(tǒng)繼續(xù)寫入被刪除文件的塊可能被覆蓋因此固定磁盤鏡像必須排在內(nèi)存采集之后。常見做法是在現(xiàn)場直接用 LiME 或 systemtap 抓內(nèi)存鏡像但這里我建議先畫清楚數(shù)據(jù)獲取次序避免操作順序顛倒導致證據(jù)污染優(yōu)先級數(shù)據(jù)位置典型內(nèi)容常用工具1CPU 寄存器 / 內(nèi)核緩存當前指令、進程上下文gdb / crash2物理內(nèi)存進程、網(wǎng)絡(luò)連接、明文密鑰LiME / volatility3進程表與內(nèi)核數(shù)據(jù)結(jié)構(gòu)打開的文件、socket 狀態(tài)ps / lsof / ss4臨時文件系統(tǒng) / tmpfs運行時寫出的臨時數(shù)據(jù)strings / grep5塊設(shè)備上的日志與文件系統(tǒng)系統(tǒng)日志、文件內(nèi)容journalctl / fsstat6外部存儲與備份數(shù)據(jù)庫備份、歸檔dcfldd / dd理解了這張表你就知道為什么取證機上必須準備一個足夠大的存儲設(shè)備并且要在采集過程中記錄每一條命令的執(zhí)行時間和哈希值。2.2 inode、目錄項與時間戳Linux里“刪除”為什么攔不住取證Linux 文件系統(tǒng)以 ext4 為例把文件數(shù)據(jù)拆成兩個部分inode 保存元數(shù)據(jù)和數(shù)據(jù)塊指針目錄項dentry只負責把文件名映射到 inode 號。執(zhí)行rm命令時系統(tǒng)只是清除了目錄項并釋放 inode 中的塊位圖并不會清零數(shù)據(jù)塊本身這為后續(xù)恢復留下了空間。每個 inode 里保存了三類時間戳atime訪問時間、mtime內(nèi)容修改時間、ctimeinode 狀態(tài)變更時間。一個常見誤區(qū)是認為 ctime 是創(chuàng)建時間其實它記錄的是權(quán)限變更、鏈接數(shù)變化等元數(shù)據(jù)操作時間。攻擊者修改文件屬性、替換二進制文件時ctime 和 mtime 都會發(fā)生變化這恰好是指證異常操作的關(guān)鍵線索。另外要注意 ext4 的日志域journal里可能殘留文件內(nèi)容的副本默認情況下日志會記錄元數(shù)據(jù)變更特定掛載選項下文件內(nèi)容也可能進入 journal。取證分析時用 debugfs 可以查看 journal 中的殘留數(shù)據(jù)這往往是普通運維人員忽略但取證人員最感興趣的區(qū)域。2.3 證據(jù)固定與哈希校驗的最小命令組證據(jù)固定最忌諱的是只拷貝文件不拷設(shè)備。文件的復制會改變 atime、可能觸發(fā)文件系統(tǒng)寫入而且無法獲取未分配空間中的殘留數(shù)據(jù)。正確做法是對整個塊設(shè)備做鏡像同時計算哈希用來證明鏡像是原始證據(jù)的精確副本。# 前置動作確認設(shè)備號和掛載狀態(tài) lsblk -p sudo fuser -km /mnt/data # 謹慎使用確保業(yè)務(wù)已停止 # 制作位鏡像并同時計算哈希 sudo dcfldd if/dev/sdb1 of/evidence/disk_sdb1.dd bs4M \ hashsha256 hashlog/evidence/disk_sdb1.dd.sha256 \ convnoerror,sync這段命令的含義是if指定輸入設(shè)備of指定鏡像輸出文件bs4M設(shè)置每次讀寫 4MB 塊兼顧速度和磁盤 IO 壓力hashsha256讓 dcfldd 邊拷貝邊計算哈希convnoerror,sync表示遇到讀取錯誤時繼續(xù)填充空數(shù)據(jù)而不是中斷這樣即使源盤有壞道也能盡可能保留可讀內(nèi)容。鏡像完成后把 sha256 文件和鏡像文件一起保存后續(xù)任何分析操作都必須在鏡像副本上執(zhí)行源設(shè)備則收進防靜電袋封存。3. 磁盤鏡像與只讀掛載把涉案系統(tǒng)搬到取證機上3.1 用 dcfldd 做位鏡像并同時計算哈希上一章的命令已經(jīng)展示了 dcfldd 的基本用法這里補充幾個實戰(zhàn)中必須注意的參數(shù)細節(jié)。dcfldd 相比傳統(tǒng) dd 的優(yōu)勢是支持哈希計算、多線程和狀態(tài)輸出。如果你手里只有 dd也可以用dd if/dev/sdb1 ofimage.dd bs4M convnoerror,sync配合sha256sum image.dd單獨計算但兩者之間存在時間差嚴格意義上不如邊寫邊算更可靠。做鏡像前要重點確認設(shè)備沒有處于掛載狀態(tài)否則鏡像里可能出現(xiàn)不一致的文件系統(tǒng)狀態(tài)影響后續(xù)分析結(jié)論。可以用mount | grep sdb1檢查。另外鏡像文件存放的目標盤必須有足夠空間建議先用du -sh /dev/sdb1估算實際占用但注意鏡像體積接近整個分區(qū)大小而不是實際數(shù)據(jù)量。3.2 掛載鏡像文件loop、offset與只讀參數(shù)鏡像拿到取證機上以后最安全的做法是強制只讀掛載防止操作系統(tǒng)在掛載過程中修改文件系統(tǒng)。普通mount -o ro對常規(guī)分區(qū)生效但面對鏡像文件中的分區(qū)表和嵌套分區(qū)需要按下面的方式處理。# 方法一通過 losetup 關(guān)聯(lián)鏡像為 loop 設(shè)備 sudo losetup -r -fP disk_sdb1.dd sudo lsblk -f # 方法二直接指定 offset 掛載分區(qū) sudo fdisk -l disk_sdb1.dd # 假設(shè)輸出顯示起始扇區(qū)為 2048扇區(qū)大小 512 字節(jié) sudo mkdir -p /mnt/evidence sudo mount -o ro,loop,offset$((2048 * 512)) disk_sdb1.dd /mnt/evidencelosetup -r表示把鏡像以只讀方式關(guān)聯(lián)-f自動選擇空閑 loop 設(shè)備-P讓內(nèi)核重新掃描分區(qū)表。lsblk -f用來確認分區(qū)類型和文件系統(tǒng)格式。兩種方法的區(qū)別在于losetup 適合需要進一步用 sleuthkit 按扇區(qū)操作的場景直接用 offset 掛載更簡潔但 offset 的計算容易出錯寫錯一個扇區(qū)可能導致掛載失敗甚至誤掛到錯誤的數(shù)據(jù)區(qū)域。掛載后立刻驗證是否真的只讀touch /mnt/evidence/test應(yīng)該返回 Read-only file system 錯誤。取證過程中任何寫操作都會改變訪問時間破壞證據(jù)完整性所以這里千萬不能省。3.3 用Sleuth Kit解析鏡像中的文件系統(tǒng)掛載只讀分區(qū)可以方便地用文件管理器查看但取證分析還需要看到被標記為刪除的文件以及文件系統(tǒng)級元數(shù)據(jù)。Sleuth Kit 提供了一組不依賴內(nèi)核掛載的底層分析工具直接解析鏡像文件效果穩(wěn)定# 查看文件系統(tǒng)總體信息 fsstat -i raw disk_sdb1.dd # 遞歸列出根目錄下所有文件包括已刪除項 fls -r -o 2048 disk_sdb1.dd / # 按 inode 導出指定文件內(nèi)容 icat -o 2048 disk_sdb1.dd 128 /evidence/var_log_syslogfsstat會輸出文件系統(tǒng)類型、塊大小、inode 數(shù)量和掛載次數(shù)其中掛載次數(shù)能輔助判斷系統(tǒng)是否被多次重啟fls -r遞歸列出目錄項輸出格式中帶有*前綴的即為已刪除文件-o 2048表示從 2048 扇區(qū)偏移處解析文件系統(tǒng)icat按 inode 號提取文件內(nèi)容即使原文件名已經(jīng)不存在也能拿到數(shù)據(jù)。這三類工具配合 grep 就能完成大多數(shù)文件系統(tǒng)層的取證工作。如果鏡像中有加密分區(qū)那就需要 LUKS 密鑰或內(nèi)存鏡像中的 master key這一步在分析階段要單獨處理。4. Linux日志與用戶行為取證從系統(tǒng)日志到bash歷史的重建4.1 Linux 日志體系journald、syslog 與應(yīng)用日志Linux 下日志分散在不同位置取證時必須先搭一個日志清單。journald 收集內(nèi)核和 systemd 服務(wù)的結(jié)構(gòu)化日志寫入二進制 journal 文件rsyslog 負責把傳統(tǒng)文本日志寫到 /var/log 下應(yīng)用日志則由具體服務(wù)自己管理比如 Nginx 的 access.log 和 error.log。日志文件記錄內(nèi)容取證時的關(guān)鍵字段/var/log/auth.log登錄認證、sudo 授權(quán)用戶名、來源 IP、時間/var/log/syslog系統(tǒng)運行信息硬件錯誤、服務(wù)狀態(tài)/var/log/kern.log內(nèi)核日志驅(qū)動加載、內(nèi)存分配/var/log/wtmp登錄歷史登錄時間、注銷時間/var/log/btmp失敗登錄記錄暴力破解來源/var/log/audit/audit.log內(nèi)核審計事件文件訪問、系統(tǒng)調(diào)用/var/log/bash/bash_history用戶命令歷史完整命令序列取證時優(yōu)先采集 journald 的持久化數(shù)據(jù)而不是單純看文本日志因為 journal 里包含元數(shù)據(jù)可靠性更高而文本日志可能已經(jīng)被攻擊者編輯過。下面命令把 journal 導出成文本格式方便后續(xù)分析# 導出指定時間范圍的 journal 日志 sudo journalctl --since 2024-03-01 00:00:00 --until 2024-03-01 23:59:59 \ -o short-precise /evidence/journal.txt # 查看特定服務(wù)的重啟記錄 sudo journalctl -u sshd --since 2024-03-01 --no-pager /evidence/sshd_journal.txt-o short-precise讓每行日志帶上微秒級時間戳便于后續(xù)時間線排序-u指定 unit 名稱只過濾出 sshd 相關(guān)日志。這里注意 journald 默認在 /var/log/journal 下持久化日志如果系統(tǒng)沒有啟用持久化關(guān)機后日志丟失那只有 syslog 和 auditd 的文本記錄可以依賴。4.2 auth與登錄痕跡排查last、lastlog、faillog與auditd非法登錄是入侵的常見入口auth.log 堆滿了失敗密碼記錄不代表系統(tǒng)被入侵真正要關(guān)注的是那些成功的、來自異常 IP 的登錄以及取消密碼后切換用戶的行為。常用排查命令組合# 顯示 wtmp 中的登錄記錄 last -f /var/log/wtmp -a # 顯示所有用戶最近登錄時間 lastlog # 提取 auth.log 中成功登錄的來源 IP grep Accepted /var/log/auth.log | awk {print $1, $2, $3, $9, $11} | sort # 統(tǒng)計失敗登錄次數(shù)最多的 IP grep Failed password /var/log/auth.log | awk {print $(NF-3)} | sort | uniq -c | sort -rn | head -20last讀取二進制文件 wtmp輸出比較完整-a選項把主機名顯示在最后一列方便肉眼對 IP。最后一條命令中關(guān)鍵在$(NF-3)因為 auth.log 里失敗密碼的行格式最后幾列是from 183.2.1.1 port 1234 ssh2獲取倒數(shù)第 4 個字段就是來源 IP。這類命令的重點不是單條執(zhí)行而是把結(jié)果匯總成 CSV 后用 LibreOffice 或 pandas 做時序分析觀察是否存在掃段攻擊后的定點登錄。auditd 是內(nèi)核級審計系統(tǒng)如果系統(tǒng)開啟了該服務(wù)排查文件讀取和系統(tǒng)調(diào)用記錄時幾乎無往不利# 查詢指定用戶的所有審計事件 sudo ausearch -ua victim_user -ts recent --format text # 查找對指定文件的訪問記錄 sudo ausearch -f /etc/passwd -iausearch -ua中的-ua表示用戶賬號-ts recent限制最近時間窗口-f按文件路徑過濾-i將數(shù)字 ID 翻譯成可讀格式。auditd 日志很多情況下不會事先開啟所以在現(xiàn)場取證時先檢查/etc/audit/rules.d/下的規(guī)則是否包含-w /etc/passwd -p wa -k passwd_watch這類文件監(jiān)控規(guī)則沒開的話就只能依賴 bash history 和文件系統(tǒng)元數(shù)據(jù)。4.3 用戶操作行為取證history、權(quán)限與可疑命令定位bash 的歷史記錄相對脆弱用戶手動執(zhí)行history -c或unset HISTFILE后會殘留較少內(nèi)容但 /root/.bash_history 和普通用戶 home 目錄下的歷史文件仍然值得仔細看。攻擊者經(jīng)常在獲得權(quán)限后下載掃描工具、編譯漏洞利用代碼這些都會在 history 中留下痕跡。# 讀取所有用戶的歷史文件 find /home /root -name *history* -type f 2/dev/null | while read f; do echo $f cat $f done # 在鏡像中搜索常見的提權(quán)命令 grep -rnE wget|curl|chmod \x|python.*-c|nc -|ncat|socat \ /mnt/evidence/root /mnt/evidence/home 2/dev/null這里需要注意 history 文件沒有時間戳只能判斷命令的相對順序。想還原時間線可以結(jié)合 shell 的 HISTFILE 配置比如export HISTTIMEFORMAT%F %T 會在每條命令前記錄執(zhí)行時間如果系統(tǒng)開啟了 tmux 或 screen那~/.bash_history可能不會更新而.bashrc中自定義的PROMPT_COMMAND會把命令追加到獨立日志中這些都是比默認 history 更可靠的時間線來源。用戶權(quán)限方面重點檢查/etc/passwd中 UID 為 0 的非 root 賬戶、/etc/sudoers中新增的免密條目以及帶 SUID 位后門的可執(zhí)行文件find / -perm -4000 -type f -exec ls -l {} \; 2/dev/nullSUID 文件如果屬于 root 且出現(xiàn)在 /tmp 或 /dev/shm 下基本可以判定是后門這類文件在鏡像分析中要用 icat 單獨提取出來不要破壞原始 inode。5. 已刪除文件恢復與時間線構(gòu)建最后付現(xiàn)留一手5.1 用 fls 找到已刪除的目錄項攻擊者清理現(xiàn)場時最常用的手段是刪日志、刪工具、刪臨時文件。而取證的最后一步往往就是從這個“垃圾堆”里撈關(guān)鍵證據(jù)。用 fls 定位已刪除目錄項fls -d -r -o 2048 disk_sdb1.dd /tmp-d只顯示已刪除項-r遞歸子目錄。如果輸出中看到####占位符和*標記說明該 inode 已被釋放但數(shù)據(jù)塊仍可能存在。注意已刪除項的文件名可能被復用所以不能只看名字要結(jié)合 inode 編號和內(nèi)容哈希判斷。5.2 用 icat 提取指定 inode 的內(nèi)容# 根據(jù) fls 輸出的 inode 號提取文件 icat -o 2048 disk_sdb1.dd 40961 /evidence/recovered_tar.gz # 驗證提取內(nèi)容是否具備正常文件結(jié)構(gòu) file /evidence/recovered_tar.gz sha256sum /evidence/recovered_tar.gzicat直接從鏡像中讀取 inode 對應(yīng)數(shù)據(jù)塊不受目錄項丟失影響。加-o偏移是為了跳過主引導記錄直接定位文件系統(tǒng)。file命令驗證開頭魔數(shù)如果提取出來顯示data而非gzip compressed data說明該 inode 數(shù)據(jù)塊已被部分覆蓋可以嘗試用foremost按文件簽名做文件雕刻。5.3 用 bodyfile mactime 畫出事件時間線單點文件恢復解決不了“先后順序”的問題需要把所有文件的元數(shù)據(jù)時間戳匯總成時間線。Sleuth Kit 的 mactime 工具接受 bodyfile 格式輸入輸出按時間排序的完整事件流fls -r -m / -o 2048 disk_sdb1.dd / body.txt mactime -b body.txt -d timeline.csv-m /指定 bodyfile 中路徑的根目錄便于排序時對齊mactime的-d參數(shù)讓輸出為逗號分隔格式直接用 Excel 打開即可。timeline.csv 中每一行包含時間戳、變更類型MACB 分別對應(yīng)用戶可感知時間、內(nèi)容修改、屬性變更、創(chuàng)建時間、路徑和 inode 號。還原攻擊鏈時先看 /tmp 下新出現(xiàn)的文件時間再對應(yīng)當前用戶的 bash_history 時間窗口就能把下載工具、提權(quán)、清理日志三個階段串起來。文件恢復和時間線依賴同一個前提鏡像必須是完整的位鏡像并且整個分析過程沒有寫入原盤。如果你在鏡像上反復實驗恢復命令鏡像本身會被污染到時候連標準時間線都跑不出來。所以實踐中我會把鏡像復制兩份一份留作原始證據(jù)一份專門用來反復演練恢復方案。本文還有配套的精品資源點擊獲取