【技术分享】自定义的Splunk搜索命令:从开源威胁情报平台获取IOC信息

http://p7.qhimg.com/t01c955f670b461f8f1.png

译者:WisFree

预估稿费:160RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


写在前面的话

如果你每天都在使用同一款工具,那么你不仅会对这款工具越来越了解,而且你有可能还会有一堆的想法来改进这款工具。

Splunk的常规模式

由于我个人的工作原因,我几乎每天都会在各种不同的客户环境以及研究场景下使用Splunk,如果你手上有一个大型的事件数据库,那你肯定会需要一种高效率的技术来帮助你从如此大量的数据中提取出你所需要的有效信息。一般来说,最常用的一种实现方法就是将IoC(入侵威胁指标)提交给Splunk(例如IP地址、域名和哈希等等),然后设置计划搜索或进行实时搜索。常见的操作模式如下图所示:

http://p4.qhimg.com/t014bfbe6c88e513af6.png

在上图中,Input(输入)可以是日志记录、OSINT资源或者是第三方工具的输出数据,而Output(输出)即为我们所需要的有价值数据。这里我推荐大家使用MISP平台,因为我们可以通过平台所提供的API定期提取出有价值的IoC(入侵威胁指标)数据,并将这些数据注入到Splunk中以备后续的搜索查询和研究报告。

# wget --header 'Authorization: xxxxx' 
       --no-check-certificate 
       -O /tmp/domain.txt 
       https://misp/attributes/text/download/domain/false/false/false/false/false/7d

但是这个过程中有一个限制因素:每天(或每n个小时)定期所导出的新的IoC(入侵威胁指标)数据并非是立即可用的。比如说,当我们发现了类似Bad Rabbit(【相关报告】)这种新的安全威胁时,如果我们能够迅速获取到安全研究人员第一时间发布的IoC,那就非常棒了。那我们如何来实现这一点呢?你可以通过与Splunk服务器建立一条通信连接,并执行命令(或使用自定义搜索命令,需要命令控制台的访问权)来手动完成数据的导出过程。Splunk本身提供了非常优秀的查询语言,但你知不知道其实你可以用你自己的命令来进一步扩展Splunk的查询语句?非常好,那么接下来我们应该怎么做呢?

自定义Splunk搜索命令

一条Splunk自定义搜素命令其实就是一个非常小的程序,而实现这种程序的语言是可以在Splunk环境中执行的。我这里选择使用Python,而且相关的SDK也是现成的。实现的主要思想非常简单:即通过处理输入数据来生成新的输出数据。这也是很多计算机程序的基础运行流程。

我所编写的自定义搜索命令可以与MISP平台进行交互并获取IoC(入侵威胁指标)数据。演示样例如下所示:

http://p0.qhimg.com/t0136744b6f4fdda11e.png

命令语句如下所示:

|getmispioc [server=https://host:port]
            [authkey=misp-authorization-key]
            [sslcheck=y|n]
            [eventid=id]
            [last=interval]
            [onlyids=y|n]
            [category=string]
            [type=string]

在上面这段演示代码中,‘eventid’(返回特定事件的IoC)和‘last’(返回特定时间周期内的IoC,时间单位可以是n个小时、日、周或月)这两个参数是必须要强制提供的。除此之外,你可以通过设置‘ids_only’标记或指定IoC类型/类别来对返回的数据进行过滤筛选。演示样例如下所示:

|getmispioc last=2d onlyids=y type=ip-dst

http://p2.qhimg.com/t01bb74a83d375dcfad.png

接下来,你还可以向命令中整合更多复杂的查询语句来跨日志搜索IoC(入侵威胁指标)。在下面这段演示代码中,我们指定在queries.log日志文件中搜索感兴趣的目标域名:

source=/var/log/named/queries.log
[|getmispioc last=5d type=domain
 |rename value as query
 |fields query
]

http://p3.qhimg.com/t010112e38f487201ae.png

工具介绍

我们的自定义命令是基于PyMISP实现的,相关的脚本和安装细节可以参考我的GitHub主页【传送门】。

PyMISP是一个专门用来访问MISP平台的Python代码库,它使用了MISP的REST API。PyMISP可以帮助你获取事件数据,添加或更新事件/属性,添加或更新威胁样本,以及搜索特定属性等等。

依赖组件

python-requests

使用pip安装:

pip3 install pymisp

直接从GitHub代码库中下载安装最新版本:

git clone https://github.com/CIRCL/PyMISP.git && cd PyMISP
pip3 install -I .

PyMISP使用样例

更多丰富的使用样例和参考脚本可以在PyMISP项目的examples/目录中找到。

在examples/目录中,你需要修改keys.py.sample文件,并输入你自己的MISP url地址以及API密钥:

cd examples
cp keys.py.sample keys.py
vim keys.py

其中,MISP的API密钥可以在MISP Web接口中的自动化(Automation)设置部分找到。

为了测试你输入的URL地址以及API密钥是否正确,你可以使用examples/last.py来尝试获取最新发布的十条威胁事件信息:

cd examples
python3 last.py -l 10


参考文档

点击【这里】查看PyMISP的API文档。

除此之外,你还可以使用epydoc命令来生成文档:

epydoc --url https://github.com/CIRCL/PyMISP --graph all --name PyMISP --pdf pymisp -o doc

自定义开发

其中,AbstractMISP是程序的主类,并且继承了collections.MutableMapping,因此它可以直接当作一个Python字典来使用。MISPEvent、MISPAttribute、MISPObjectReference、MISPObjectAttribute和MISPObject是AbstractMISP的子类,因此你可以将它们当作Python字典来处理。

MISP对象

在创建一个新的MISP对象生成器时,你需要使用一个预定义的模板,并继承AbstractMISPObjectGenerator类。

在使用新的MISP对象生成器来生成事件属性并将其当作类属性(properties )来添加时,你需要使用add_attribute。

当对象发送给MISP平台之后,所有的类属性都将会以JSON格式导出。

总结

在这篇文章中,我们给大家介绍了如何自定义Splunk的搜索命令,并从MISP这个开源的威胁情报平台获取入侵威胁指标信息。通过本文所介绍的方法,我们不仅可以进一步发挥Splunk和MISP这两种工具的作用,而且还可以提升我们的事件响应效率,感兴趣的同学还可以在文章下方留言讨论更加高效的搜索语句。

(完)