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