对于windows日志的一点思考
摘要:最近没事翻翻windows日志,了解一下常见日志错误,然后了解下痕迹清理。然后发现windows日志算的上有用也算的上没用。因为windows日志太过繁杂,貌似也没啥用.......,但是不记录一下的话下次又忘了
配置安全审核策略
其中的审核登录事件和审核账户登录事件区别别问我,自己看 右键审核账户登录事件-属性-说明 查看,还看不懂的话自己看https://docs.microsoft.com/zh-cn/windows/security/threat-protection/auditing/basic-audit-account-logon-events。反正大概就是 “当域用户账户在域控制器上被验证时,会产生账户登录事件。该事件被记录在域控制器的安全日志中。当本地用户在本地计算机上被验证时,会产生登录事件。该事件被记录在本地安全日志中,由于凭据验证是无状态的,因此帐户登录事件没有相应的注销事件。” 反正我做的实验表示——使用本地账户去登录域中的计算机或者本地计算机时会触发审核账户登录事件4776,而4776应该是属于审核账户登录事件的,使用域账户登录域中的计算机不会触发审核账户登录事件4776,使用域控去登录域中的计算机也不会触发4776事件。至于使用域账户登录域控我没试过......
在windows命令行中运行auditpol /list /subcategory:* /r,可以查看图中策略的详细内容。
常见事件id
Event ID(2000/XP/2003) | Event ID(Vista/7/8/2008/2012) | 描述 | 日志名称 |
---|---|---|---|
517 | 1102 | 日志清除 | 安全 |
528 | 4624 | 用户成功登录,比如用户输错密码 | 安全 |
529 | 4625 | 用户失败登录 | 安全 |
552 | 4648 | 试图使用显式凭据登录 ,我用账户密码使用远程桌面登陆的时候就会出现这个日志 | 安全 |
576 | 4672 | 给新登录分配特权,例如管理员登录会被分配特权 | 安全 |
592 | 4688 | 进程创建 | 安全 |
624 | 4720 | 已创建用户帐户,当创建一个用户账户的时候就会记录这个日志 | 安全 |
626 | 4722 | 已启用用户帐户,当创建一个用户的时候,就会记录这个日志,因为创建用户后默认都是启用,不会有人勾选不启用吧...... | 安全 |
628 | 4724 | 试图重置帐户密码,比如在域控中重置账户密码 | 安全 |
632 | 4728 | 成员已添加至全局组。 | 安全 |
636 | 4732 | 成员已添加至本地组。 | 安全 |
642 | 4738 | 已更改用户帐户,具体更改了用户的哪些信息,比如重置密码,用户登录名 | 安全 |
无 | 4741 | 计算机账户管理,域中新加入或者新建一台计算机 | 安全 |
无 | 4743 | 计算机账户管理,域中脱离或者删除一台计算机 | 安全 |
672 | 4768 | 请求了Kerberos身份验证票证(TGT)[备注:已成功颁发和验证身份验证服务 (AS) 票证。] | 安全 |
673 | 4769 | 请求了Kerberos服务票证 [备注:授权票证服务 (TGS) 票证已授权。TGS 是由 Kerberos v5 票证授权服务 (TGS) 颁发的票证,允许用户对域中的特定服务进行身份验证。] | 安全 |
680 | 4776 | 验证帐户的凭据,比如登陆用户账户的时候就会有4776 | 安全 |
无 | 5140 | 网络共享对象被访问 | 安全 |
无 | 5145 | 具体访问了哪些文件 | 安全 |
无 | 104 | 日志清除 | 系统 |
无 | 6005 | EventLog事件日志服务已启动。(当事件日志服务正常启动的时候电脑肯定开机) | 系统 |
无 | 6006 | EventLog事件日志服务已停止。(当事件日志服务正常停止的时候电脑肯定关机) | 系统 |
无 | 6009 | 懒得找了,意会吧,当电脑非正常关机,比如直接拔电源,就会出现6009 | 系统 |
事件之间的关联:
文件共享
文件共享 与 安全审核策略 中的 审核对象访问 有关。当 审核对象访问 开启的时候才能审核到事件5140和5145。
(1)当在域中的一台电脑上开启文件共享,共享对象为domain users,然后 domain users访问文件共享里面的文件,文件服务器日志会记载以下事件4624 - 5140 - 5145 - 5145。4624事件是 domian users 登录 文件服务器 的信息
//4624事件详细信息 详细的身份验证信息: 登录进程: NtLmSsp 身份验证数据包: NTLM 传递的服务: - 数据包名(仅限 NTLM): NTLM V2 密钥长度: 128
5140事件详细信息为
//5140事件详细信息 已访问网络共享对象。
5145事件详细信息为
//5145事件详细信息 已检查网络共享对象是否可以授予客户端所需的访问权限。
5145事件详细信息为
//5145事件详细信息 共享信息: 共享名称: \\*\E 共享路径: \??\E:\ 相对目标名称: \新建文本文档 (2).txt
(2)当在公网上开启文件共享的时候,共享成员为Everyone,当访问共享文件夹时文件服务器日志会记载以下事件5140 - 5145 - 5145 ,与上面的基本差不多。
(3)当域外的电脑访问(1)中的文件共享的时候,会提示输入账号密码,输入域账号和密码后,这个时候会在文件服务器上生成4624事件,在域控上不会生成4768,4769两个事件。
创建一个用户并添加到管理员组
在windows命令行中运行下面命令net user USER PASSWORD /add net localgroup administrators USER /add
如果在域控上创建一个用户,则会在域控日志上记录。如果在一台普通计算机上记录,则会在本地计算机上记录。日志上会依次记录 4720 - 4722 - 4728 - 4732
4720事件表示已创建用户帐户。
4722事件表示已启用用户帐户。
4738事件表示已更改用户帐户。
4732事件表示用户被添加到本地组(实际上是添加到管理员组,管理员组属于本地组)。使用域账户登录域中的计算机
这个有点神奇,域用户在域机器上第一次登陆会先在域控中生成4624事件,也会在域计算机中生成4624事件,在域控上还是在域计算机上都不生成4768 4769两个事件。之后如果在用同一个域用户登陆同一台域计算机会在域控中依次生成4768 4769两个事件不会在域控中生成4624事件,但是会在域计算机中生成4624事件。第一次登陆在域控上生成的4624事件的详细信息为
详细的身份验证信息: 登录进程: Kerberos 身份验证数据包: Kerberos 传递的服务: - 数据包名(仅限 NTLM): - 密钥长度: 0
远程桌面进行登陆
公网环境下找了个用户然后使用远程桌面进行登陆,可以发现事件查看器中出现下列事件。至于是不是以时间顺序不敢说(ps我感觉是按下面的顺序),因为有的事件在上面事件管理器显示同一时间......4776 计算机试图验证帐户的凭据。验证包:MICROSOFT_AUTHENTICATION_PACKAGE_V1_0 4648 试图使用显式凭据登录。 登录ID:0x3e7 4672 为新登录分配了特殊权限 登录ID:0x1c8a797b7 4624 已成功登录帐户。登录ID:0x1c8a797b7
其中如果是一个全新的家庭版或者专业版Windows系统的话,上面四种事件事件查看器中默认只有4648这一种事件,要完整的查看4776、4648、4672、4624这四种事件,需要在安全审核策略中进行配置。
- 开关机
电脑正常开机会出现事件6005,电脑正常关机会出现事件6006,电脑异常关机如断电会出现事件6009。 进程创建
Win+R打开运行,输入“CMD”,回车运行“ipconfig”。在事件查看器中就会出现4688 - 4688 - 4689 事件。4688 事件
\\4688事件详细信息 已创建新进程。 进程信息: 新进程 ID: 0x1aa8 新进程名称: C:\Windows\System32\conhost.exe 令牌提升类型: %%1938 强制性标签: Mandatory Label\Medium Mandatory Level 创建者进程 ID: 0x8d4 创建者进程名称: C:\Windows\System32\cmd.exe 进程命令行:
4688事件
\\4688事件详细信息 已创建新进程。 进程信息: 新进程 ID: 0x838 新进程名称: C:\Windows\System32\ipconfig.exe 令牌提升类型: %%1938 强制性标签: Mandatory Label\Medium Mandatory Level 创建者进程 ID: 0x8d4 创建者进程名称: C:\Windows\System32\cmd.exe 进程命令行:
4689事件
\\4689详细信息 已退出进程。 进程信息: 进程 ID: 0x838 进程名: C:\Windows\System32\ipconfig.exe 退出状态: 0x0
登陆类型
登录类型 | 登录类型 | 描述 |
---|---|---|
2 | 交互式登录(Interactive) | 就是指用户在计算机的控制台上进行的登录,也就是在本地键盘上进行的登录。不是很常见,我没见过有意义的。 |
3 | 网络(Network) | 最常见的是访问网络共享文件夹或打印机。另外大多数情况下通过网络登录IIS时也被记为这种类型,但基本验证方式的IIS登录是个例外,它将被记为类型8。 |
4 | 批处理(Batch) | 当Windows运行一个计划任务时,“计划任务服务”将为这个任务首先创建一个新的登录会话以便它能在此计划任务所配置的用户账户下运行,当这种登录出现时,Windows在日志中记为类型4,对于其它类型的工作任务系统,依赖于它的设计,也可以在开始工作时产生类型4的登录事件,类型4登录通常表明某计划任务启动,但也可能是一个恶意用户通过计划任务来猜测用户密码,这种尝试将产生一个类型4的登录失败事件,但是这种失败登录也可能是由于计划任务的用户密码没能同步更改造成的,比如用户密码更改了,而忘记了在计划任务中进行更改。 |
5 | 服务(Service) | 与计划任务类似,每种服务都被配置在某个特定的用户账户下运行,当一个服务开始时,Windows首先为这个特定的用户创建一个登录会话,这将被记为类型5,失败的类型5通常表明用户的密码已变而这里没得到更新。 |
7 | 解锁(Unlock) | 很多公司都有这样的安全设置:当用户离开屏幕一段时间后,屏保程序会锁定计算机屏幕。解开屏幕锁定需要键入用户名和密码。此时产生的日志类型就是Type 7。 |
8 | 网络明文(NetworkCleartext) | 通常发生在IIS 的 ASP登录。不推荐。 |
9 | 新凭证(NewCredentials) | 通常发生在RunAS方式运行某程序时的登录验证。 |
10 | 远程交互(RemoteInteractive) | 通过终端服务、远程桌面或远程协助访问计算机时,Windows将记为类型10,以便与真正的控制台登录相区别,注意XP之前的版本不支持这种登录类型,比如Windows2000仍然会把终端服务登录记为类型2。 |
11 | 缓存交互(CachedInteractive) | 在自己网络之外以域用户登录而无法登录域控制器时使用缓存登录。默认情况下,Windows缓存了最近10次交互式域登录的凭证HASH,如果以后当你以一个域用户登录而又没有域控制器可用时,Windows将使用这些HASH来验证你的身份。 我在我自己的电脑上也发现了缓存登录。 |
登录类型为2的4624事件,我没找到
当NT AUTHORITY\SYSTEM 用户登陆时,可以在相应的4624事件中发现登陆类型为5
在键盘上按win + l,然后输入pin码,可以在相应的4624事件中发现登陆类型为7和11,一个登录出现两种登录类型,奇怪
使用远程桌面登录电脑的时候,可以在相应的4624事件中发现登陆类型为3和10,一个登录出现两种登录类型,奇怪
一些脚本
以下脚本均需要使用log parser,运行log parser时候最好使用管理员权限运行,否则可能会出现奇奇怪怪的问题。其实上面的都没啥用......真正有用的是下面的......
windows专业版查询登陆失败的用户
LogParser -i:EVT -o:DATAGRID "select TimeGenerated as LoginTime,EXTRACT_TOKEN(Strings,5,'|') as username, EXTRACT_TOKEN(Strings, 13, '|') as Workstation, EXTRACT_TOKEN(Strings,10,'|') as LogonType, EXTRACT_TOKEN(Strings, 19, '|') as SourceIP, EXTRACT_TOKEN(Strings, 20, '|') as SourcePort,EXTRACT_TOKEN(Strings, 12, '|') as AuthenticationMethod,EXTRACT_TOKEN(Strings, 17, '|') as ProcessRequestID,EXTRACT_TOKEN(Strings, 18, '|') as ProcessRequestName from yours.evtx where eventid=4625 and username not like '%$'"
windows服务器版查询登陆失败的账户
LogParser -i:EVT -o:DATAGRID "select TimeGenerated as LoginTime,EXTRACT_TOKEN(Strings,5,'|') as username,EXTRACT_TOKEN(Strings,6,'|') as yu, EXTRACT_TOKEN(Strings,10,'|') as LogonType, EXTRACT_TOKEN(Strings, 13, '|') as Workstation, EXTRACT_TOKEN(Strings, 19, '|') as SourceIP, EXTRACT_TOKEN(Strings, 20, '|') as SourcePort,EXTRACT_TOKEN(Strings, 12, '|') as AuthenticationMethod,EXTRACT_TOKEN(Strings, 17, '|') as ProcessRequestID,EXTRACT_TOKEN(Strings, 18, '|') as ProcessRequestName from yours.evtx where eventid=4625 and username not like '%$'"
windows专业版和服务器版通用查询账户登录失败次数
LogParser -i:EVT -o:DATAGRID "SELECT EXTRACT_TOKEN(Message,19,' ') as user,count(user) as count FROM yours.evtx where eventid=4625 and user not like '%$' GROUP BY user ORDER BY count(user) desc"
windows专业版和服务器版通用查询登录成功的账户,这个可以查询所有类型的登录
LogParser -i:EVT -o:DATAGRID "select TimeGenerated as LoginTime,EXTRACT_TOKEN(Strings,5,'|') as username,EXTRACT_TOKEN(Strings,6,'|') as yu, EXTRACT_TOKEN(Strings,8,'|') as LogonType, EXTRACT_TOKEN(Strings, 11, '|') as Workstation,EXTRACT_TOKEN(Strings, 18, '|') as SourceIP, EXTRACT_TOKEN(Strings, 19, '|') as SourcePort,EXTRACT_TOKEN(Strings, 10, '|') as AuthenticationMethod,EXTRACT_TOKEN(Strings, 16, '|') as ProcessRequestID,EXTRACT_TOKEN(Strings, 17, '|') as ProcessRequestName from yours.evtx where eventid=4624 and username not like '%$' "
windows专业版和服务器版通用查询登录成功的账户,这个可以查询所有类型的登录
据说下面这个在面对日志量大的情况下速度会很快,来自一位大佬Param ( [string]$evtx = $pwd.Path+"\log.evtx" ) $time=Get-Date -Format h:mm:ss $evtx=(Get-Item $evtx).fullname $outfile=(Get-Item $evtx).BaseName+".csv" $logsize=[int]((Get-Item $evtx).length/1MB) write-host [+] $time Load $evtx "("Size: $logsize MB")" ... -ForegroundColor Green [xml]$xmldoc=WEVTUtil qe $evtx /q:"*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (EventID=4624 or EventID=4625)] and EventData[Data[@Name='LogonType']='3'] or EventData[Data[@Name='LogonType']='10']]" /e:root /f:Xml /lf $xmlEvent=$xmldoc.root.Event function OneEventToDict { Param ( $event ) $ret = @{ "SystemTime" = $event.System.TimeCreated.SystemTime | Convert-DateTimeFormat -OutputFormat 'yyyy"/"MM"/"dd HH:mm:ss'; "EventID" = $event.System.EventID } $data=$event.EventData.Data for ($i=0; $i -lt $data.Count; $i++){ $ret.Add($data[$i].name, $data[$i].'#text') } return $ret } filter Convert-DateTimeFormat { Param($OutputFormat='yyyy-MM-dd HH:mm:ss fff') try { ([DateTime]$_).ToString($OutputFormat) } catch {} } $time=Get-Date -Format h:mm:ss write-host [+] $time Extract XML ... -ForegroundColor Green [System.Collections.ArrayList]$results = New-Object System.Collections.ArrayList($null) for ($i=0; $i -lt $xmlEvent.Count; $i++){ $event = $xmlEvent[$i] $datas = OneEventToDict $event $results.Add((New-Object PSObject -Property $datas))|out-null } $time=Get-Date -Format h:mm:ss write-host [+] $time Dump into CSV: $outfile ... -ForegroundColor Green $results | Select-Object SystemTime,IpAddress,TargetDomainName,TargetUserName,EventID,LogonType | Export-Csv $outfile -NoTypeInformation -UseCulture -Encoding Default -Force
把代码保存为1.ps1,然后和要分析的日志文件放到同一个文件夹中,并且将日志名称命名为log.evtx,脚本运行完后会在同目录下生成log.csv。
windows专业版和服务器版通用查询登录成功的账户,这个只能查询以账号密码形式的登录
LogParser -i:EVT -o:DATAGRID "select TimeGenerated as LoginTime,EXTRACT_TOKEN(Strings,5,'|') as username, EXTRACT_TOKEN(Strings,6,'|') as yu, EXTRACT_TOKEN(Strings, 12, '|') as SourceIP, EXTRACT_TOKEN(Strings, 13, '|') as SourcePort,EXTRACT_TOKEN(Strings, 10, '|') as ProcessRequestID,EXTRACT_TOKEN(Strings, 11, '|') as ProcessRequestName from yours.evtx where eventid=4648 and username not like '%$' "
windows专业版和服务器版通用查询某个时间段内登录成功的账户,这个可以查询所有类型的登录
LogParser -i:EVT -o:DATAGRID "select TimeGenerated as LoginTime,EXTRACT_TOKEN(Strings,5,'|') as username,EXTRACT_TOKEN(Strings,6,'|') as yu, EXTRACT_TOKEN(Strings,8,'|') as LogonType, EXTRACT_TOKEN(Strings, 11, '|') as Workstation,EXTRACT_TOKEN(Strings, 18, '|') as SourceIP, EXTRACT_TOKEN(Strings, 19, '|') as SourcePort,EXTRACT_TOKEN(Strings, 10, '|') as AuthenticationMethod,EXTRACT_TOKEN(Strings, 16, '|') as ProcessRequestID,EXTRACT_TOKEN(Strings, 17, '|') as ProcessRequestName from yours.evtx where eventid=4624 and username not like '%$' and TimeGenerated between timestamp('2021-04-01','yyyy-MM-dd') and timestamp('2021-04-18', 'yyyy-MM-dd') "
或者用下一个也行
//查看从2021-04-01到2021-04-08登录成功的用户名 LogParser -i:EVT -o:DATAGRID "select TimeGenerated as LoginTime,EXTRACT_TOKEN(Strings,5,'|') as username from yours.evtx where eventid=4624 and username not like '%$' and TimeGenerated between timestamp('2021-04-01','yyyy-MM-dd') and timestamp('2021-04-18', 'yyyy-MM-dd') "
windows专业版和服务器版通用查询某个时间段内创建的进程
LogParser.exe -i:EVT –o:DATAGRID "SELECT TimeGenerated as Creationtime,EXTRACT_TOKEN(Strings,1,'|') as creator,EXTRACT_TOKEN(Strings, 2, '|') as Workstation ,EXTRACT_TOKEN(Strings,7,'|') as CreateProcessId, EXTRACT_TOKEN(Strings,13,'|') as CreateProcessName, EXTRACT_TOKEN(Strings,4,'|') as NewProcessId, EXTRACT_TOKEN(Strings,5,'|') as NewProcessName FROM Security where EventID=4688 and TimeGenerated between timestamp('2021-04-01','yyyy-MM-dd') and timestamp('2021-04-18', 'yyyy-MM-dd') "
导出结果
如果要把结果保存到MyOutput.csv文件中可以使用 into MyOutput.csv 例如:LogParser -i:EVT "select TimeGenerated as LoginTime,EXTRACT_TOKEN(Strings,5,'|') as username, EXTRACT_TOKEN(Strings,6,'|') as yu, EXTRACT_TOKEN(Strings, 12, '|') as SourceIP, EXTRACT_TOKEN(Strings, 13, '|') as SourcePort,EXTRACT_TOKEN(Strings, 10, '|') as ProcessRequestID,EXTRACT_TOKEN(Strings, 11, '|') as ProcessRequestName into MyOutput.csv from yours.evtx where eventid=4648 and username not like '%$' "
一些补充
查询域管理员组最近是否被添加或者修改,注意需要使用powershell运行
repadmin /showmeta "CN=Domain Admins,CN=Users,DC=test,DC=local"
注意看里面的上次修改时间列以及可分辨名称进行判断。
上次修改时间:记录了
最后一次修改该账号的时间
。
可分辨名称:记录了存在(present)
或者不存在(absent)
。存在(present)
说明账号被加入域管理员组,不存在(absent)
说明账号被移除域管理员组。
然后结合Event ID(4728)分析即可。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
谢谢,学习到了很多
谢谢,很有用