基本原理

  通过suricata实现对网络流量的实时文件提取,并通过logstash实时将文件路径和文件信息传输给yara检查接口,yara检查接口通过调用yara规则实现对文件的实时检测。

Suricata文件提取

  Suricata本身支持文件提取功能,只需要配置suricata.yaml中相关的配置项,并构建相应的文件提取规则,Suricata即可基于规则实现对网络流量的文件提取。具体的配置过程可参考Suricata官方文档的File Extraction部分: https://suricata.readthedocs.io/en/latest/file-extraction/file-extraction.html

logstash日志采集

  logstash在其中主要起到日志采集的功能,用于采集Suricata生成的文件日志信息并输出到文件检测端,用其他日志采集方法代替也可以,例如轻量化的filebeat。

yara规则匹配

  YARA是一个旨在帮助恶意软件研究人员识别和分类恶意软件样本的工具。使用YARA,可以基于文本或二进制模式创建恶意软件家族(或任何您想要描述的内容)的描述,也就是规则。每个规则,由一组字符串和一个布尔表达式组成,这些表达式决定了它的逻辑。通过规则匹配实现对恶意软件的检测。

具体实现

suricata.yaml配置

  主要配置三个地方:

  • eve-log中的files配置项开启fileinfo日志记录
  • file-store中的enabled改为yes开启文件提取功能
  • Stream中depth可适当调高(该值表示控制流重组完成的程度,流大小超过此值同样会被截断)

文件提取规则构建

  文件提取规则的写法与其他种类Suricata规则的语法是相同的,具体规则使用的相关字段可以参考官方文档中关于规则体File Keywords部分的内容:https://suricata.readthedocs.io/en/latest/rules/file-keywords.html

  以下是一些Suricata文件提取规则示例:

pass http any any -> any any (msg:"FILE docx file claimed"; fileext:"docx"; filestore; sid:2; rev:1;)
pass http any any -> any any (msg:"FILESTORE jpg"; fileext:"jpg"; filestore; sid:3; rev:1;)
pass http any any -> any any (msg:"FILESTORE jpg"; fileext:"jpeg"; filestore; sid:4; rev:1;)

文件提取

  在提取文件时,suricata以文件的SHA256命名文件,然后将每个文件放在suricata目录下的/logs/filestore路径下名为00到ff的文件夹中,该文件夹名与相应的文件名的前2个字符对应(即文件SHA256哈希值的前两位)。例如,如果所提取的文件的SHA256十六进制字符串以“f9bc6d…”开头,则我们将文件放置在目录 filestore/f9中。

  如果Suricata.yaml配置了files项,Suricata会记录流量中包含的文件的元数据并生成event_type为fileinfo的日志数据,fileinfo日志格式如下图所示。该日志包含了关于文件的主要信息和传输该文件的网络流量信息。在实际应用中,这些信息可以用于生成描述恶意软件的警报日志。

恶意文件扫描

  可以使用yara-python库基于python实现恶意文件扫描功能。并基于tornado之类的Web框架实现http接口,通过http接口实时接收来自Logstash的文件日志(fileinfo日志),并对日志中关联的文件进行yara规则匹配,最终对匹配到的结果生成警报日志。具体来说:

  1. 通过http接口实时接收来自Logstash的文件日志。
  2. 通过每条日志的“stored”项判断该文件是否被提取,true表示该文件被提取并保存,false表示该文件没有被提取。
  3. 对于被提取的文件,通过日志中提供的sha256哈希值定位文件的路径。
  4. 调用python-yara库并使用预定义的yara规则对文件做规则匹配。
  5. 对于符合要求的匹配结果生成警报日志并输出。

日志采集

  Logstash用于实时监听Suricata产生的警报数据,对于event_type为fileinfo的日志,Logstash将其通过HTTP输出到恶意文件扫描接口中进行恶意文件扫描。Logstash同时也实时监听恶意文件扫描生成的警报日志数据,并输出到指定elasticsearch数据库中。Logstash具体的配置方法可参考相应版本的官方文档:https://www.elastic.co/guide/en/logstash/current/index.html

参考资料