Day21 講圍堵的時候留了一個問題:主機確認被感染,能不能直接關機?
Day22 的答案是斷網但保持開機,因為記憶體跟連線狀態一關機就沒了。
那留下來之後,到底要怎麼拿出來?
讀到 IR 這個 domain 的時候,證據這一塊我錯了一串,Chain of Custody、legal hold、write blocker、hash 對不上的原因,這幾題練習題我都答錯。
所以這篇就來整理,證據從被發現到被拿去分析,中間要守哪些規矩。
這些步驟主要是為了讓證據上得了法庭(court),英文叫 admissibility(可採性)。
想像一下對方的律師會問甚麼:
你怎麼證明這顆硬碟就是從那台電腦拆下來的?
拆下來之後到分析之前,經過誰的手?
你怎麼證明裡面的東西沒被你們自己改過、刪過,或是被放了甚麼進去?
只要有一個問題答不出來,鑑識做得再漂亮,證據可能就站不住了。
反過來說,如果只是內部要做 RCA(根因分析)或事後檢討,不打算走法律程序,規矩就不一定要這麼嚴。
下面每一個名詞,其實都是在回答上面其中一個問題。
Legal hold 中文我腦海直譯法律性保留,意思是組織收到通知(可能是官司、可能是調查),從這一刻起,相關的資料不能刪。
它的第一步不是去拿資料,而是通知會碰到這些資料的部門,先保全,不要動。
因為組織裡很多東西是會自己消失的,信箱有保留期限、log 會輪替,備份軟體的保留週期到了,舊的還原點也會被自動清掉。
這些平常是正常的維運,但 legal hold 一下來,就要先把它們停住。
那如果發現該留的資料,已經被例行的清除政策刪掉了呢?
我的理解是先回報法務,不是自己跑去做資料救援。
這在法律上可能牽涉到證據滅失,要怎麼處理是律師的判斷,鑑識或 IT 人員先動手,反而可能把事情弄得更複雜。
Day21、Day22 一直在講「揮發性證據」,這裡把它講完整。
RFC 3227(Guidelines for Evidence Collection and Archiving)第 2.1 節列了一個順序,從最容易消失的開始:
這個順序就叫 order of volatility。
記憶體跟網路連線狀態排在很前面,機器一關、網路一斷就沒了;硬碟排在後面,關機它還在。
所以執行containment的時候「先別關機」,跟這張清單講的是同一件事,切之前先想一下,這個動作會毀掉清單上的哪幾格,那幾格就先拿。
那如果證據不是被我們自己弄不見,是攻擊者先清過了呢?
有些惡意程式做完事會自己收尾,把 event log 清掉、把 prefetch 刪掉,連最一開始進來的那支 dropper 也一起刪,順便把主機上的 EDR 停掉。
prefetch 是 Windows 為了讓程式下次開得比較快留下的紀錄,會記哪些程式跑過;dropper 是第一支進來、負責把真正的惡意程式放下來的程式。
這時如果有SIEM的話,在Log產生的當下就被傳送到另一個位置,多一個保存證據的機會,反之沒有SIEM的話,能找到的證據就少了很多。
這種時候能找的,是它沒清到的地方。
一個是 Registry,程式執行過的痕跡、為了開機自動啟動寫進去的 Run key(像 HKCU\Software\Microsoft\Windows\CurrentVersion\Run),有可能會留下來。
另一個是檔案系統的 metadata,NTFS 有一張叫 MFT(Master File Table)的總表,記著每個檔案的名字、位置跟時間。檔案刪掉之後,那一筆通常只是被標成可以重用,在被新資料蓋掉之前,還有機會讀到它的時間戳。
所以被點名清掉、停掉的東西就先不用找了,往還在的地方去挖。
Chain of Custody(CoC,證據監管鏈)回答的是「這個證物,有誰碰過」。
它是一份跟著證物走的紀錄,大致會記:
重點在「從甚麼時候開始記」。
我的理解是,CoC 是跟著證據起算的,碰到證物的那一刻就要開始寫,而且是先寫再動。
硬碟拿到手,先把型號、序號、時間記下來,才去接機器拉 image,不是做完再回頭補。
這邊很容易跟 legal hold 混在一起。
legal hold 是跟著通知起算的,叫大家先別刪;CoC 是跟著證物起算的,記錄它經過誰。
一個在證據被拿到之前,一個在之後。
紀錄中間只要斷一段,例如某天證物放在哪、誰拿過說不清楚,這就叫 CoC 斷鏈,對方律師就可以主張這段期間證物可能被動過。
如果現場是在實體世界,像機房被闖入、機櫃被破壞、線被剪斷,記錄的方式是拍照。
這種時候去匯出設備的組態或 log,證明的是系統的狀態,證明不了門鎖被撬、機櫃被砸;而現場一旦清理過,就回不去了。
所以判斷發生什麼事、該怎麼取證,也是很重要滴。
照片拍完也是證物,一樣要標記、寫進 CoC。
順帶一提,證物在路上也要顧。
手機這類東西運送的時候,會放進訊號屏蔽袋,袋子再貼防拆封條,證明路上沒人打開過。
最後一個問題是「你怎麼證明沒改過」。
Write blocker(防寫裝置)是接在證物硬碟跟鑑識電腦中間的東西,讓鑑識電腦只能讀、不能寫。
為什麼需要它?
因為作業系統掛載一顆磁碟的時候,可能會順手寫一點東西進去,像日誌或存取時間,人沒做甚麼,硬碟內容就已經變了。
這是在實驗室分析階段用的,跟上面運送用的屏蔽袋是不同階段的東西。
接上 write blocker 之後,對整顆硬碟算一次 hash,拉完 image 再對 image 算一次,兩個要一樣。
Linux 上拉 image 常見的是 dd:
dd if=/dev/sdb of=evidence.img bs=64k status=progress
sha256sum /dev/sdb evidence.img
bs 是每次讀寫的區塊大小,GNU coreutils 的說明寫輸入跟輸出的預設都是 512 bytes,一次搬這麼小一塊,整顆硬碟拉起來會很慢,所以通常會把它調大。if、of 是來源跟目的地,跟速度沒有關係。
hash 相符代表甚麼?
這裡我原本只想到「內容沒被改」,但其實它一次排除了三件事:沒被改、沒被刪、也沒被加東西進去。
最後那個很重要,對方可能會說「這個惡意程式是你們自己放進去的」,hash 對得上就能回應這個說法。
反過來,如果 image 前後 hash 對不上,常見的原因是沒接 write blocker,原碟在過程中被寫到了。或者是取證時失敗,所以承上面所述,拉image之前就要先算一次hash,確保我們拉出來的image是跟原始硬碟一致的。
這跟 CoC 是兩回事,CoC 記的是人跟時間,不會讓 hash 改變。
Day08 用 certutil -hashfile 算 hash,是拿去 VirusTotal 查「有沒有人看過這個檔案」。
這裡是同一招換一個用途,拿來證明「這顆硬碟從頭到尾沒被動過」。
| 名詞 | 回答哪個問題 | 我的理解 |
|---|---|---|
| Legal hold | 資料還在不在 | 收到通知就叫大家不能刪 |
| Order of volatility | 先拿哪個 | 記憶體、連線先拿,硬碟後拿 |
| Chain of Custody | 經過誰的手 | 碰到證物就開始記,先寫再動 |
| Write blocker | 有沒有被寫到 | 分析時只讀不寫 |
| Hash | 有沒有被改、刪、加 | 前後一致就三個都排除 |
大家可以想一下,當自己的環境出事時,誰去拿證據、拿完放哪、交給誰,這些有寫下來嗎?