[技术分享] 如何快速查找感染 Conficker 的客户端

作为 “蠕虫典范” 的Conficker,在企业客户中的影响比个人客户严重的多,原因是该蠕虫会枚举帐号名进行字典攻击,如果域内组策略设定密码失败阈值,多次密码错误失败就会导致域帐户锁定。当然,安全事件日志会记录下尝试密码验证失败的命令。但是,从茫茫数百兆的安全日志中找出密码认证失败的客户端,光用肉眼搜索不是一件容易的事。这篇博客主要帮助企业如何通过安全事件日志快速分析定位受感染的客户端。

先从 DC 上将安全日志导出为 .evt 文件(例如 security.evt),下面我们利用工具 logparser 对此 EVT 文件做分析,最终定位受感染的客户端。

1. 由于 .evt 格式便于导入事件查看器中逐个事件查看,但并不有助于分析,因此我们第一步需要将 .evt 格式转化成 .csv 格式,这样至少用 EXCEL 也可以正常打开。

LogParser.exe -i:evt -o:csv "select * into security.csv from security.evt"

2. 接着,我们将其中的所有 675 事件过滤出来。

LogParser.exe -i:csv -o:csv "select * into sec.csv from security.csv where eventid = 675"

3. 由于 675 事件表明的是域帐号在认证过程中由于密码错误导致预验证失败,详细信息中还会记录帐号的 IP 地址,这就给我们定位客户端提供了条件。

如果用事件查看器查看,一个 675 事件的详细信息如下:

Pre-authentication failed:

User Name: rifeng

User ID: %{S-1-5-21-1757981266-1500820517-1644491937-8802}

Service Name: krbtgt/contoso.COM

Pre-Authentication Type: 0x2

Failure Code: 0x12

Client Address: 192.168.142.24,

其中 User Name 告诉我们是哪个帐号验证失败,Client Address 表明那个帐号从哪个 IP 地址做密码验证。

如果希望得到受感染的客户端,我们可以有以下思路:

  • 过滤所有 675 事件,找到详细信息中的 Client Address关键字
  • 将冒号后面的字符串记录下来
  • 对所有的IP字符串做计数统计
  • 对总数排序
  • 撇除由于偶然因素导致的认证失败记录,如果发现有大量的失败计数,基本表明该客户端受到蠕虫感染。

以上思路中的 “找到详细信息中的 Client Address 关键字” “将冒号后面的字符串记录下来” 我们可以写一个脚本,jscript, vbscript 或者 perl,对文件进行查找比较过滤,但这会比较复杂。

4. 观察 .csv 格式中一条过滤出来的记录,可以找到一条事件的原始字符串 “rifeng|%{S-1-5-21-1757981266-1500820517-1644491937-8802}|krbtgt/contoso.COM|0x2|0x12|192.168.142.24” 每一个字段利用 “|” 分割,而每个字段都对应了详细信息中的一项,最后一个(第六个)正是 IP 地址。

security.csv,5, security.evt,8454220,2009-04-07 13:07:40,2009-04-07 13:07:40,675,16,Failure Audit event,9,Account Logon,Security,rifeng|%{S-1-5-21-1757981266-1500820517-1644491937-8802}|krbtgt/contoso.COM|0x2|0x12|192.168.142.24,RJDOMAINSRV2,S-1-5-18,Pre-authentication failed: User Name: rifeng User ID: %{S-1-5-21-1757981266-1500820517-1644491937-8802} Service Name: krbtgt/contoso.COM Pre-Authentication Type: 0x2 Failure Code: 0x12 Client Address: 192.168.142.24,

于是,我们可以利用 logparser,来处理这一个字段,利用 extract_token 分割字符串并找到第六个字段 IP 地址,免去了脚本的复杂。生成的 Ipaddr.csv 中包含了所有验证失败的客户端地址。

LogParser.exe -i:csv -o:csv "select extract_token( Strings, 5, '|') as ipaddress into ipaddr.csv from sec.csv"

5. 再次利用 logparser,对客户端地址统计计数并从高到低排序

LogParser.exe -i:csv -o:csv "select ipaddress, count(*) as hits into count.csv from ipaddr.csv group by ipaddress order by hits desc"

6. 最终得到了 IP 列表,如果发现某个IP有上百成千次事件 675 记录,基本可以判断该 IP 客户端受到蠕虫感染。

clip_image002[1]

这样,我们反复利用了 4 次 logparser 命令,迅速从事件日志得到了受感染客户端的 IP 地址。是不是节省了很多时间?

当然,更方便的话,我们可以将这 4 次 logparser 命令整合为一条命令,一箭中的。

LogParser.exe -i:evt -o:csv "select extract_token( Strings, 5, '|') as ipaddress, count (*) as hits into c3.csv from security.evt where eventid = 675 group by ipaddress order by hits desc "

关于 Logparser 工具可由以下链接获取:
https://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&displaylang=en

王超

微软安全支持专家