Windows安全事件日志中详细记录了是谁在什么时候通过什么手段登录到系统或者注销了登录,通过分析该日志可以详细了解服务器的安全情况以及必要时的取证工作。
传统的查看Windows安全日志方法是通过系统自带的“事件查看器”
操作方法如下: 1、右键“我的电脑”,选择管理,打开“事件查看器”; 或者按下Windows键+R的组合键,在运行窗口中输入“eventvwr.msc”直接打开“事件查看器”。
使用该工具可以看到系统日志被分为了两大类:Windows日志和应用程序和服务日志。早期版本中Windows日志只有,应用程序,安全,系统和Setup,新的版本中增加了设置及转发事件日志(默认禁用)。
系统内置的三个核心日志文件(System,Security和Application)默认大小均为20480KB(20MB),记录事件数据超过20MB时,默认系统将优先覆盖过期的日志记录。其它应用程序及服务日志默认最大为1024KB,超过最大限制也优先覆盖过期的日志记录。
Windows事件日志中共有五种事件类型,所有的事件必须拥有五种事件类型中的一种,且只可以有一种。五种事件类型分为:
1. 信息(Information)
信息事件指应用程序、驱动程序或服务的成功操作的事件。
2. 警告(Warning)
警告事件指不是直接的、主要的,但是会导致将来问题发生的问题。例如,当磁盘空间不足或未找到打印机时,都会记录一个“警告”事件。
3. 错误(Error)
错误事件指用户应该知道的重要的问题。错误事件通常指功能和数据的丢失。例如,如果一个服务不能作为系统引导被加载,那么它会产生一个错误事件。
4. 成功审核(Success audit)
成功的审核安全访问尝试,主要是指安全性日志,这里记录着用户登录/注销、对象访问、特权使用、账户管理、策略更改、详细跟踪、目录服务访问、账户登录等事件,例如所有的成功登录系统都会被记录为“ 成功审核”事件。
5. 失败审核(Failure audit)
失败的审核安全登录尝试,例如用户试图访问网络驱动器失败,则该尝试会被作为失败审核事件记录下来。
事件日志文件存储位置(Vista/Win7/Win8/Win10/Server2008/Server 2012及之后的版本)
类型 |
事件类型 |
描述 |
文件名 |
Windows日志 |
系统 |
包含系统进程,设备磁盘活动等。事件记录了设备驱动无法正常启动或停止,硬件失败,重复IP地址,系统进程的启动,停止及暂停等行为。 |
System.evtx |
安全 |
包含安全性相关的事件,如用户权限变更,登录及注销,文件及文件夹访问,打印等信息。 |
Security.evtx |
|
应用程序 |
包含操作系统安装的应用程序软件相关的事件。事件包括了错误、警告及任何应用程序需要报告的信息,应用程序开发人员可以决定记录哪些信息。 |
Application.evtx |
|
应用程序及服务日志 |
Microsoft |
Microsoft文件夹下包含了200多个微软内置的事件日志分类,只有部分类型默认启用记录功能,如远程桌面客户端连接、无线网络、有线网路、设备安装等相关日志。 |
详见日志存储目录对应文件 |
Microsoft Office Alerts |
微软Office应用程序(包括Word/Excel/PowerPoint等)的各种警告信息,其中包含用户对文档操作过程中出现的各种行为,记录有文件名、路径等信息。 |
OAerts.evtx |
|
Windows PowerShell |
Windows自带的PowerShell应用的日志信息。 |
Windows PowerShell.evtx |
|
Internet Explorer |
IE浏览器应用程序的日志信息,默认未启用,需要通过组策略进行配置。 |
Internet Explorer.evtx |
表1 事件日志存储位置
提示:%SystemRoot%为系统环境变量,默认值为C:\WINDOWS。
地址:
%SystemRoot%\System32\winevt\Logs
C:\Windows\System32\winevt\Logs
使用事件查看器工具可以将这些EVTX事件日志文件导出为evtx,xml,txt和csv格式的文件。
Windows事件日志中记录的信息中,关键的要素包含事件级别、记录时间、事件来源、事件ID、事件描述、涉及的用户、计算机、操作代码及任务类别等。其中事件的ID与操作系统的版本有关,以下列举出的事件ID的操纵系统为Vista/Win7/Win8/Win10/Server2008/Server 2012及之后的版本:
事件ID |
说明 |
1102 |
清理审计日志 |
4624 |
账号成功登录 |
4625 |
账号登录失败 |
4768 |
Kerberos身份验证(TGT请求) |
4769 |
Kerberos服务票证请求 |
4776 |
NTLM身份验证 |
4672 |
授予特殊权限 |
4720 |
创建用户 |
4726 |
删除用户 |
4728 |
将成员添加到启用安全的全局组中 |
4729 |
将成员从安全的全局组中移除 |
4732 |
将成员添加到启用安全的本地组中 |
4733 |
将成员从启用安全的本地组中移除 |
4756 |
将成员添加到启用安全的通用组中 |
4757 |
将成员从启用安全的通用组中移除 |
4719 |
系统审计策略修改 |
表 常见Windows账户及相关事件对照表
五种事件类型中,最为重要的是成功审核(Success Audit),所有系统登录成功都会被标记成为成功审核。每个成功登录的事件都会标记一个登录类型:
登录类型 |
描述 |
2 |
交互式登录(用户从控制台登录) |
3 |
网络(例如:通过net use,访问共享网络) |
4 |
批处理(为批处理程序保留) |
5 |
服务启动(服务登录) |
6 |
不支持 |
7 |
解锁(带密码保护的屏幕保护程序的无人值班工作站) |
8 |
网络明文(IIS服务器登录验证) |
10 |
远程交互(终端服务,远程桌面,远程辅助) |
11 |
缓存域证书登录 |
表 登录类型
系统事件日志主要保存的类型为:*.evtx,*.xml,*.txt,*.csv。对于后三种文件格式已经比较了解,现在分析下evtx后缀额格式。事件日志(evtx)文件是一种二进制格式的文件。
使用Linux下的file命令 ,来识别文件类型或者编码类型(查看头部信息来获取文件类型)。
可参考的资料:
https://github.com/williballenthin/python-evtx
evtx文件是指Windows Vista之后用于保存系统日志信息的文件
evtx文件结构包含三部分:
file header
chunks
trailing empty values
file header保存evtx文件基本信息
chunks保存日志内容,包括具体每条日志的内容和校验和
trailing empty values为尾随空值,用于填充文件长度,内容任意,不会影响evtx文件的有效性
(1) file header
格式可参考:
https://github.com/libyal/libevtx/blob/master/documentation/Windows%20XML%20Event%20Log%20(EVTX).asciidoc#2-file-header
(2) chunks
格式可参考:
https://github.com/libyal/libevtx/blob/master/documentation/Windows%20XML%20Event%20Log%20(EVTX).asciidoc#3-chunk
chunks包含多个Event Record,1个Event Record对应一条日志信息
(3) Event Record
格式可参考:
https://github.com/libyal/libevtx/blob/master/documentation/Windows%20XML%20Event%20Log%20(EVTX).asciidoc#32-event-record
Event Record的内容以Binary XML格式保存
Binary XML格式可参考:
https://github.com/libyal/libevtx/blob/master/documentation/Windows%20XML%20Event%20Log%20(EVTX).asciidoc#4-binary-xml
值得注意的是EventRecordID标签,用来表示日志的顺序号
Windwos操作系统默认没有提供删除特定日志记录的功能,仅提供了删除所有日志的操作功能。也就意味着日志记录ID(Event Record ID)应该是连续的,默认的排序方式应该是从大到小往下排列。
通过对Windows事件日志的取证分析,取证人员可以对操纵系统、应用程序、服务、设备等操作行为记录,通过关键的时间点进行回溯。
分析事件记录格式后,了解到Windows系统在解析事件记录日志时,按照Event Record的大小逐条读取日志的内容。假设修改某条日志的长度,使长度覆盖下一条日志,理论上Windows系统解析日志时,就会跳过下一条日志,相当于下一条日志被”删除”。 DanderSpritz中的eventlogedit 就是这个思路,仅仅时修改了程度,实际上并没有删除日志内容。实现思路如下图:
为了确保修改后的日志文件能够被正确识别,还需要修改多个标志位和重新计算校验和。
为了确保不出现如上图所示的错误,总结一下删除单条日志内容的方法:
1. File Header中的Next recordidentifier的值减一(偏移量为24字节)
2. 重新计算File Header中CheckSum(偏移量为124字节)
3. 修改Event Record,找到需删除的记录和需删除前一条记录并计算日志的长度,更新Event Record的Event record identifier
4. 更新ElfChnk,需要修改的内容为:Last event record number,Last event recordidentifier,Last event record data offset,Event recordschecksum,Checksum
根据以上的方式进行删除单条日志是NAS方程式组织的DanderSpritz中的eventlogedit实现方式。实际上只是将信息进行了隐藏,在此基础上,将指定日志的内容清空,就能够实现真正的日志删除。
比如我们在windows日志中的系统类型日志中,查看事件ID为11的日志数据
安装python-evtx:
pip install python-evtx
下载脚本:
https://github.com/williballenthin/python-evtx/blob/master/scripts/evtx_record_structure.py
使用脚本分析日志:
evtx_record_structure.py System2.evtx 11
File header位于文件最开始的部分
Next record identifier的偏移为24(0x18h),长度8
对应测试文件System2.evtx,如下图
Next record identifier为07A9,转换成十六进制即1961
减1后为1960,即十六进制的07a8
计算方法: 前120字节做CRC32运算,偏移为124(0x7Ch),长度4
修改Next record identifier后的内容如下图
前120字节的内容为
import binascii
def crc2hex(crc):
return '%08x' % (binascii.crc32(binascii.a2b_hex(crc)) & 0xffffffff)
d='456C6646696C6500000000000000000000000000000000007B0700000000000080000000010003000010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
print(crc2hex(d))
通过搜索magic string 0x2A 0x2A 0x00 0x00定位不同的Event Record
第一条Event Record的内容如下图
长度为0x500
Event record identifier为0x001h 注意分区Event record identifier和EventID
第二条日志的长度 为0x118 如下图
0x500h+0x118h=0x618h
需要更新长度的地方在第一条的起始和第二条的尾部。
第一条
第二条尾部
如果我们删除的不是最后一条日志,我们还需要更新Event record identifier
搜索magic string ElfChuk
注:
有可能有多个ElfChuk,需要找到对应的ElfChuk
测试文件System.evtx只有一个ElfChuk
内容如下图
修改如下内容:
Last event record number减1,
Last event record identifier减1
Event records checksum的数据计算范围:chunk中的事件记录的偏移量是固定的,是从文件头偏移0×1200个字节,意思就是checksum的数据起始位置为0×1200。事件记录的结束位置的计算方式:chunk的起始块地址+ Free space offset= events records data。
Checksum的数据计算范围:是固定地址0×1000-0×1078,0×1080-0×1200 。
使用以上的方式删除单挑记录,其实被删除的数据并没有真正的被删掉,严格意义上讲就是将部分数据进行了隐藏。恢复原本的数据可以使用fox-it的danderspritz-evtx工具,原因就是用删除数据的思路反向恢复就行。使用该工具,确实可以将被删除的数据提取出来,不过恢复的evtx格式的文件并不能被打开。
工具使用如下图:
恢复数据被导出为xml格式文件,如下图:
恢复的evtx格式文件打开出错,如下图
如果需要将日志真正的删除,可以使用\x00填充被隐藏的数据部分填充。并重新计算相应的checksum。
系统日志删除思路参考链接:
https://blog.fox-it.com/2017/12/08/detection-and-recovery-of-nsas-covered-up-tracks/
系统日志文件格式参考链接:
https://github.com/libyal/libevtx/blob/master/documentation/Windows%20XML%20Event%20Log%20(EVTX).asciidoc#2-file-header
单条日志删除参考链接:
https://www.secpulse.com/archives/73273.html
posted @ 2019-04-11 21:54 卿先生 阅读(...) 评论(...) 编辑 收藏