zeek腳本編寫介紹


最近學習了一下zeek,簡單記錄一下

zeek介紹

Zeek是一個被動的開源網絡流量分析器。它主要是一種安全監視器,可深入檢查鏈接上的所有流量以查找可疑活動的跡象。使用Zeek最直接的好處是生成大量日志文件。這些日志不僅包括對網絡上每個連接的全面記錄,還包括應用程序層記錄,例如所有HTTP會話及其請求的URI,密鑰標頭,MIME類型和服務器響應;帶回復的DNS請求;SSL證書;SMTP會話的關鍵內容;以及更多。默認情況下,Zeek將所有這些信息寫入結構合理的制表符分隔的日志文件中,這些文件適用於使用外部軟件進行后處理。

另外,在名稱上,3.0版本之前是叫bro,之后改為zeek,相關的命令也都有變動

腳本編寫

基本命令

編寫並通過bare模式執行腳本

Zeek的腳本語言是事件驅動的,Zeek中的腳本編寫取決於Zeek在處理網絡流量時生成的事件,通過這些事件更改數據結構的狀態以及對所提供信息進行決策。

Zeek的核心作用是將事件放入有序的“事件隊列”中,從而使事件處理程序可以按照“先到先得”的方式處理事件。實際上,這是Zeek的核心功能,因為如果沒有編寫腳本來對事件執行離散操作,則幾乎沒有可用的輸出。對事件隊列,生成的事件以及事件處理程序處理這些事件的方式的基本了解不僅是學習Zeek編寫腳本的基礎,而且還是了解Zeek本身的基礎。

一個簡單的例子

連接記錄數據類型

connection 類型
在Zeek定義的所有事件中,絕大多數事件都傳遞了connection數據類型,連接記錄本身是大量的嵌套數據類型,用於跟蹤連接在其生命周期內的狀態。

盡管Zeek能夠進行數據包級別的處理,但其優勢在於始發者與響應者之間的連接。因此,為連接生命周期的主要部分定義了一些事件,例如:
new_connection
connection_timeout
connection_state_remove

其中,對連接記錄數據類型有最好的展示的事件是connection_state_remove。Zeek會在決定從內存中刪除該事件之前生成該事件。

通過網絡抓包的方式獲取數據,然后執行腳本

通過抓包來獲取數據,模擬解析網絡數據,查看連接內容

記錄源IP和訪問IP,並計算兩次訪問間隔時間

自定義日志記錄框架(Logging Framework)

首先,需要通知Zeek我們將通過向Log::ID枚舉數添加值來添加另一個Log Stream 。在此腳本中,我們將值LOG追加到Log::ID枚舉值,但是由於此值位於導出塊中,Log::ID因此實際 將值追加到Factor::Log。
接下來,我們需要定義組成日志數據的名稱和值對,並規定其格式。該腳本定義了一個新的記錄數據類型,稱為Info(實際上, Factor::Info)和四個字段,為addr和port。記錄類型中的每個字段都包含&log 屬性,在Log::write調用這些字段時應將這些字段傳遞給Logging Framework 。如果有任何不帶&log屬性的名稱/值對,則將在記錄期間僅忽略這些字段,但在變量的生命周期內仍然可用。
下一步是創建Log::create_stream,一個以 Log::ID和一條記錄及日志文件作為其參數的日志記錄流。在此示例中,我們調用 Log::create_stream方法並通過Factor::LOG、 Factor::Info記錄和factor日志文件名作為參數。
從現在開始,向Log::write命令發出Log::ID且格式正確的Factor::Info記錄,將生成日志條目。結果如下:

通知框架

要在Zeek中發出通知,只需要提供特定的Notice :: Type,然后調用NOTICE為其提供適當的Notice :: Info記錄。通常,對NOTICE的調用僅包含Notice :: Type和簡潔的消息。但是,在發出通知時,有更多選項,note :: Info中唯一必填的字段是note字段。

會在notice.log文件中記錄通知信息

首先,腳本export塊將LogNotice::Interesting_Hostname_Login值添加到枚舉常量中, Notice::Type記錄定義新的通知類型。然后,腳本將調用NOTICE和定義 $note,$msg,$sub,$id,和$uid記錄。
其次,通知加入系統通過Notice::policy掛鈎進行管理 。一個Notice::policy鈎其參數Notice::Info用來存放腳本在其調用時提供的信息記錄。通過訪問Notice::Info中特定的記錄,進行邏輯判斷,以更改用於處理系統中的通知的策略。

通知類型

通知參數 描述
ACTION_NONE 不采取行動
ACTION_LOG 將通知發送到Notice :: LOG日志記錄流。
ACTION_EMAIL 發送帶有通知的電子郵件。
ACTION_ALARM 將通知發送到Notice :: Alarm_LOG流。然后每小時進行一次輪播,並將其內容以可讀ASCII電子郵件發送到以下地址: Notice::mail_dest。

示例中,我們已添加Notice:: ACTION_LOG到 n$actions集合中。該類型本身是可枚舉的,
Notice::ACTION_LOG操作將通知寫入 Notice::LOG日志記錄流,在默認配置中,日志將寫入notice.log文件,並且不采取進一步操作。
Notice::ACTION_EMAIL操作會將電子郵件發送到Notice::mail_dest 變量中定義的一個或多個地址,並將通知的詳細信息作為電子郵件的正文。
Notice::ACTION_ALARM將通知發送到Notice::ALARM_LOG日志記錄流,然后每小時進行一次輪播,並將其內容以可讀ASCII電子郵件發送到Notice::mail_dest

腳本使用

  • 單一腳本

將腳本以load方式添加到配置

echo ‘@load base/**' >> /usr/local/zeek/share/zeek/site/local.zeek

重新加載

/usr/local/zeek/bin/zeekctl deploy
  • 多個腳本組成的目錄

如果指定目錄名而不是文件名,則Zeek將嘗試在該目錄中加載名為" __load __.zeek"的文件(該文件將包含其他“ @load”指令)。
將目錄地址以load方式添加到配置

echo ‘@load base/**' >> /usr/local/zeek/share/zeek/site/local.zeek

重新加載

/usr/local/zeek/bin/zeekctl deploy


免責聲明!

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



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