使用SPLUNK進行簡單Threat Hunting


通過訂閱網上公開的惡意ip庫(威脅情報),與SIEM平台中網絡流量日志進行匹配,獲得安全事件告警。

比如,這里有一個malware urls數據下載的網站,每天更新一次:
https://urlhaus.abuse.ch/browse/
下載urlhaus里惡意url數據,https://urlhaus.abuse.ch/downloads/text/, 稍微整理一下,做成一個csv格式的文件,方便導入splunk:

添加nslookup file:
Settings >> Lookups » Lookup table files » Add new

用rest command查看lookup file 添加是否正確:

| inputlookup myiptest.csv

假設現在有ids日志,此日志包含經過ids的內外網連接,其中src_ip為內網ip,dest_ip為外網目的ip:
sourcetype=ids_log_1 |table src_ip,dest_ip

現在對ids的dest_ip字段和myiptest.csv的threatdomain 字段進行匹配:
sourcetype=ids_log_1 [| inputlookup myiptest.csv | rename threatdomain as dest_ip | table dest_ip]
命中兩條記錄:

現在完成一次搜索,然后繼續將這個流程自動化,這里涉及到Splunk Summary Index的概念:

Summary index的工作機制其實很簡單,它本質上和其他索引沒有區別,只不過里面存儲的數據是定期運行的saved search的統計結果。通過定期運行的saved search,SPLUNK可以將一個較短時間間隔特定事件的統計結果存儲到summary index中,通過合理的統計時段和搜索運行計划配置,所有時間段的事件統計結果都將無一疏漏地紀錄下來。這樣在需要統計過去一年這樣長時段的事件時,通過summary index就可以很快速的把所有統計結果匯總,從而得到最終的結果。這正所謂積硅步以致千里,聚細流以成江海。

From http://splunk.10data.com/如何使用summary-index-加速搜索和生成報表/

創建一個summary index:

添加一個saved search, 可以60分鍾執行一次,每次執行60分鍾到now的數據:
Settings>>Searches, reports, and alerts » Add new
http://localhost:8000/en-US/manager/search/data/indexes/_new

選擇使用summary indexing, 寫入剛才創建的security_event_hub index里面:

保存完成,坐等安全告警:

index="security_event_hub"

最后可以將安全告警推送到工單系統,新的告警在工單系統中解決掉,這就完成一整個Use Case流程。

附代碼舉例:

Splunk Rest api 添加Lookup file :

#!/usr/bin/python -u

import urllib
import httplib2
from xml.dom import minidom
import time
import json

# The same python implementation for curl function
'''
import requests
from xml.dom import minidom
userName = 'admin'
password = 'xiaoxiaoleo'
baseurl = '127.0.0.1:8089'

session = requests.Session()
session.auth = (userName, password)

#auth = session.post('https://' + baseurl, verify=False)
data = {'username':userName, 'password':password}
req = session.post('https://' + baseurl + '/services/auth/login', data=data, verify=False)
session_key = minidom.parseString(req.text).getElementsByTagName('sessionKey')[0].childNodes[0].nodeValue

print(session_key)
headers = {"Content-Type": "application/xml", 'Authorization': 'Splunk %s' % session_key}


def addlookup():
    data = {'name': 'haha.csv','eai:data' : 'C:\\Program Files\\Splunk\\var\\run\\splunk\\lookup_tmp\\abuse_20190215T1418.csv'}
    req = requests.post('https://127.0.0.1:8089/servicesNS/nobody/search/data/lookup-table-files/geo_attr_us_states.csv', headers=headers, data=data, verify=False)
    print(req.text)
 
if __name__ == '__main__':
    addlookup() 

獲取urlhaus.abuse.ch的ip地址列表並寫入csv:

import json
import requests
from datetime import datetime, timedelta

search_command = ''

def get_abusechrul():
    domain_list = []
    url_list = []
    req = requests.get('https://urlhaus.abuse.ch/downloads/text/')

    body = req.text
    for i in body.split('\r\n'):
        if i.startswith('#'):
            continue
        domain = i.split("//")[-1].split("/")[0].split(':')[0]
        url = i.replace("http://", "")
        url = url.replace("https://", "")
        url_list.append(url)
        domain_list.append(domain)
    return domain_list, url_list


def generate_csv(source_name, domain_list, url_list):
    now = datetime.utcnow() + timedelta(hours=8)
    timestamp = now.strftime('%Y%m%dT%H%M.csv')
    filename = '%s_%s' % (source_name, timestamp)
    with open(filename, "wb") as csv_file:
        csv_file.write('threatdomain' + '\n')
        csv_file.writelines('91.189.91.26' + '\n')
        for line in domain_list:
            csv_file.write(line + '\n')

if __name__ == '__main__':
    domain_list, url_list = get_abusechrul()
    generate_csv('abuse', domain_list,url_list)
    #print cmd1




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM