Zeek是一個開源的、被動網絡流量分析軟件。它主要被用作安全監測設備來檢查鏈路上的所有流量中是否有惡意活動的痕跡。但更普遍地,Zeek支持大量安全領域外的流量分析任務,包括性能測量和幫助排查問題。
zeek架構
Zeek是一個被動的開源網絡流量分析器。許多運營商將Zeek用作網絡安全監視器(NSM),以支持對可疑或惡意活動的調查。Zeek還支持安全領域以外的各種流量分析任務,包括性能評估和故障排除。
新用戶從Zeek獲得的第一個好處是描述網絡活動的大量日志。這些日志不僅包括網絡上看到的每個連接的全面記錄,還包括應用程序層記錄。這些包括所有HTTP會話及其請求的URI,密鑰標頭,MIME類型和服務器響應,帶回復的DNS請求,SSL證書,SMTP會話的關鍵內容,以及更多。默認情況下,Zeek將所有這些信息寫入結構良好的制表符分隔或JSON日志文件中,這些文件適合使用外部軟件進行后處理。用戶還可以選擇讓外部數據庫或SIEM產品使用,存儲,處理和顯示數據以進行查詢。
除了日志外,Zeek還具有用於一系列分析和檢測任務的內置功能,包括:
1.從HTTP會話中提取文件
2.通過與外部注冊表進行接口來檢測惡意軟件
3.報告網絡上可見的易受攻擊的軟件版本
4.識別流行的網絡應用程序
5.檢測SSH暴力破解
6.驗證SSL證書鏈
在很高的層次上,Zeek在體系結構上分為兩個主要組件。它的事件引擎(或核心)將傳入的數據包流減少為一系列更高級別的事件。這些事件以與策略無關的方式反映了網絡活動,即,它們描述了已看到的內容,而不是原因或意義是否重大。
例如,線路上的每個HTTP請求都變成一個相應的 http_request事件,該事件帶有所涉及的IP地址和端口,所請求的URI以及所使用的HTTP版本。但是,該事件未傳達任何進一步的解釋,例如該URI是否對應於已知的惡意軟件站點。
事件引擎組件包括多個子組件,特別是包括以下內容的包處理管道:輸入源,包分析,會話分析和文件分析。輸入源從網絡接口攝取傳入的網絡流量。數據包分析處理較低級別的協議,從鏈路層一直開始。會話分析處理應用程序層協議,例如HTTP,FTP等。文件分析剖析了通過會話傳輸的文件的內容。事件引擎提供了一個插件架構,可以從Zeek核心代碼庫的外部添加其中的任何一個,從而可以根據需要擴展Zeek的功能。
與事件相關的語義是由Zeek的第二個主要組件腳本解釋器派生的,該腳本解釋器執行一組用Zeek的自定義腳本語言編寫的事件處理程序。這些腳本可以表示站點的安全策略,例如,當監視器檢測到不同類型的活動時要采取的操作。
更一般而言,腳本可以從輸入流量中得出任何所需的屬性和統計信息。實際上,Zeek的所有默認輸出都來自發行版中包含的腳本。Zeek的語言帶有廣泛的特定於域的類型和支持功能。至關重要的是,Zeek的語言允許腳本隨時間保持狀態,從而使腳本能夠跟蹤並關聯跨連接和主機邊界觀察到的內容的演變。Zeek腳本可以生成實時警報,還可以根據需要執行任意外部程序。人們可能會使用此功能來觸發對攻擊的主動響應。
安裝依賴
1.Libpcap (http://www.tcpdump.org)
2.OpenSSL libraries (https://www.openssl.org)
3.BIND8 library
4.Libz
5.Bash (for ZeekControl)
6.Python 3.5 or greater (https://www.python.org/)
單機安裝
本例安裝環境:debian10.0.5
硬件配置:4C 8G 120G硬盤
root@Zeek:~# apt-get install cmake make gcc g++ flex bison libpcap-dev libssl-dev python3 python3-dev swig zlib1g-dev
root@Zeek:~# apt-get install gnupg curl
root@Zeek:~# apt install -y automake make g++ bison flex libelf-dev libssl-dev bc
root@Zeek:~# apt-get install python3-git python3-semantic-version
root@Zeek:~#git clone --recursive https://github.com/zeek/zeek
root@Zeek:~# cd zeek
root@Zeek:~#./configure
root@Zeek:~#make
root@Zeek:~#make install
增加zeek環境變量
[root@Zeek ~]# vim /etc/profile
在末尾增加
export PATH=/opt/zeek/bin:$PATH
[root@Zeek ~]# source /etc/profile
初始化
[root@Zeek ~]# zeekctl
[ZeekControl] > install

[ZeekControl] > start
使用教程
zeek默認的日志存放目錄為/opt/zeek/logs,當前的日志默認存放為current路徑
默認產生的日志如下:
[root@Zeek current]# tree
├── capture_loss.log
├── conn.log
├── dhcp.log
├── dns.log
├── dpd.log
├── files.log
├── http.log
├── notice.log
├── ntp.log
├── software.log
├── ssh.log
├── ssl.log
├── stats.log
├── stderr.log
├── stdout.log
├── weird.log
└── x509.log
conn.log 連接日志
dhcp.log DHCP日志
dns.log DNS日志
files.log 文件日志
http.log HTTP日志
ssl.log SSL日志
zeek既可以通過網絡流的形式分析報文,也可以通過上傳原始報文PCAP格式文件的形式進行分析
zeek的可以靈活的通過zeek腳本對網絡中的異常行為或者特定的網絡流量進行分析
1)通過zeek讀取PCAP格式的原始報文進行行為分析
本例編寫腳本,分析PCPA報文中的文件內容,zeek腳本內容如下:
event connection_state_remove(c: connection) { print "connection_state_remove"; print c$uid; print c$id; for ( s in c$service ) print s; } event file_state_remove(f: fa_file) { print "file_state_remove"; print f$id; for ( cid in f$conns ) { print f$conns[cid]$uid; print cid; } print f$source; }
執行PCPA文件分析,如下:
[root@Zeek ~]# zeek -r http.pcap file_analysis_01.zeek

在不指定日志目錄的情況下會在該目錄下生成響應的日志,如下圖:

Zeek腳本的編寫
zeeek是單線程而不是多線程,大規模使用需要考慮集群化部署。
事件引擎(或者core):把進入的數據包流簡化為一系列高級的事件,這些事件以策略無關的形式反映了網絡活動。
事件處理程序:使用zeek腳本語言編寫,這些腳本能夠表達安全策略,更普遍地,他們能夠對輸入流量得到任何想要的屬性和統計數據。
zeek事件驅動腳本
zeek腳本事件(script events):當開發一個zeek腳本時,腳本的功能被包裝在各自的事件中。
例如:
event zeek_init()
{
/*code*/
}
event zeek_done()
{
/*code*/
}
zeek_init event:當zeek第一次初始化時候就被激活
zeek_done event:在zeek關閉之前被激活
tcp_packet event:處理包含tcp_header的數據包時激活
udp_request event:在處理包含UDP請求頭的數據時激活
udp_reply event:在處理包含UDP應答頭的數據包時激活
zeek模塊工作區(module workspace):使用module關鍵字來為腳本分配一個namespace,那么就可以通過包含分配的module開訪問來自其他腳本的代碼,使用export關鍵字,用於導出在module工作區的block塊中輸入的代碼
module zeekscript;
export {
/**/
/**/
}
使用模塊來導出到嗎可以在其他腳本之上構建更高級的腳本。
zeek日志流(log stream)在開發zeek腳本時,所有經過處理的輸出將被發送到特定的日至流。這些日志流會包含響應的日志文件格式輸出。
event connection_established(){
log::create_stream(LOG,format,path);
log::write(Logsream,data)
}
connection_established event:當主機連接到接收器(receiver)時激活
Log::create_stream:創建具有名稱、格式輸出結構和路徑的新日志流
Log::write:將包含的數據寫入指定的日志流
使用腳本對日志分析(analysis)
使用zeek的事件驅動腳本語言,我們可以創建特定的基於事件的過濾器,以便在數據包中捕獲和分析期間的應用。
nl命令用來展示zeek腳本
檢測http代理的zeek腳本 http_proxy.zeek
module HTTP; export { global success_status_codes: set[count] = { 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 304 }; } event http_reply(c: connection, version: string, code: count, reason: string) { if ( /^[hH][tT][tT][pP]:/ in c$http$uri && c$http$status_code in HTTP::success_status_codes ) print fmt("A local server is acting as an open proxy: %s", c$id$resp_h); }