电子取证-Windows日志分析

发布 : 2020-12-08

本文首发i春秋,未经允许禁止转载

前言

在上节Windows取证基础中简单介绍了取证的分类以及内存取证的基础知识,在取证中,不仅仅是通过内存进行取证,还可以在其他方向进行信息提取,下面将通过对日志文件的分析,来进一步了解Windows取证的相关知识,这里所说的日志文件也就是Windows中自带的日志记录程序生成的文件,其中记录着Windows系统及其各种服务运行的细节,如各种系统服务的启动、运行、关闭等信息,它是用于帮助系统管理员在其计算机上发现并解决问题,另外它对于取证和应急响应起着非常重要的作用。

日志简介

Windows系统默认以二进制XML Windows事件日志记录格式(由.evtx扩展名指定)将日志存储在%SystemRoot%\System32\Winevt\logs目录中。日志也可以使用日志订阅远程存储。对于远程日志记录,运行Windows Event Collector服务的远程系统订阅其他系统生成的日志。

日志类型

不同类型的日志放在不同的位置,这里主要介绍三种日志,应用程序日志、安全日志以及系统日志,其中这三种日志记录的位置和记录信息如下

日志类型 日志位置 存储内容
安全日志 %SystemRoot%\System32\Winevt\Logs\Security.evtx 记录系统的安全审计事件,包含各种类型的登录日志、对象访问日志、进程追踪日志、特权使用、帐号管理、策略变更、系统事件。安全日志也是调查取证中最常用到的日志。
系统日志 %SystemRoot%\System32\Winevt\Logs\System.evtx 记录操作系统组件产生的事件,主要包括驱动程序、系统组件和应用软件的崩溃以及数据丢失错误等
应用程序日志 %SystemRoot%\System32\Winevt\Logs\Application.evtx 包含由应用程序或系统程序记录的事件,主要记录程序运行方面的事件,例如数据库程序可以在应用程序日志中记录文件错误,程序开发人员可以自行决定监视哪些事件。

默认设置下,安全性日志是关闭的,管理员可以使用组策略来启动安全性日志,或者在注册表中设置审核策略,以便当安全性日志满后使系统停止响应。

事件ID字段

  • Log Name:存储事件的事件日志的名称,在处理从同一系统提取的大量日志时很有用。
  • Source:生成事件的服务,Microsoft组件或应用程序。
  • Event ID:分配给每种已审计活动类型的代码。
  • Level:分配给相关事件的严重性。
  • User:在记录事件时,触发活动或源正在运行的用户上下文的用户帐户。注意,该字段通常表示“系统”而不是记录事件原因的用户
  • OpCode:由生成日志的源分配
  • Logged:记录事件的本地系统日期和时间
  • Task Category:由生成日志的源分配
  • keywords:用于对事件进行分组或排序。
  • Computer:记录事件的计算机。当检查从多个系统收集的日志时,此功能很有用,但不应被视为导致事件的设备
  • Description:一个文本块,其中记录了特定于所记录事件的其他信息,对于取证人员来说,这通常是最重要的字段。

image.png

查看本地日志

有的Windows系统的审核功能在默认状态下并没有启用,建议开启审核策略,若日后系统出现故障、安全事故则可以查看系统的日志文件,排除故障,追查入侵者的信息等。按照如下方法设置

设置方法:**开始 → 管理工具 → 本地安全策略 → 本地策略 → 审核策略**

image.png

Windows在默认状态下,也会记录一些简单的日志,日志默认大小 20M,在Windows上可以通过使用Win+R打开运行框,输入eventvwr.msc打开事件查看器,当使用默认的审核策略时,显示的日志内容仅仅是一些简单的内容,当修改审核策略之后,日志记录的内容会有所增加

image.png

对于Windows事件日志分析,不同的EVENT ID代表了不同的意义,下面是一下常用到的事件ID

事件ID 说明
1102 审核日志已清除
1104 安全日志现已满
4608 Windows正在启动
4609 Windows正在关闭
4616 系统时间已更改。
4625 帐户无法登录
4624 帐户已成功登录
4634 帐户已注销
4647 用户启动的注销
4672 使用超级用户(如管理员)进行登录
4720 创建用户
4657 注册表值已修改
4741 已创建计算机帐户
4742 计算机帐户已更改
4743 计算机帐户已删除

在打开事件查看器后,你可能会发现其中记录了很多发生的错误事件,但是在使用计算机的过程中并没有感知到,这是因为一些错误在后来的启动中进行了自我纠正。

账户登录和登录事件

帐户登录是Microsoft的身份验证术语。登录是用于指代获得资源访问权限的帐户的术语。帐户登录和登录事件都将记录在安全事件日志中。域帐户的身份验证(帐户登录)由Windows网络中的域控制器执行。本地帐户(那些存在于本地SAM文件中而不是作为Active Directory一部分的帐户)由它们所在的本地系统进行身份验证。帐户登录事件将由执行身份验证的系统记录。组策略可以轻松设置帐户登录和登录事件的审核。随着新版本Windows的发布,Microsoft默认继续启用更多日志记录,管理员应定期查看其审核策略,以确保系统能记录更多有效日志。

登录事件将在事件描述中包含类型代码。该代码的含义如下:

登录类型 描述
2 交互式,例如在系统的键盘和屏幕上登录,或使用第三方远程访问工具(如VNC)进行远程登录。这种类型的登录将在会话期间将用户的凭据缓存在RAM中,并且可能将用户的凭据缓存在磁盘上。
3 网络(即从网络上的其他位置连接到此计算机上的共享文件夹)。这表示非交互式登录,它不会在RAM或磁盘上缓存用 户的凭据。
4 批处理(即计划任务)批处理登录类型由批处理服务器使用,其中进程可以代表用户执行而无需其直接干预
5 服务(服务由服务控制管理器启动)
7 解锁(即具有密码保护的屏幕)
8 NetworkCleartext用户从网络登录到此计算机。用户密码以未加密的形式传递到身份验证程序包。内置身份验证将所有哈希 凭据打包,然后再通过网络发送它们。凭据不会以纯文本(也称为明文)遍历网络。最常表示使用“基本身份验证”登录IIS。
9 NewCredentials(例如,具有RunAs或具有备用凭据的网络驱动器映射)。此登录类型似乎未在任何事件中显示。如果要 跟踪尝试使用备用凭据登录的用户,请查找事件ID 4648。
10 RemoteInteractive(终端服务,远程桌面或远程协助)。有关更多详细信息,请参见本节末尾的有关RDP的注释。
11 CachedInteractive(使用缓存的域凭据登录,例如在离开网络时登录到便携式计算机时)没有联系域控制器来验证凭据

在这里需要注意的是关于尝试登录系统的远程主机。据所涉及的系统,通过RDP失败的登录可能会记录为Type 3而不是Type 10

可以通过查询事件描述的故障信息部分来确定有关故障原因的更多信息。在此处找到的状态码提供了有关事件的其他详细信息,如下图

image.png

图中得到的状态码为0x000006a,可以通过下面的表来查询不同的状态码代表的信息

状态码 描述
0xC0000064 用户名不存在
0xC000006A 用户名正确但是密码错误
0xC0000234 用户被锁定
0xC0000072 账户被禁用
0xC000006F 用户尝试在他的星期几或一天中的时间限制之外登录
0xC0000070 工作站限制或违反身份验证策略的情况(在域控制器上查找事件ID 4820)
0xC0000193 帐户到期
0xC0000071 密码过期
0xC0000133 DC与其他计算机之间的时钟太不同步
0xC0000224 用户需要在下次登录时更改密码
0xC0000225 Windows发生错误,没有风险
0xc000015b 用户尚未在此计算机上被授予请求的登录类型(也称为登录权限)

根据表中的信息,可以看到,当前事件的状态码对应的是用户名正确但是密码错误

FTP爆破实例

在这里靶机开启了FTP服务,攻击机对其用户密码进行了爆破 并进行了登录

通过查看日志,可以看到有大量的登录记录,并且登录失败,这里初步猜测是靶机遭到了爆破

image.png

通过使用事件查看器的筛选日志,可以筛选出登录失败的次数,打开事件查看器,选择右侧的筛选当前日志

image.png

在所有事件ID处写入要过滤的事件ID,根据上面表中的内容我们可知,4625为登录失败,4624为登录成功,我们填入4624点击确定,可以看到有2097个失败记录

image.png

筛选4624可以看到有几次登录成功的记录

image.png

这里为了便于分析,将日志保存下来用其他工具进行分析,首先选择清除筛选器,保证保存的是完整的日志,然后选择将所有事件另存为,选择一个位置保存下来

Log Parser Lizard介绍以及使用

一款强大好用的日志分析工具,使用这款软件可以方便用户对服务器日志、网站日志等进行直观用户的分析,支持基于文本的日志文件、XML 文件、CSV(逗号分隔符)文件以及注册表、文件系统等内容,它可以把相应的分析结果以图形的形式展现出来,大大地方便了运营人员,有需要的不要错过。您的计算机记录了几乎所有发生在幕后的操作,即使它并不总是在可访问的地方显示这些信息。系统事件、错误和许多其他此类活动由操作系统记录和保存,以防您需要解决某个问题,并且您必须确切地知道您的计算机在特定时间在做什么。日志分析蜥蜴使您能够跟踪这些信息,并查看详细的报告,无论何时您想知道有关您的系统的状态。您的计算机记录了几乎所有发生在幕后的操作,即使它并不总是在可访问的地方显示这些信息。系统事件、错误和许多其他此类活动由操作系统记录和保存,以防您需要解决某个问题,并且您必须确切地知道您的计算机在特定时间在做什么。日志分析使您能够跟踪这些信息,并查看详细的报告,无论何时您想知道有关您的系统的状态。

下载后打开软件,可以看到主界面,这里选择打开文件,选择之前我们导出的日志文件

image.png

然后就进入到了编写查询语句的界面,这里默认的语句是查询前100条内容,然后我们可以在这里写上自己的语句进行查询image.png

这里查询一下登录失败的事件,也就是EventID为4625的事件

1
SELECT * FROM 'D:\crack.evtx' WHERE EventID=4625

然后点击右上角的运行按钮,等执行完毕就可以点击右侧的Result Grid查看结果

image.png

上面查询的是所有内容,这里只查询我们想知道的内容,先看语句和结果

1
SELECT EXTRACT_TOKEN(Strings,10,'|') AS type ,EXTRACT_TOKEN(Strings,5,'|') AS Username,count(EXTRACT_TOKEN(Strings,5,'|')) AS times FROM 'D:\crack.evtx' WHERE EventID=4625 group by Username,type

image.png

这里显示攻击者使用w4rnIn9这个用户名爆破了1125次,使用到的登录类型是网络明文

下面对上面使用到的sql语句进行讲解, EXTRACT_TOKEN 函数是对字符串进行分割,用法是 EXTRACT_TOKEN(列名,字段数,'分隔符') ,这里使用的第5个字段是尝试登录的用户名,第10个字段是登录的类型, count() 函数会返回指定列的数目,GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。那么这里这个语句就很好理解了,就是查询出尝试登录的用户名并计数,然后根据登录类型和用户名进行分组。

下面查询登录成功的事件

1
SELECT EXTRACT_TOKEN(Strings,5,'|') AS Username,count(EXTRACT_TOKEN(Strings,5,'|')) FROM 'D:\crack.evtx' WHERE EventID=4624 GROUP BY Username

image.png

可以看到攻击者登录成功了两次

那么根据上面使用的登录方式,可以大概推断出尝试登录的是FTP,经过查看,靶机确实开启了FTP,这里仅仅记录的登录成功和失败的信息,详细信息可以查看FTP的日志,FTP日志的位置在 %systemroot%/system32/logfiles/msftpsvc1/ 默认每天一个日志,将得到的日志拿出来,在Log Parser Lizard中打开,执行默认的查询语句可以看到其中的字段和内容image.png

其中对于各种操作,FTP也有特定的状态码

状态码 说明
150 文件状态良好,打开数据连接
200 命令成功
202 命令未实现
211 系统状态或系统帮助响应
212 目录状态
213 文件状态
214 帮助信息,信息仅对人类用户有用
215 名字系统类型
220 对新用户服务准备好
221 服务关闭控制连接,可以退出登录
225 数据连接打开,无传输正在进行
226 关闭数据连接,请求的文件操作成功
227 进入被动模式
230 用户登录
250 请求的文件操作完成
257 创建”PATHNAME”
331 用户名正确,需要口令
332 登录时需要帐户信息
350 请求的文件操作需要进一步命令
421 连接用户过多
425 不能打开数据连接
426 关闭连接,中止传输
450 请求的文件操作未执行
451 中止请求的操作:有本地错误
452 未执行请求的操作:系统存储空间不足
500 格式错误,命令不可识别
501 参数语法错误
502 命令未实现
503 命令顺序错误
504 此参数下的命令功能未实现
530 账号或密码错误
532 存储文件需要帐户信息
550 未执行请求的操作
551 请求操作中止:页类型未知
552 请求的文件操作中止,存储分配溢出
553 未执行请求的操作:文件名不合法

因此可以通过状态码来筛选结果,例如这里大致统计登录失败的用户和次数

1
SELECT cs-uri-stem,count(cs-uri-stem) AS times FROM 'D:\u_ex201122.log' where cs-uri-stem <> '***' and cs-uri-stem <> '""' GROUP BY cs-uri-stem order by times desc

image.png

可以看到这里主要对这些用户进行了爆破,下面通过查询事件,查询出登录后的用户进行了哪些操作

1
SELECT cs-method,cs-uri-stem,sc-status,x-fullpath FROM 'D:\u_ex201122.log' WHERE cs-username = 'test-PC\w4rnIn9'
cs-method cs-uri-stem sc-status x-fullpath
PASS *** 230 /
opts utf8+on 200
syst 215
site help 214
PWD 257
PASS *** 230 /
opts utf8+on 200
syst 215
site help 214
PWD 257
TYPE A 200
PASV 227
DataChannelOpened
DataChannelClosed
LIST 226 /
ControlChannelClosed
noop 200
CWD / 250 /
noop 200
CWD / 250 /
PWD 257
CWD / 250 /
TYPE I 200
PASV 227
DataChannelOpened
SIZE secret.txt 213 /secret.txt
DataChannelClosed
RETR secret.txt 226 /secret.txt

可以看到攻击者在登录后,下载了secret.txt文件,这里通过整个分析过程,就梳理出了攻击者的攻击流程,首先攻击者通过ftp账户爆破,获取了w4rnIn9的用户密码,然后登录ftp服务器,下载了secret.txt文件

远程桌面爆破实例

本实例中模拟通过日志发现异常登陆者信息的过程,在查看日志时,发现大量登录失败事件,查看详情

image.png

使用Log Parse Lizard分析

推测可能是远程桌面登录,于是将日志导出,用Log Parse Lizard进行分析,这里直接查询远程桌面的登录ip

1
SELECT TimeGenerated AS Date, EXTRACT_TOKEN(Strings, 8, '|') as LogonType, EXTRACT_TOKEN(Strings, 18, '|') AS SourceIP, EXTRACT_TOKEN(Strings, 19, '|') AS Sport FROM 'D:\rdp.evtx' WHERE EventID = '4624' AND SourceIP NOT IN ('';'-') AND LogonType = '10' ORDER BY timegenerated DESC

image.png

这里远程桌面的常用ip是 192.168.233.1 出现了一个异常登录ip,下面查询异常登录的用户

1
SELECT TimeGenerated AS Date, EXTRACT_TOKEN(Strings, 8, '|') as LogonType, EXTRACT_TOKEN(Strings, 18, '|') AS SourceIP, EXTRACT_TOKEN(Strings, 5, '|') AS Username FROM 'D:\rdp.evtx' WHERE EventID = '4624' AND SourceIP  IN ('192.168.233.128') AND LogonType = '10' ORDER BY timegenerated DESC

image.png

这里就能查询到异常登录的用户和ip了

远程桌面爆破防护

添加安全策略

管理员可以通过帐户锁定策略保护主机免受暴力破解攻击,在管理工具 >本地安全策略> 帐户策略 > 帐户锁定策略中配置下面的几个策略

帐户锁定持续时间:用于定义锁定帐户保持时间段的策略,直到自动解锁或由管理员重置。当用户超过帐户锁定阈值设置的登录尝试时,它将锁定帐户指定的时间。

帐户锁定阈值:定义失败登录尝试次数的策略,将在帐户锁定持续时间指定的某段时间内锁定帐户。它将允许最大数量指定尝试登录您的帐户。

被锁账户锁定计数器:用于定义登录尝试失败后必须经过的时间段的策略。重置时间必须小于或等于帐户锁定时间。

具体设置的次数和时间根据实际情况定,这里只给出一个实例

image.png

端口修改

可以修改默认的远程登录端口,用来防止一般攻击者和暴力破解,需要在注册表中进行修改

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp下的Portnumber,双击它进行修改,这里使用的是十六进制,默认是d3d,把想要修改成的端口号转换为16进制,替换这里的值选择确定就可以了,这里替换为1a0c

image.png

重启计算机后可以看到3389端口变为了6668端口

image.png

总结

这里仅仅是简单介绍了一些日志分析用到的事件ID、状态码、类型码等,并通过两个实例介绍了简单的日志分析和日志分析工具Log Parser Lizard的使用,实际要通过日志准确分析出恶意行为是需要大量实践经验的,同样也需要了解Windows日志中各种事件ID组合、状态码所对应的事件。

参考

https://developer.aliyun.com/article/452517

https://bypass007.github.io/Emergency-Response-Notes/LogAnalysis/%E7%AC%AC1%E7%AF%87%EF%BC%9AWindow%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90.html

https://ponderthebits.com/2018/02/windows-rdp-related-event-logs-identification-tracking-and-investigation/

https://cloud.tencent.com/developer/article/1689545

本文作者 : W4rnIn9
原文链接 : http://joner11234.github.io/article/4824f591.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!