zeek系列之:流量数据采集流量探针zeek-脚本入门
zeek解析pcap流量文件
解析pcap文件
zeek -C -r /home/1.pcap
json格式解析pcap文件到當前目錄下
zeek -C -r /home/1.pcap LogAscii::use_json=T
注意:需要zeek運行狀態下
zeek腳本
概述
概述擴展名為.zeek
默認目錄:share/zeek
放在share/zeek/site的不會在升級時被覆蓋或者修改
zeek生成的事件可以參考:base/bif/event.bif.zeek
*.bif是zeek的內建函數文件,也是生成在線文檔的基礎。
zeek腳本語法參考:Script Reference — Book of Zeek (v4.1.1)
框架參考:Frameworks — Book of Zeek (v4.1.1)
默認腳本保存位置
/opt/zeek/share/zeek/base/protocols目錄下,保存各個協議的具體解析腳本,
腳本示例
@load
定義腳本使用的庫
例如:/opt/zeek/share/zeek/test-all-policy.zeek 中
使用了如下的這些庫
module
定義命名空間
module TeamCymruMalwareHashRegistry;
例如:example.zeek文件中
export
解釋自定義變量,作為腳本命令空間的一部分
重新定義了一個可枚舉的常量,描述了將使用通知框架生成的通知類型。
定義一些常量用作閾值等
function
函數
event
針對特定事件執行的內容
file_hash事件處理程序,傳遞file,哈希算法的種類,哈希值
zeek執行異步操作不影響性能時使用when語句塊
事件隊列和事件處理器:zeek的腳本語言是事件驅動的,zeek的核心功能是把事件放入有序的事件隊列中,允許事件處理程序在先到先服務的基礎上處理事件。
當zeek檢測到發起的dns請求時,觸發dns_request事件,并傳遞數據
數據類型和數據結構
范圍(scope)
聲明變量的兩種形式:
scope name: type
scope name = expression
expression的計算結果和type一樣,例如:
local a:int
local a=10
全局變量
當腳本使用module關鍵字提供了命名空間時,必須更加注意全局聲明以確保預期的效果。
在帶有命名空間的腳本中聲明全局變量時,兩種可能的結果:
僅在命名空間的上下文可用
如果在export塊中聲明了全局變量,可以通過<module name>::<variable name>來對其他腳本生效
常量
const關鍵字,使用&redef的話,只能在解析時設置或者更改常量,以后(運行時)不可更改。redef常量不能在事件處理程序中更改。
舉例:
base/protocols/http/main.zeek文件中:
module HTTP;
export {
## This setting changes if passwords used in Basic-Auth are captured or
## not.
const default_capture_password = F &redef;
}
如果想打開這個default_capture_password設置,需要在啟動zeek之前在site/local.zeek添加如下行:
@load base/protocols/http
redef HTTP::default_capture_password = T;
局部變量
函數function內定義的local的局部變量,在函數結束后會被銷毀。同理事件event中的變量在事件結束后會被銷毀
數據結構原子類型
Data Type Description zh-cn
int 64 bit signed integer 64位有符號整數
count 64 bit unsigned integer 64位無符號整數
double double precision floating precision 雙精度浮點
bool boolean (T/F) 布爾類型
addr IP address, IPv4 and IPv6 IP地址
port transport layer port 傳輸層端口
subnet CIDR subnet mask CIDR格式子網掩碼
time absolute epoch time 絕對時間
interval a time interval 時間間隔
pattern regular expression 正則表達式
集合
儲存相同數據類型的唯一元素。
可用的方法:add,delete,for ( i in ssl_ports )
for循環無法保證集合遍歷的順序
表
類似python字典,鍵-值映射,值不唯一,鍵唯一
local ssl_services: table[string] of port;
ssl_services = table(["SSH"] = 22/tcp, ["HTTPS"] = 443/tcp);
向量
類似python列表,有序
local v1: vector of count;
local v2 = vector(1, 2, 3, 4);
原子類型
addr:主機名定義的話zeek會發送dns查詢,得到一個set[addr]
port:無符號整數/協議名(tcp,udp,icmp,unknown),協議大小順序unknown < tcp < udp < icmp,例如65535/tcp<0/udp
subnet:cidr表示法
time:current_time系統時間, network_time來自實時流或者pcap最后處理數據包的時間戳
interval:usec, msec, sec, min, hr, or day
pattern:正則匹配
復合類型
記錄數據類型:結合type關鍵詞和record可以生成復合類型
type Service: record {
name: string;
ports: set[port];
rfc: count;
};
簡單的使用更具描述性的名稱定義數據結構:type string_array: table[count] of string;
自定義日志
Introduction to Scripting — Book of Zeek (v4.1.1)
拋出通知
Introduction to Scripting — Book of Zeek (v4.1.1)
總結
以上是生活随笔為你收集整理的zeek系列之:流量数据采集流量探针zeek-脚本入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 技术入股的坑
- 下一篇: Backtrader(十二)- 订单 O