Day23 講反鑑識的時候說,攻擊者把 log 清掉、把檔案刪掉,還可以往它沒清到的地方挖,像 Registry、MFT。
但這招有個前提,我是在考前一天晚上才被一題練習題點醒的。
題目大概是一台 Windows 疑似被記憶體常駐的惡意程式感染,而且機器已經關機了,問接下來最好的鑑識手段是甚麼。
我選了去查 Registry 跟 INDX,正解是去找 hibernation file 或 crash dump。
INDX 是 NTFS 拿來記「這個資料夾底下有哪些檔案」的索引,跟 MFT 一樣,檔案刪了之後常常還查得到曾經存在過的痕跡。
所以這兩個地方本身沒有錯,錯在這題的東西根本沒碰過磁碟。
記憶體常駐(memory-resident),有時候也叫 fileless,意思是惡意程式只活在 RAM 裡,沒有在硬碟上留一個執行檔。
Registry、INDX、MFT 這些地方記的都是「磁碟上發生過的事」,檔案建立過、被開過、被刪過,才會留下紀錄。
一個從頭到尾沒落地的東西,這些地方本來就不會有它。
那 RAM 呢?
關機的那一刻,RAM 裡的東西就沒了,這就是 Day21、Day23 一直在講的 volatile evidence。
那可不可以開機之後再用工具抓記憶體?
我的理解是也不行,開機之後 RAM 裡裝的是一套全新的系統,原本那份已經被蓋掉了,抓到的是乾淨的記憶體。
所以剩下的路只有一條:找 RAM 曾經不小心掉到磁碟上的地方。
Windows 上大致有三個。
hiberfil.sys 是休眠檔,放在系統磁碟的根目錄,是隱藏的系統檔。
微軟文件的寫法是,休眠的時候 ==all the contents of memory are written to a file on the primary system drive==,也就是把記憶體整份寫進這個檔案,下次開機再讀回來。
所以如果那台機器出事後被「休眠」而不是關機,記憶體的內容就有機會整份躺在這裡。
但這邊要小心一件事。
Windows 10、11 預設的快速啟動(Fast Startup)也會用到這個檔案,可是它是先把使用者登出,才把 kernel 那一段寫進去。
所以按下關機之後 hiberfil.sys 裡面有東西,不代表使用者那邊跑的程式也在裡面,這個我的理解是要看當時是哪一種關法。
Memory.dmp 是當機(藍畫面)的時候留下來的 crash dump,預設在 %SystemRoot%\Memory.dmp。
系統掛掉的那一刻,會先把記憶體寫進 pagefile,下次開機再整理成這個檔案。
一樣有但書,dump 有分好幾種,微軟文件寫 kernel memory dump 不包含分配給 user-mode 程式的記憶體,所以有 dump 也不保證抓得到想要的東西。
pagefile.sys 是分頁檔,RAM 不夠用的時候,系統會把比較少用的記憶體分頁先搬到這裡放。
它不是一份完整的記憶體,比較像是零碎的片段,但惡意程式的一小塊有機會剛好被搬進來過。
| 檔案 | 甚麼時候會寫進去 | 我的理解 |
|---|---|---|
| hiberfil.sys | 休眠、快速啟動 | 有機會是整份記憶體,但要看關法 |
| Memory.dmp | 當機(藍畫面) | 看 dump 類型,不一定有 user-mode 的部分 |
| pagefile.sys | 平常就在寫 | 片段,運氣好會撈到 |
三個都不是一定有,有沒有開休眠、有沒有當過機、dump 設定是哪一種,都會影響能撈到甚麼。
不過關機之後,也就剩這幾個地方可以碰碰運氣了。
說到 pagefile.sys,還有一個我也錯過的地方。
機器還開著的時候,直接去複製 pagefile.sys,會跳出「檔案已在另一個程式中開啟」,我把它當成權限不夠。
其實這是使用中被鎖住,作業系統開著的時候會一直佔著這個檔案(hiberfil.sys 也一樣),所以就算用系統管理員開命令列也解不開。
要拿它,就是讓 OS 停下來,關機、把硬碟拆下來,接到另一台機器上離線複製,接的時候記得 Day23 講的 write blocker。
但是!!!關機這個動作本身就會讓 RAM 消失。
所以順序上,我的理解是要記憶體的話先在開機狀態下用 live memory capture 的工具抓,再來才是關機拿 pagefile。
這跟 Day23 的 order of volatility 是同一件事,越容易不見的越先拿。
刪掉的檔案就是另外一回事了,因為它確實寫進過磁碟。
在 Windows 上把一個檔案刪掉(清空資源回收筒那種),通常只是把它在檔案系統裡的那一筆標成「可以重用」,資料本身還在原本的位置,直到被新的東西蓋掉。
Day23 講的 MFT 時間戳就是靠這個。
另一個會留東西的地方叫 slack space。
檔案系統分配空間是一格一格給的,這一格叫 cluster,常見是 4 KB。
假設一個檔案只有 1 KB,它還是會拿到一整格,剩下那 3 KB 沒用到,就是 slack space。
這塊空間如果之前裝過別的檔案,舊資料的尾巴就有可能還留在裡面。
所以 slack space 只會出現在已經格式化、有檔案系統的磁區裡。
磁碟管理裡那塊黑色的「未配置」空間,根本沒有檔案系統,也就沒有「分配了一格沒用滿」這回事,它不算 slack space。
那東西還在,要怎麼撈回來?
這就是 data carving。
它不靠檔案系統的索引,直接在整顆磁碟的原始資料裡找檔案的特徵,例如 JPEG 開頭固定是 FF D8 FF,找到開頭、找到結尾,把中間那一段切出來存成一個檔案。
foremost、Scalpel 都是做這件事的工具。
但 carving 救得回內容,救不回檔名跟目錄。
因為檔名、放在哪個資料夾,那些是記在檔案系統裡的,carving 從頭到尾就沒有去讀檔案系統,所以救回來的檔案只會有工具自己給的編號。
註記:carving 我還沒自己跑過,以上是依據書上跟題目詳解整理的,如果有實際做過的大大歡迎給予回饋!