* 本文作者:TomKing,本文屬FreeBuf原創(chuàng )獎勵計劃,未經(jīng)許可禁止轉載
最近遇到不少應急都提出一個(gè)需求,能不能溯源???這個(gè)事還真不好干,你把證據,犯案時(shí)間都確定的時(shí)候,要求翻看監控(日志)對應犯罪嫌疑人時(shí),突然說(shuō)監控(日志)沒(méi)有記錄。不過(guò)現在都要求保留至少6個(gè)月的日志,因此這種原因會(huì )少了很多,然而我對于Windows中系統日志不了解,在解讀時(shí)經(jīng)常摸不著(zhù)頭腦,所以就認真的分析了evtx格式的系統日志。這篇文章可能記錄的不是很全面,師傅們多多指教。
Windows操作系統在其運行的生命周期中會(huì )記錄其大量的日志信息,這些日志信息包括:Windows事件日志(Event Log),Windows服務(wù)器系統的IIS日志,FTP日志,Exchange Server郵件服務(wù),MS SQL Server數據庫日志等。處理應急事件時(shí),客戶(hù)提出需要為其提供溯源,這些日志信息在取證和溯源中扮演著(zhù)重要的角色。
Windows事件日志文件實(shí)際上是以特定的數據結構的方式存儲內容,其中包括有關(guān)系統,安全,應用程序的記錄。每個(gè)記錄事件的數據結構中包含了9個(gè)元素(可以理解成數據庫中的字段):日期/時(shí)間、事件類(lèi)型、用戶(hù)、計算機、事件ID、來(lái)源、類(lèi)別、描述、數據等信息。應急響應工程師可以根據日志取證,了解計算機上上發(fā)生的具體行為。
查看系統日志方法,Windows系統中自帶了一個(gè)叫做事件查看器的工具,它可以用來(lái)查看分析所有的Windows系統日志。打開(kāi)事件查看器方法:開(kāi)始->運行->輸入eventvwr->回車(chē)的方式快速打開(kāi)該工具。使用該工具可以看到系統日志被分為了兩大類(lèi):Windows日志和應用程序和服務(wù)日志。早期版本中Windows日志只有,應用程序,安全,系統和Setup,新的版本中增加了設置及轉發(fā)事件日志(默認禁用)。
系統內置的三個(gè)核心日志文件(System,Security和Application)默認大小均為20480KB(20MB),記錄事件數據超過(guò)20MB時(shí),默認系統將優(yōu)先覆蓋過(guò)期的日志記錄。其它應用程序及服務(wù)日志默認最大為1024KB,超過(guò)最大限制也優(yōu)先覆蓋過(guò)期的日志記錄。
Windows事件日志中共有五種事件類(lèi)型,所有的事件必須擁有五種事件類(lèi)型中的一種,且只可以有一種。五種事件類(lèi)型分為:
1. 信息(Information)
信息事件指應用程序、驅動(dòng)程序或服務(wù)的成功操作的事件。
2. 警告(Warning)
警告事件指不是直接的、主要的,但是會(huì )導致將來(lái)問(wèn)題發(fā)生的問(wèn)題。例如,當磁盤(pán)空間不足或未找到打印機時(shí),都會(huì )記錄一個(gè)“警告”事件。
3. 錯誤(Error)
錯誤事件指用戶(hù)應該知道的重要的問(wèn)題。錯誤事件通常指功能和數據的丟失。例如,如果一個(gè)服務(wù)不能作為系統引導被加載,那么它會(huì )產(chǎn)生一個(gè)錯誤事件。
4. 成功審核(Success audit)
成功的審核安全訪(fǎng)問(wèn)嘗試,主要是指安全性日志,這里記錄著(zhù)用戶(hù)登錄/注銷(xiāo)、對象訪(fǎng)問(wèn)、特權使用、賬戶(hù)管理、策略更改、詳細跟蹤、目錄服務(wù)訪(fǎng)問(wèn)、賬戶(hù)登錄等事件,例如所有的成功登錄系統都會(huì )被記錄為“ 成功審核”事件。
5. 失敗審核(Failure audit)
失敗的審核安全登錄嘗試,例如用戶(hù)試圖訪(fǎng)問(wèn)網(wǎng)絡(luò )驅動(dòng)器失敗,則該嘗試會(huì )被作為失敗審核事件記錄下來(lái)。
事件日志文件存儲位置(Vista/Win7/Win8/Win10/Server2008/Server 2012及之后的版本)
| 類(lèi)型 | 事件類(lèi)型 | 描述 | 文件名 |
|---|---|---|---|
| Windows日志 | 系統 | 包含系統進(jìn)程,設備磁盤(pán)活動(dòng)等。事件記錄了設備驅動(dòng)無(wú)法正常啟動(dòng)或停止,硬件失敗,重復IP地址,系統進(jìn)程的啟動(dòng),停止及暫停等行為。 | System.evtx |
| 安全 | 包含安全性相關(guān)的事件,如用戶(hù)權限變更,登錄及注銷(xiāo),文件及文件夾訪(fǎng)問(wèn),打印等信息。 | Security.evtx | |
| 應用程序 | 包含操作系統安裝的應用程序軟件相關(guān)的事件。事件包括了錯誤、警告及任何應用程序需要報告的信息,應用程序開(kāi)發(fā)人員可以決定記錄哪些信息。 | Application.evtx | |
| 應用程序及服務(wù)日志 | Microsoft | Microsoft文件夾下包含了200多個(gè)微軟內置的事件日志分類(lèi),只有部分類(lèi)型默認啟用記錄功能,如遠程桌面客戶(hù)端連接、無(wú)線(xiàn)網(wǎng)絡(luò )、有線(xiàn)網(wǎng)路、設備安裝等相關(guān)日志。 | 詳見(jiàn)日志存儲目錄對應文件 |
| Microsoft Office Alerts | 微軟Office應用程序(包括Word/Excel/PowerPoint等)的各種警告信息,其中包含用戶(hù)對文檔操作過(guò)程中出現的各種行為,記錄有文件名、路徑等信息。 | OAerts.evtx | |
| Windows PowerShell | Windows自帶的PowerShell應用的日志信息。 | Windows PowerShell.evtx | |
| Internet Explorer | IE瀏覽器應用程序的日志信息,默認未啟用,需要通過(guò)組策略進(jìn)行配置。 | Internet Explorer.evtx |
表1 事件日志存儲位置
提示:%SystemRoot%為系統環(huán)境變量,默認值為C:\WINDOWS。
圖 EVTX事件日志文件
使用事件查看器工具可以將這些EVTX事件日志文件導出為evtx,xml,txt和csv格式的文件。
Windows事件日志中記錄的信息中,關(guān)鍵的要素包含事件級別、記錄時(shí)間、事件來(lái)源、事件ID、事件描述、涉及的用戶(hù)、計算機、操作代碼及任務(wù)類(lèi)別等。其中事件的ID與操作系統的版本有關(guān),以下列舉出的事件ID的操縱系統為Vista/Win7/Win8/Win10/Server2008/Server 2012及之后的版本:
| 事件ID | 說(shuō)明 |
|---|---|
| 1102 | 清理審計日志 |
| 4624 | 賬號成功登錄 |
| 4625 | 賬號登錄失敗 |
| 4768 | Kerberos身份驗證(TGT請求) |
| 4769 | Kerberos服務(wù)票證請求 |
| 4776 | NTLM身份驗證 |
| 4672 | 授予特殊權限 |
| 4720 | 創(chuàng )建用戶(hù) |
| 4726 | 刪除用戶(hù) |
| 4728 | 將成員添加到啟用安全的全局組中 |
| 4729 | 將成員從安全的全局組中移除 |
| 4732 | 將成員添加到啟用安全的本地組中 |
| 4733 | 將成員從啟用安全的本地組中移除 |
| 4756 | 將成員添加到啟用安全的通用組中 |
| 4757 | 將成員從啟用安全的通用組中移除 |
| 4719 | 系統審計策略修改 |
表 常見(jiàn)Windows賬戶(hù)及相關(guān)shijain 對照表
五種事件類(lèi)型中,最為重要的是成功審核(Success Audit),所有系統登錄成功都會(huì )被標記成為成功審核。每個(gè)成功登錄的事件都會(huì )標記一個(gè)登錄類(lèi)型:
| 登錄類(lèi)型 | 描述 |
|---|---|
| 2 | 交互式登錄(用戶(hù)從控制臺登錄) |
| 3 | 網(wǎng)絡(luò )(例如:通過(guò)net use,訪(fǎng)問(wèn)共享網(wǎng)絡(luò )) |
| 4 | 批處理(為批處理程序保留) |
| 5 | 服務(wù)啟動(dòng)(服務(wù)登錄) |
| 6 | 不支持 |
| 7 | 解鎖(帶密碼保護的屏幕保護程序的無(wú)人值班工作站) |
| 8 | 網(wǎng)絡(luò )明文(IIS服務(wù)器登錄驗證) |
| 10 | 遠程交互(終端服務(wù),遠程桌面,遠程輔助) |
| 11 | 緩存域證書(shū)登錄 |
表 登錄類(lèi)型
系統事件日志主要保存的類(lèi)型為:*.evtx,*.xml,*.txt,*.csv。對于后三種文件格式已經(jīng)比較了解,現在分析下evtx后綴額格式。事件日志(evtx)文件是一種二進(jìn)制格式的文件。
圖 evtx文件類(lèi)型
文件頭部簽名為十六進(jìn)制45 6C 66 46 69 6C 65 00(ElfFile\x00)。Evtx文件結構包含三部分:文件頭,數據塊,結尾空值。文件頭由4096字節大小組成,具體的結構如下表:
| 偏移 | 長(cháng)度 | 值 | 描述 |
|---|---|---|---|
| 0 | 8 | “ElFile\x00” | 簽名 |
| 8 | 8 | 第一個(gè)數據塊 | |
| 16 | 8 | 最后一個(gè)數據塊 | |
| 24 | 8 | 下一個(gè)記錄標識符 | |
| 32 | 4 | 128 | 頭的大小 |
| 36 | 2 | 1 | 次版本號 |
| 38 | 2 | 3 | 主版本號 |
| 40 | 2 | 4096 | 數據塊偏移量 |
| 42 | 2 | 數據塊的數量 | |
| 44 | 76 | 空值 | |
| 120 | 4 | 文件標志 | |
| 124 | 4 | 校驗和 | |
| 128 | 3968 | 空值 |
表 File Header內容
Windows XML 事件日志大小
事件日志文件大小 = (數據塊的數量*65536)+4096。
文件頭偏移量為120的數據值為文件標志,該部分的組成如下表:
| 值 | 標識符 | 描述 |
|---|---|---|
| 0×0001 | 已更新 | |
| 0×0002 | 已填充 |
圖 File Header文件格式
每個(gè)數據塊大小為65536字節,數據塊的頭部標簽名為45 6C 66 43 68 6E 6B 00(ElfChnk\x00),數據塊由數據塊頭部,事件記錄,閑置空間,數據塊文件頭由512字節大小組成,具體結構如下表:
| 偏移 | 長(cháng)度 | 值 | 描述 |
|---|---|---|---|
| 0 | 8 | “ElfChnk\x00” | 簽名 |
| 8 | 8 | 第一個(gè)事件記錄編號 | |
| 16 | 8 | 最后一個(gè)事件記錄編號 | |
| 24 | 8 | 第一個(gè)事件記錄標識符 | |
| 32 | 8 | 最后一個(gè)事件記錄標識符 | |
| 40 | 4 | 128 | 指針數據偏移量 |
| 44 | 4 | 最后一個(gè)事件記錄數據偏移量 | |
| 48 | 4 | 自由空間偏移 | |
| 52 | 4 | 事件記錄校驗和 | |
| 56 | 64 | 空值 | |
| 120 | 4 | 未知 | |
| 124 | 4 | 校驗和 |
表 Chunk header
圖 Chunk Header文件格式
數據塊包含多個(gè)事件記錄,一個(gè)事件記錄對應一條日志信息。事件記錄的的大小及組成如下表:
| 偏移量 | 長(cháng)度 | 值 | 描述 |
|---|---|---|---|
| 0 | 4 | “**\x00\x00” | 簽名 |
| 4 | 4 | 事件記錄塊的大小 | |
| 8 | 8 | 事件記錄標識符 | |
| 16 | 8 | 事件記錄寫(xiě)入時(shí)間 | |
| 24 | … | 事件記錄內容 | |
| … | 4 | 尺寸拷貝 |
表 Event Record
Windwos操作系統默認沒(méi)有提供刪除特定日志記錄的功能,僅提供了刪除所有日志的操作功能。也就意味著(zhù)日志記錄ID(Event Record ID)應該是連續的,默認的排序方式應該是從大到小往下排列。
通過(guò)對Windows事件日志的取證分析,取證人員可以對操縱系統、應用程序、服務(wù)、設備等操作行為記錄,通過(guò)關(guān)鍵的時(shí)間點(diǎn)進(jìn)行回溯。
分析事件記錄格式后,了解到Windows系統在解析事件記錄日志時(shí),按照Event Record的大小逐條讀取日志的內容。假設修改某條日志的長(cháng)度,使長(cháng)度覆蓋下一條日志,理論上Windows系統解析日志時(shí),就會(huì )跳過(guò)下一條日志,相當于下一條日志被”刪除”。 DanderSpritz中的eventlogedit 就是這個(gè)思路,僅僅時(shí)修改了程度,實(shí)際上并沒(méi)有刪除日志內容。實(shí)現思路如下圖:
圖 刪除事件記錄思路
為了確保修改后的日志文件能夠被正確識別,還需要修改多個(gè)標志位和重新計算校驗和。
圖 不正確修改事件日志
為了確保不出現如上圖所示的錯誤,總結一下刪除單條日志內容的方法:
1. File Header中的Next recordidentifier的值減一(偏移量為24字節)
2. 重新計算File Header中CheckSum(偏移量為124字節)
3. 修改Event Record,找到需刪除的記錄和需刪除前一條記錄并計算日志的長(cháng)度,更新Event Record的Event record identifier
4. 更新ElfChnk,需要修改的內容為:Last event record number,Last event recordidentifier,Last event record data offset,Event recordschecksum,Checksum
根據以上的方式進(jìn)行刪除單條日志是NAS方程式組織的DanderSpritz中的eventlogedit實(shí)現方式。實(shí)際上只是將信息進(jìn)行了隱藏,在此基礎上,將指定日志的內容清空,就能夠實(shí)現真正的日志刪除。
準備:測試文件(test.evtx—系統中的Setup.evtx),Winhex,python
下載地址:https://github.com/ByPupil/delete-windows-log
該文件中包含了8條日志,下面演示刪除第8條記錄的實(shí)踐過(guò)程。使用事件查看器打開(kāi)確認最后一條事件的EventRecordID,該實(shí)驗中的值為8。
圖 test.evtx文件
1. File Header中的Next recordidentifier的值減一
File Header是整個(gè)文件最開(kāi)始的部分,Nextrecord identifier的偏移量為24(0×18),其長(cháng)度為8字節。實(shí)驗文件test.evtx內容如下:
圖 test.evtx文件內容
Next record identifier的值為0×09。將該值減一0×08 寫(xiě)入。這兒需要提一下的是,該文件的字節序為小端,因此低位會(huì )在前面。
2. 重新計算File Header中CheckSum
計算方法:前120字節做CRC32運算,偏移量為124(0x7c),長(cháng)度為4。修改后的文件內容如下圖:
圖 修改后的test.evtx
現在提取前120字節的內容:
456C6646696C650000000000000000000000000000000000080000000000000080000000010003000010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000使用python中binascii模塊計算CRC32。代碼如下:
圖 計算CRC32代碼
輸出的結果為:0xfb027480,修改文件內容,修改后如下圖:
圖 修改checksum
3. 修改Event Record
通過(guò)find hex values查找2A2A0000,定位到第8條Event Record。該條Event Record的長(cháng)度為 0×180。如下圖:
圖 第8條EventRecord
第7條Event Record的長(cháng)度為0×170。如下圖:
圖 第7條EventRecord
計算需要修改的內容長(cháng)度。新長(cháng)度為0×170+0×180=0x2f0。由于是刪除最后一條記錄,所以不需要更新Event record identifier。修改長(cháng)度的位置有兩個(gè),分別為第7條日志的長(cháng)度和第 8條日志的最尾部。
圖 第7條日志
圖 第8條日志
4. 更新ElfChnk
搜索ElfChuk關(guān)鍵字,找到對應ElfChuk位置。如下圖:
圖 Elfchnk
修改如下內容:
Last event record number減1,為0×07
Last event record identifier減1,為0×07
Last event record data offset,為0x13c8
Event records checksum,為0xf403d736
Checksum,為0x7563439c
Event records checksum的數據計算范圍:chunk中的事件記錄的偏移量是固定的,是從文件頭偏移0×1200個(gè)字節,意思就是checksum的數據起始位置為0×1200。事件記錄的結束位置的計算方式:chunk的起始塊地址+ Free space offset= events records data。
Checksum的數據計算范圍:是固定地址0×1000-0×1078,0×1080-0×1200 。
修改后的ElfChnk如下圖:
圖 修改后的ElfChnk
經(jīng)過(guò)修改后,使用系統自帶的事件查看器打開(kāi),此時(shí)日志文件中最后一條記錄被成功刪除。
圖 成功刪除單條日志記錄
此處講的是刪除最后一條記錄的詳細過(guò)曾,刪除第一條和中間的記錄在實(shí)際操作中會(huì )有一些不一樣的部分,只要對了解evtx文件的格式,刪除evtx格式內容中的記錄方法并不唯一。只需要刪除對應的數據塊,并最終使該文件的校驗通過(guò)即可。
使用以上的方式刪除單挑記錄,其實(shí)被刪除的數據并沒(méi)有真正的被刪掉,嚴格意義上講就是將部分數據進(jìn)行了隱藏?;謴驮镜臄祿梢允褂胒ox-it的danderspritz-evtx工具,原因就是用刪除數據的思路反向恢復就行。使用該工具,確實(shí)可以將被刪除的數據提取出來(lái),不過(guò)恢復的evtx格式的文件并不能被打開(kāi)。暫時(shí)沒(méi)有研究該代碼的實(shí)現過(guò)程,所以不能下分析具體原因。
工具使用如下圖:
圖 danderspritz-evtx使用
恢復數據被導出為xml格式文件,如下圖:
圖 該條為被刪除的第8條記錄
恢復的evtx格式文件打開(kāi)出錯,如下圖:
如果需要將日志真正的刪除,可以使用\x00填充被隱藏的數據部分填充。并重新計算相應的checksum。
https://blog.fox-it.com/2017/12/08/detection-and-recovery-of-nsas-covered-up-tracks/
聯(lián)系客服