恶意软件的渗入、运行、传播一般都会在系统和网络中留下痕迹,这些痕迹翻译成计算机语言则包括了进程的创建、dll装载、网络连接、文件创建和更改、注册表启动项更改、服务与任务配置修改等信息, 通过Windows的sysmon监控这些痕迹,并实时传递给Splunk进行处理与关联分析,可以高效的识别出恶意或异常活动,理解网络中的入侵者和恶意行为.
一、前言
最近在学习Splunk机器数据分析工具,很想写一篇与Splunk相关的安全类课文,想了想,结合现在的恶意软件横行,还是写一点Splunk在windows 系统层面检测和防御恶意软件相关的文章:
恶意软件的渗入、运行、传播一般都会在系统和网络中留下痕迹,这些痕迹翻译成计算机语言则包括了进程的创建、dll装载、网络连接、文件创建和更改、注册表启动项更改、服务与任务配置修改等信息, 通过Windows的sysmon监控这些痕迹,并实时传递给Splunk进行处理与关联分析,可以高效的识别出恶意或异常活动,理解网络中的入侵者和恶意行为.
二、工具和软件
Splunk:Splunk是一个机器数据的引擎,可以收集、索引和分析所有应用程序、服务器和设备中实时生成的快速移动型计算机数据,我们称这种数据为机器数据,Splunk是机器数据的Google搜索引擎.
官网是: https://www.splunk.com
Splunk Add-on for Microsoft sysmon和 Splunk Add-on for Microsoft Windows:这两个插件是用于收集和处理Windows日志的,帮助Splunk理解这两种不同数据源所产生的数据。我们可以直接在Splunk软件中安装这些插件,并使用Splunk集中转发管理将插件自动部署到被监控的服务器.
Sysmon:Windows有一个轻量级的检测工具, 可以实时监控并记录系统活动并记录在Windows日志中(形成机器数据),监控的活动包括对进程的创建、dll装载、网络连接、文件创建和更改 。但Sysmon工具并不会帮助技术人员去分析恶意活动,他仅仅是跟踪和记录了恶意行为留下的痕迹,如果想要具体分析这些恶意活动,则需要一些能够针对恶意行为产生的数据进行整合、关联、分析的工具,本文中我们使用Splunk来实现这部分工作.
VriusTotal: 在线病毒检测网站,根据用户提供的文件、hashes、IP、域名分析恶意软件信息,包括文件类型、程序库函数、行为分析等。用户也可以通过RestFul API提交恶意软件分析请求, 需要申请apikey,有Public api key和Private api key两种,其中Public api key有请求次数的限制.
官网是https://www.virustotal.com/
Malware Hash Registry(HMR): 来自TEAM CYMRU公司的恶意软件Hash值检索的项目,支持通过whois和dig等网络工具查询指定hash的软件是否是恶意软件, 优点是没有请求次数限制,但获取到的恶意软件信息比较有限,详细的信息可以访问http://www.team-cymru.org/MHR.html
三、环境准备与配置
1、首先在被监控的Windows的服务器上安装sysmon, 其安装命令如下:
Install: Sysmon.exe -i <configfile>
[-h <[sha1|md5|sha256|imphash|*],...>] [-n [<process,...>]]
[-l (<process,...>)]
说明:
-i 加载xml配置文件
-n 监视网络
-l 监视指定进程
可以通过以下命令快速安装:
Install命令:sysmon64 -accepteula –i -n
2、优化sysmon的一些配置,排除对微软、Splunk相关可信程序的监控,减少不必须要的监控输出,本文中贴出我的配置文件.
Config命令: sysmon64 –accepteula -c:\windows\config.xml
————————————xml配置文件————————————
<Sysmon schemaversion="3.2">
<HashAlgorithms>*</HashAlgorithms>
<EventFiltering>
<!-- Log all drivers except if the signature -->
<!-- contains Microsoft or Windows -->
<DriverLoad onmatch="exclude">
<Signature condition="contains">microsoft</Signature>
<Signature condition="contains">windows</Signature>
</DriverLoad>
<!-- Exclude certain processes that cause high event volumes -->
<ProcessCreate onmatch="exclude">
<Image condition="contains">splunk</Image>
<Image condition="contains">streamfwd</Image>
<Image condition="contains">splunkd</Image>
<Image condition="contains">splunkD</Image>
<Image condition="contains">splunk</Image>
<Image condition="contains">splunk-optimize</Image>
<Image condition="contains">splunk-MonitorNoHandle</Image>
<Image condition="contains">splunk-admon</Image>
<Image condition="contains">splunk-netmon</Image>
<Image condition="contains">splunk-regmon</Image>
<Image condition="contains">splunk-winprintmon</Image>
<Image condition="contains">btool</Image>
<Image condition="contains">PYTHON</Image>
</ProcessCreate>
<ProcessTerminate onmatch="exclude">
<Image condition="contains">splunk</Image>
<Image condition="contains">streamfwd</Image>
<Image condition="contains">splunkd</Image>
<Image condition="contains">splunkD</Image>
<Image condition="contains">splunk</Image>
<Image condition="contains">splunk-optimize</Image>
<Image condition="contains">splunk-MonitorNoHandle</Image>
<Image condition="contains">splunk-admon</Image>
<Image condition="contains">splunk-netmon</Image>
<Image condition="contains">splunk-regmon</Image>
<Image condition="contains">splunk-winprintmon</Image>
<Image condition="contains">btool</Image>
<Image condition="contains">PYTHON</Image>
</ProcessTerminate>
<FileCreateTime onmatch="exclude">
<Image condition="contains">splunk</Image>
<Image condition="contains">streamfwd</Image>
<Image condition="contains">splunkd</Image>
<Image condition="contains">splunkD</Image>
<Image condition="contains">splunk</Image>
<Image condition="contains">splunk-optimize</Image>
<Image condition="contains">splunk-MonitorNoHandle</Image>
<Image condition="contains">splunk-admon</Image>
<Image condition="contains">splunk-netmon</Image>
<Image condition="contains">splunk-regmon</Image>
<Image condition="contains">splunk-winprintmon</Image>
<Image condition="contains">btool</Image>
<Image condition="contains">PYTHON</Image>
</FileCreateTime>
<!-- Log network connection if the destination port equal 137 OR 445-->
<NetworkConnect onmatch="include">
<DestinationPort condition="is">137</DestinationPort>
<DestinationPort condition="is">445</DestinationPort>
<SourcePort condition="is">445</SourcePort>
</NetworkConnect>
</EventFiltering>
</Sysmon>
3、安装Splunk Add-on for Microsoft sysmon和 Splunk Add-on for Microsoft Windows, 保持默认配置即可.
4、VriusTotal网站申请一个免费的Public API Key, 直接邮注册即可,成功后在自己的Profile中就可以找到Public Key, API详细手册可以参考https://www.virustotal.com/en/documentation/public-api/, 本文中用到的部分API代码如下所示:
5、编写恶意软件检测程序,实时判断当前内网被监控服务器上创建进程是否为恶意软件,通过Splunk的API实时获取服务器正在创建的进程哈希值,并根据Virustotal或HMR的恶意软件搜索接口,判断进程是否为恶意软件.
代码主要思路:
(1) 通过Splunk API语句获取被监控服务器上进程的hash值,其SPL语言为search index=wineventlog sourcetype="xmlwineventlog:microsoft-windows-sysmon/operational" EventCode=1 | stats count by md5
(2) 使用hash值在Virustotal或HMR中提交恶意软件搜索请求,如果匹配恶意软件,则将搜索结果更新到本地的Malware.CSV文件中进行记录,
(3)通过Splunk的关联分析,将Windows进程创建的事件与Malware.CSV进行关联分析,判断进程是否为恶意软件.
为避免重复向Virustotal和HMR中提交相同进程的搜索请求,建议程序仅提交未搜索请求过的进程.
四、具体实践
1、注册表启动项监控
恶意软件通常需要在系统中进行长期驻守,其常驻的方法有注册表启动、用户开机启动文件夹、系统服务、任务计划等,我们就拿注册表启动项来分析,Windows注册表启动项主要有以下三个:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
通过Splunk windows插件,我们可以分析和搜索Windows的注册表启动项变更事件,发现可疑进程,本例中进程(pid:2724)在注册表启动项中创建了一个子项(runonce), 紧跟其后在此子项中配置了一个键值(Certificates), 其值指向了用户本地应用目录的一个恶意软件,只要用户重启其PC,即可触发此恶意软件的攻击.
2、进程创建监控
通过Windows的sysmon监控服务器本地进程创建事件,并将事件转发到Splunk中进行索引和处理,我们可以快速搜索进程创建类的事件,其中EventCode=1即代表进程创建事件,通过与在线病毒查询网站Virustotal或HMR的关联分析,我们可以获取每个进程的可信情况, 以下截图我们发现,pid为2724的进程是勒索软件,在随后的1分钟和3分钟又分别执行了一次,这也印证了注册表启动项的分析.
3、关联分析出恶意软件感染情况
在上面介绍中我们已经确认了恶意软件进程,这些进程在系统中会创建子进程完成加密文件、外链控制、支付通道等工作,通过Splunk的关联分析,将父进程id与恶意进程id进行关联,我们可以快速获取这些子进程信息.
4、主动告警跟踪
为加快安全事件的响应速度,也可以将Splunk中的搜索定义为告警,通过自定义脚本或者邮件通知到技术人员.
5、全局视角去分析恶意软件事件
通过Splunk丰富的报表和仪表盘功能,可以帮助技术人员从宏观上了解恶意软件感染和分布情况.
五、扩展
本文中只是恶意软件检测方法中的一小部分,还有很多复杂的检测方法,Splunk也提供了一款专门检测、预防勒索软件的APP(Splunk Security Essentials for Ransomware),这款App的主要功能我们这里可以介绍一下:这款APP的免费下载地址为:https://splunkbase.splunk.com/app/3593
主要从三个层面来检测和预防勒索类软件,其要点是监控备份事件、注册表启动事件、SMB流量(445等网络活动)、恶意软件漏洞检测等等.
终端主要包括:
- 伪造windows进程
- 恶意命令执行
- 监控自动启动注册表
- 勒索文件名后缀
IT主要包括:
- 监控成功的备份
- 监控不成功的备份
- 监控成功的windows更新
- 监控不成功的Windows更新
- 恶意软件漏洞
网络主要包括:
- SMB流量监控
- TOR网络流量(洋葱路由)
小结:在预防恶意软件。特别是勒索类软件的威胁时,对重要级文件备份也是一个不可忽视的环节,做到有备无患,在应对恶意软件时才能胸有成竹.