
網絡安全網絡IDS【免費下載鏈接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.項目地址https://gitcode.com/gh_mirrors/ze/zeek點擊查看免費下載本文以 Zeek 倉庫中的 base/protocols/irc/files.zeek 腳本及其 Zeekygen 參考文檔doc/scripts/base/protocols/irc/files.zeek.rst為核心系統(tǒng)講解 Zeek 如何為 IRC 協議接入 Files 文件分析框架從記錄擴展、文件句柄fuid生成、協議注冊到 DCC 傳輸中文件名與 MIME 類型的自動補全再到集群環(huán)境下的注意事項。讀完本文你將理解 IRC 會話日志irc.log中fuid字段的來源與含義掌握IRC::get_file_handle的自定義方式并能借助 Files 框架對 IRC 傳輸的文件做溯源與深度分析。一、背景IRC 分析器與文件分析框架的銜接點Zeek 的 IRC 支持由module IRC承載核心會話腳本位于 scripts/base/protocols/irc/main.zeek它定義了IRC::Info記錄含ts、uid、id、nick、user、command、value、addl等字段并通過Log::create_stream(..., $pathirc)將 IRC 命令與會話信息寫入irc.log同時用Analyzer::register_for_ports在默認端口 6666/6667/6668/6669/tcp 上啟用 IRC 分析器。然而IRC 傳輸的真正“內容”往往不是命令文本而是通過 DCCDirect Client-to-Client協議傳輸的文件。要讓 Zeek 像對待 HTTP、FTP 那樣對 IRC 承載的文件進行提取、重組、MIME 嗅探和深度分析就必須讓 IRC 分析器與 Files 框架對接。這正是files.zeek的職責所在它是 IRC 協議與 base/frameworks/files 框架之間的“適配層”。該腳本通過三個load指令建立依賴./dcc-sendDCC 傳輸預期管理、base/utils/conn-ids連接標識工具、base/frameworks/files文件框架本體。從源碼結構看files.zeek本身不直接分析文件內容而是負責兩件事一是為 Files 框架提供生成文件句柄的回調二是在文件事件中把 DCC 上下文文件名、MIME 類型回填到 IRC 會話記錄。二、記錄擴展IRC::Info.fuid與fa_file.ircfiles.zeek的export塊首先對兩個記錄做了redef擴展這是它與 Files 框架交互的數據基礎redef record Info { ## File unique ID. fuid: string log optional; }; redef record fa_file { irc: IRC::Info optional; };IRC::Info.fuidstring log optional文件唯一 IDFile Unique ID。它是 Files 框架分配給每個被跟蹤文件句柄的標識符與文件分析框架產生的files.log中的fuid一一對應。正因為它帶log屬性irc.log的每條記錄都能攜帶本次會話關聯文件的fuid從而把 IRC 會話日志與文件分析日志files.log、文件內容日志串聯起來——這是溯源“誰在 IRC 上傳了什么文件”的關鍵字段。fa_file.ircIRC::Info optional反向掛在 Files 框架的fa_file記錄上讓每個被跟蹤的文件都能攜帶其所屬的 IRC 會話信息。optional表示該字段并非每個文件都存在例如非 IRC 來源的文件就沒有此字段腳本中通過f?$irc這樣的字段存在性判斷來安全訪問。這種“雙向掛接”的設計體現了 Zeek 腳本常見的擴展模式在源記錄上增加輸出字段在框架記錄上增加上下文引用二者在事件處理階段完成拼接。三、文件句柄提供者IRC::get_file_handle文檔摘要中列出的唯一函數是IRC::get_file_handle其類型簽名在源碼中聲明并實現如下global get_file_handle: function(c: connection, is_orig: bool): string; function get_file_handle(c: connection, is_orig: bool): string { return cat(Analyzer::ANALYZER_IRC_DATA, c$start_time, c$id, is_orig); }該函數接收連接c與方向標志is_orig返回一個字符串作為文件的唯一句柄。其實現將ANALYZER_IRC_DATA分析器標簽、連接開始時間、連接四元組c$id和方向拼接起來cat。從源碼結構看這樣生成的句柄天然具備兩個特性唯一性連接標識加時間戳足以區(qū)分同一連接上不同方向、不同時間段的文件可復現性給定相同的連接與方向信息生成的句柄穩(wěn)定一致便于跨日志關聯。值得注意的是IRC::Info.fuid正是這個返回值。在后續(xù)file_over_new_connection事件中腳本執(zhí)行irc$fuid f$id;——f$id即 Files 框架為文件分配的唯一 ID它由get_file_handle回調產生詳見第五節(jié)從而把 IRC 會話記錄與文件 ID 正式綁定。自定義文件句柄策略時可以用redef覆蓋IRC::get_file_handle注意需保持相同簽名例如在集群環(huán)境中把 worker 節(jié)點信息加入句柄以避免不同 worker 之間 fuid 沖突。四、協議注冊zeek_init與Files::register_protocolfiles.zeek通過zeek_init事件優(yōu)先級 5把 IRC 的 DATA 分析器注冊進 Files 框架event zeek_init() priority5 { Files::register_protocol(Analyzer::ANALYZER_IRC_DATA, Files::ProtoRegistration($get_file_handle IRC::get_file_handle)); }Files::register_protocol的簽名與ProtoRegistration記錄定義在 scripts/base/frameworks/files/main.zeektype ProtoRegistration: record { ## A callback to generate a file handle on demand when ## one is needed by the core. get_file_handle: function(c: connection, is_orig: bool): string; ## A callback to describe a file. ... describe: function(f: fa_file): string defaultfunction(f: fa_file): string { return ; }; }; global register_protocol: function(tag: Analyzer::Tag, reg: ProtoRegistration): bool;要點解讀注冊以分析器標簽為鍵ANALYZER_IRC_DATA是 IRC 數據通道即 DCC 文件傳輸所用連接的分析器標簽每個協議只能為同一標簽注冊一次回調重復注冊時register_protocol返回false。ProtoRegistration至少需要get_file_handle回調describe回調帶默認實現返回空字符串IRC 未提供自定義描述這與 HTTP 用 URL 描述文件的策略不同——從源碼看IRC 的文件描述保持默認空值。注意注冊的是ANALYZER_IRC_DATA而非ANALYZER_IRC這體現了 IRC 分析器的“雙連接”模型——命令通道IRC與數據通道IRC_DATA即 DCC 文件傳輸被區(qū)分對待只有數據通道上的流量才會被 Files 框架追蹤為文件。五、Files 框架的底層回調機制理解get_file_handle何時被調用需要看 Files 框架核心腳本 scripts/base/frameworks/files/main.zeek 中的同名事件get_file_handleevent get_file_handle(tag: Analyzer::Tag, c: connection, is_orig: bool) priority5 { if ( tag !in registered_protocols ) { if ( ! missing_get_file_handle_warned[tag] ) { missing_get_file_handle_warned[tag] T; Reporter::warning(fmt(get_file_handle() handler missing for %s, tag)); } set_file_handle(fmt(%s-fallback-%s-%s-%s, tag, c$uid, is_orig, network_time())); return; } local handler registered_protocols[tag]; set_file_handle(handler$get_file_handle(c, is_orig)); }這一實現揭示了三條重要事實每當 Files 核心需要為新連接上的文件生成句柄時就會觸發(fā)該事件并通過set_file_handle落地若某分析器標簽沒有注冊回調框架會發(fā)出get_file_handle() handler missing告警并退回到一個“fallback”格式的句柄tag-fallback-uid-is_orig-時間——這正是files.zeek必須在zeek_init中搶先注冊回調的原因已注冊的回調通過registered_protocols[tag]表查找并執(zhí)行IRC::get_file_handle的返回值最終成為文件 ID 并回填到fuid。此外file_new優(yōu)先級 10與file_over_new_connection優(yōu)先級 10事件是 Files 框架側更高優(yōu)先級的通用處理器負責set_info(f)、重組緩沖區(qū)設置等基礎設施工作IRC 腳本的處理器特意取優(yōu)先級 5保證在框架基礎工作完成后、其他低優(yōu)先級處理器之前執(zhí)行。六、事件聯動把 DCC 上下文回填到文件files.zeek通過兩個文件事件完成 IRC 上下文與文件對象的融合event file_over_new_connection(f: fa_file, c: connection, is_orig: bool) priority5 { if ( [c$id$resp_h, c$id$resp_p] !in dcc_expected_transfers ) return; local irc dcc_expected_transfers[c$id$resp_h, c$id$resp_p]; irc$fuid f$id; if ( irc?$dcc_file_name ) f$info$filename irc$dcc_file_name; f$irc irc; } event file_sniff(f: fa_file, meta: fa_metadata) priority5 { if ( f?$irc meta?$mime_type ) f$irc$dcc_mime_type meta$mime_type; }file_over_new_connection當一個文件與新連接關聯時觸發(fā)。邏輯分三步用連接響應方地址/端口[c$id$resp_h, c$id$resp_p]查詢dcc_expected_transfers表——該表由 dcc-send.zeek 維護記錄了“預期將要發(fā)生的 DCC 傳輸”若命中說明這條連接就是 IRC 信令中預告過的 DCC 傳輸把文件 ID 寫入 IRC 會話記錄irc$fuid f$id若預告信息中含文件名dcc_file_name則把它設置為文件的filename元數據f$info$filename使后續(xù)文件分析能直接使用原始文件名最后將整個 IRC 記錄掛到f$irc。file_sniff文件內容經 MIME 嗅探后觸發(fā)。若文件確實來自 IRCf?$irc且嗅探出了 MIME 類型則回填f$irc$dcc_mime_type。這一步讓irc.log在文件分析完成后能記錄“這個 DCC 文件實際是什么類型”與預告的文件名相互印證。七、與 DCC 傳輸預告機制的協作files.zeek的功能高度依賴 dcc-send.zeek 的預告機制。該腳本注釋中給出了一個典型的 DCC 觸發(fā)示例PRIVMSG my_nick :^ADCC SEND whateverfile.zip 3640061780 1026 41709^Airc_dcc_message事件優(yōu)先級 5解析出dcc_type、文件名argument、目標地址address、端口dest_port與大小size后僅對SEND類型做處理c$irc$dcc_file_name argument; c$irc$dcc_file_size size; local p count_to_port(dest_port, tcp); Analyzer::schedule_analyzer(0.0.0.0, address, p, Analyzer::ANALYZER_IRC_DATA, 5 min); dcc_expected_transfers[address, p] c$irc;關鍵機制梳理預期表dcc_expected_transfers: table[addr, port] of Info read_expire5mins以“目標地址端口”為鍵記錄 5 分鐘內到期自動清理表中保存的Info隨后成為f$irc的內容來源調度分析器Analyzer::schedule_analyzer(0.0.0.0, address, p, Analyzer::ANALYZER_IRC_DATA, 5 min)主動在目標地址/端口上調度 IRC DATA 分析器讓 Zeek 即使在該連接尚未建立時也知道該跟蹤什么容量防護max_dcc_expected_transfers: count 5000 redef設為 0 可禁用檢查超過上限時上報irc_max_dcc_expected_transfers_exceededweird防止被攻擊者用大量假 DCC 預告撐爆表服務標記scheduled_analyzer_applied優(yōu)先級 10命中預期表時為連接添加c$service[irc-dcc-data]服務標簽并注冊連接移除鉤子finalize_irc_data用于在連接結束時清理殘留的預期狀態(tài)。集群模式下的關鍵注意點源碼注釋中明確警告DCC 預告A 對 B 說與實際傳輸連接B 與 C 之間可能落在不同 worker上。為此 dcc-send.zeek 采用 proxy/manager 中轉worker 發(fā)現irc_dcc_message后把預告發(fā)布到代理輪詢話題Cluster::rr_topic(Cluster::proxy_pool, dcc_transfer_rr_key)manager/proxy 再向所有 worker 廣播dcc_transfer_add同樣地dcc_transfer_remove、連接移除鉤子中的清理也會通過集群發(fā)布同步。若單機運行或傳輸連接恰在同 worker則直接寫本地表并調度分析器。八、測試驗證與實戰(zhàn)使用倉庫測試目錄提供了 IRC DCC 功能的直接驗證素材testing/btest/scripts/base/protocols/irc/basic.test用$TRACES/irc-dcc-send.pcapng重放 DCC 傳輸并處理irc_dcc_send_ack事件打印已接收字節(jié)數testing/btest/scripts/base/protocols/irc/events.test同樣基于irc-dcc-send.pcapng逐一觸發(fā)并輸出 IRC 相關事件testing/btest/scripts/base/protocols/irc/max-dcc-send-expected.zeek通過redef IRC::max_dcc_expected_transfers 15;壓測預期表容量限制驗證irc_max_dcc_expected_transfers_exceededweird 的觸發(fā)路徑dcc-first-command.zeek、malformed-dcc.zeek覆蓋 DCC 命令順序異常與畸形主機/端口等邊界場景。你可以用倉庫內的 pcap 痕跡快速驗證完整鏈路離線模式即可無需真實網絡zeek -b -r testing/btest/Traces/irc/irc-dcc-send.pcapng scripts/base/protocols/irc運行后觀察輸出irc.log中應出現帶fuid、dcc_file_name、dcc_file_size、dcc_mime_type的記錄files.log中對應fuid的文件條目與之一致若同時加載文件分析策略如scripts/policy/frameworks/files/下的提取腳本還能看到實際提取出的文件內容。九、擴展實踐基于 fuid 的跨日志溯源利用IRC::Info.fuid這一設計可以實現典型的“IRC 文件溯源”查詢以irc.log中的fuid為鍵在files.log中查找同一fuid即可獲得文件大小、MIME 類型、分析器標簽、甚至files.log關聯的文件內容 IDsource/fuid鏈配合files.log中total_bytes、seen_bytes等字段可評估傳輸完成度。若需要自定義句柄生成策略例如集群中按 worker 區(qū)分命名空間可按如下方式覆蓋保持簽名一致redef IRC::get_file_handle function(c: connection, is_orig: bool): string { return cat(my-irc, c$start_time, c$id, is_orig); };需要注意fuid同時被寫入irc.log與files.log自定義時必須保證同連接同方向的返回值穩(wěn)定一致否則兩條日志將無法關聯。十、小結base/protocols/irc/files.zeek是理解 Zeek 協議分析器與 Files 框架協作方式的極佳范例它的核心貢獻可歸納為三點記錄擴展為IRC::Info增加fuid輸出字段為fa_file增加irc上下文字段打通會話日志與文件日志句柄提供通過IRC::get_file_handle生成穩(wěn)定唯一的文件 ID并經zeek_init注冊到Files::register_protocol使 Files 核心在有需要時回調上下文回填利用file_over_new_connection與file_sniff事件把 DCC 預告的文件名與實際嗅探的 MIME 類型寫入 IRC 會話記錄。結合 dcc-send.zeek 的預期傳輸表、集群發(fā)布機制與 main.zeek 的底層回調實現讀者既能直接上手使用也能照此模式為其他自定義協議編寫自己的文件集成腳本。贊分享網絡安全網絡IDS【免費下載鏈接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.項目地址https://gitcode.com/gh_mirrors/ze/zeek點擊查看免費下載相關推薦Zeek 的 IRC 協議分析base/protocols/irc 包結構、日志模型與 DCC 文件提取實戰(zhàn)指南Zeek 的 IRC 協議分析base/protocols/irc 包結構、日志模型與 DCC 文件提取實戰(zhàn)指南 本指南圍繞 Zeek 倉庫中 base/pr網絡安全網絡IDSZeek 文件提取實戰(zhàn)深入解析 base/files/extract 框架與 FileExtract 模塊Zeek 文件提取實戰(zhàn)深入解析 base/files/extract 框架與 FileExtract 模塊 導讀 本文圍繞 Zeek 內置腳本包 base/f網絡安全網絡IDSZeek 智能框架Intel Framework的文件分析集成base/frameworks/intel/files.zeek 深度解析Zeek 智能框架Intel Framework的文件分析集成 base/frameworks/intel/files.zeek 深度解析 base/fr網絡安全網絡IDS上一篇rkt 生產環(huán)境用戶案例全覽從 BlaBlaCar 到 Kubernetes 的落地實踐下一篇Flutter Go終極指南掌握go-cli命令行工具快速開發(fā)Flutter組件創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考