Bro使用手冊

BRO

0x01 簡介

簡介

Bro
Bro是一款被動的開源流量分析器。它主要用于對鏈路上所有深層次的可疑行為流量進行一個安全監(jiān)控。更通俗點說就是,Bro支持在安全域之外進行大范圍的流量分析,分析包括性能評估和錯誤定位。

站點部署B(yǎng)RO所能獲得的最直接好處就是獲得日志文件的擴展集,這些文件在高層次記錄網(wǎng)絡(luò)的行為。這些日志文件不僅全方位記錄了所有線路上可見的每個連接,還記錄了應(yīng)用層傳輸,例如HTTP會話以及請求的URL、關(guān)鍵頭、MIME類型、服務(wù)器反饋,DNS請求及反應(yīng),SSL證書,SMTP會話的關(guān)鍵內(nèi)容等等。默認情況下BRO將這些信息寫進結(jié)構(gòu)化,tab鍵分隔的日志文件中以供其他軟件后續(xù)處理。當(dāng)然我們也可以選擇其他輸出格式和后端來和數(shù)據(jù)庫對接。

當(dāng)然除了日志,bro還有內(nèi)建函數(shù)來完成分析和檢測任務(wù),包括在HTTP會話中抽取文件,在與其他注冊點對接時監(jiān)測惡意軟件,報告脆弱的軟件版本,識別web應(yīng)用,監(jiān)測SSH暴力破解,認證SSL證書鏈等等。

但是,理解BRO的關(guān)鍵在于意識到,即使本系統(tǒng)自帶開箱即用的強大功能,從根本上來看這仍代表一個全定制化和可擴展的流量分析平臺。BRO為用戶提供了特定域的,圖靈完備的腳本語言用于表達任意的分析任務(wù)。你可以將BRO視作特定域的Python或者Perl。如同Python,BRO自帶大量預(yù)建功能,即標準庫。如此你將不受限于系統(tǒng),而能以編寫自己的代碼的方式來使用BRO。事實上BRO的默認分析,如日志就是基于這些腳本的,核心系統(tǒng)中沒有硬編碼任何特定分析。

特征

  • 部署
    • Unix-like系統(tǒng)上運行
    • 基于監(jiān)控端口和網(wǎng)絡(luò)竊聽裝置的全被動分析
    • 標準libpcap的抓包接口
    • 線上&線下分析
    • 支持簇的大規(guī)模部署
    • 統(tǒng)一管理框架
    • 開源
  • 分析
    • 離線分析和取證的全面日志記錄
    • 應(yīng)用層協(xié)議的獨立端口分析
    • 支持多種應(yīng)用層協(xié)議 DNS FTP HTTP IRC SMTP SSH SSL
    • 應(yīng)用層協(xié)議交換的文件內(nèi)容分析
    • 全IPv6支持
    • 隧道檢測與分析 Ayiya Teredo GTPv1
    • 擴展的檢查
    • 支持IDS的正則匹配
  • 腳本語言
    • 圖靈完備
    • 基于事件
    • 特定域數(shù)據(jù)類型
    • 追蹤與管理網(wǎng)絡(luò)狀態(tài)
  • 接口
    • 結(jié)構(gòu)化ASCII日志輸出
    • ElasticSearch和DataSeries后端
    • 將輸入實時整合到分析工具中
    • bro將事件用C庫與其他程序交換
    • 以腳本語言觸發(fā)任意處理

0x02 架構(gòu)

BRO架構(gòu)

從此圖上來看我們可以看到BRO被劃分成兩大組件,其一是核心事件引擎,他會減少進入的數(shù)據(jù)包流,成為一系列高層事件。這些事件反映了網(wǎng)絡(luò)活動。如每個HTTP請求會變成http_request事件,承載了IP地址和端口,請求的URI以及HTTP版本信息。事件不會表達任何深入的意義。

其二是腳本解釋器,他會根據(jù)BRO的腳本語言編寫的程序執(zhí)行一系列事件處理。該腳本會表達站點安全規(guī)則,例如當(dāng)監(jiān)控裝置偵測到不同的活動時BRO該采取什么樣的動作。他們可以從輸入流量中產(chǎn)生任意屬性和統(tǒng)計數(shù)字。腳本語言自帶特定域的類型和支持功能,并允許腳本維護狀態(tài)。腳本能夠生成實時告警也能按需執(zhí)行任意外部程序來觸發(fā)對攻擊的響應(yīng)動作。

0x03 Bro的簇架構(gòu)

Bro不是多線程的,因此一旦到達單處理器核心的限制,唯一的選擇就是將附在分攤到多核心或者多物理機上。簇部署就是針對這樣大系統(tǒng)的場景設(shè)計的解決方案。伴隨Bro的工具和腳本提供了易于管理許多Bro進程的結(jié)構(gòu)來檢查包處理相關(guān)動作,從而形成一個整體。

Bro簇的架構(gòu)

Bro簇主要組件

Tap

劃分數(shù)據(jù)流來形成一個可檢測的拷貝。

前端

前端是一個分離的硬件設(shè)備或主機技術(shù),能夠?qū)⒘髁縿澐譃樵S多的stream或flow。

管理端

管理端進程有兩個主要任務(wù),即從該簇的其他節(jié)點接收日志消息以及提示。其輸出是一個單一的日志,你需要將某行為和后期處理相結(jié)合,你當(dāng)然可以選擇重復(fù)提示。

管理端進程首先由BroControl啟動,僅開放特定端口等待連接,他不會初始任何對其他簇的連接,一旦工作端啟動并連接到管理端,日志和提示將開始從工作端抵達管理端進程。

代理端

管理同步狀態(tài)的進程。變量能夠跨進程自動同步。代理端幫助工作端,減輕工作端之間彼此的直連需求。

工作端

工作端嗅探網(wǎng)絡(luò)流量并做協(xié)議分析。活動簇的絕大部分工作發(fā)生在工作端上,因此工作端需要最快的內(nèi)存和CPU速度。但是其硬盤需求不大,因為日志直接發(fā)給了管理端。

前端選項

設(shè)置前端流分發(fā)器的時候存在許多選項,多數(shù)情況下采取多步驟流分發(fā)具有益處。

cPacket-分離硬件

若是監(jiān)控多個10G網(wǎng)卡,建議使用cFlow或者cVu設(shè)備。這些設(shè)備能通過重寫目的mac地址引發(fā)與特定流關(guān)聯(lián)的包具有相同的目的mac從而實現(xiàn)鏈路層負載均衡。

OpenFlow交換機-分離硬件

使用OpenFlow交換機來直接實現(xiàn)基于流的負載均衡。

PF_RING-主機負載均衡

PF_RING軟件具有簇特征,它會通過大量嗅探同網(wǎng)卡的進程來進行基于流的負載均衡。這會使你輕松利用同一物理機上多核的優(yōu)勢,因為Bro的事件主循環(huán)是單線程,且不能簡單利用所有的核心。

Netmap

基于流的負載均衡

Click!軟路由

簡單配置 基于流的負載均衡。

0x04 安裝

在ubuntu 14.04中安裝較為方便,只需輸入以下代碼即可。

sudo sh -c "echo 'deb http://download.opensuse.org/repositories/network:/bro/xUbuntu_14.04/ /' >> /etc/apt/sources.list.d/bro.list"
sudo apt-get update
sudo apt-get install bro

具體其他系統(tǒng)關(guān)注 Bro安裝手冊

0x05 快速使用bro

以上方法去安裝的bro,root用戶的環(huán)境變量中不會存在bro的可執(zhí)行程序所在的路徑,而bro的安裝目錄的權(quán)限只允許root以及root所在的組訪問,因此我們選擇將可執(zhí)行文件所在的路徑添加進root用戶的環(huán)境變量PATH中。

export PATH=/opt/bro/bin:$PATH

如此一來只需對三個配置文件進行修改就可以完成BroControl的最小安裝,從而完成在本機上的獨立使用。

  1. 修改$PREFIX/etc/node.cfg,設(shè)置監(jiān)聽網(wǎng)卡
  2. 修改$PREFIX/etc/network.cfg,注釋默認設(shè)置,添加本地網(wǎng)絡(luò)作為監(jiān)控對象
  3. 修改$PREFIX/etc/broctl.cfg,設(shè)置MailTo屬性,改為希望發(fā)送告警信息的郵箱,設(shè)置LogRotationInterval屬性,改為將當(dāng)前日志文件夾內(nèi)的文件壓縮的指定頻率,歸檔文件夾以日期命名。

PS:$PREFIX是我們當(dāng)時最初安裝bro所在的目錄。

隨后以root用戶執(zhí)行命令

broctl

就可以進入broctl的shell,初次使用broctl需要先在shell中執(zhí)行install和以start啟動bro實例。由于抓包需要操作系統(tǒng)的root權(quán)限,所以最好是賦予你的賬戶抓包的權(quán)限。

[BroControl] > install
[BroControl] > start

你若是要停止bro實例。

[BroControl] > stop

隨后我們打開瀏覽器,打開網(wǎng)頁,查看$PREFIX/logs/current/http.log就可以看到了Bro對HTTP協(xié)議的分析結(jié)果。見下圖。

基本可以看到其中的時間戳,uid,源地址&端口,目的地址&端口等信息。

部署B(yǎng)ro是一個更新規(guī)則來對不同的時間來采取不同的行為以及使用其腳本語言以一個精確的方式擴展器流量分析能力的遞歸過程。定制Bro過程的第一步是熟悉Bro的notice日志。

當(dāng)我們已經(jīng)定義我們要做的事之后,我們需要知道我們在哪做這些事了。使用Bro的腳本即可完成我們需要的任務(wù)。

Bro腳本

腳本一般裝在$PREFIX/share/bro下且使用.bro擴展名。該目錄下的文件不應(yīng)該被直接編輯因為所做的修改會在升級新版本時丟失。而目錄$PREFIX/share/bro/site下的文件是個例外,指定站點的文件能夠被放置而不必擔(dān)心失敗。

$PREFIX/share/bro/base$PREFIX/share/bro/policy目錄也是主要的腳本目錄。Bro默認加載base文件夾下的腳本,除非使用-b來設(shè)定,該目錄下的腳本處理收集網(wǎng)絡(luò)活動的基礎(chǔ)/有用狀態(tài)或者提供框架/工具來拓展Bro的功能而不損失性能。policy目錄下的腳本更加有條件或存在耗費,因此我們要選擇是否加載這些腳本。

用于BroControl管理的獨立Bro實例的配置的主入口點是腳本$PREFIX/share/bro/site/local.bro,基于他我們可以做一系列修改。

重定義腳本變量

簡單的定制僅需要以自己的值來重定義標準Bro腳本中的變量,使用redef操作符來完成。腳本發(fā)布可調(diào)整的選項的方法是定義有&redef屬性和const修飾的變量。可重定義的常量看起來很奇怪吧,但這意味著該變量的值不能在運行時被修改,但是其初始值能通過redef操作符在解析時修改。

$PREFIX/share/bro/base/frameworks/notice/main.bro中的Notice命名空間在此是必要的,因為變量在模塊Notice中聲明并導(dǎo)出,在模塊外被引用。既然仍在模塊內(nèi),若要引用變量,模塊內(nèi)被聲明和引用的變量不會被納入范圍。

在對該腳本語言記錄域成員的訪問采用$而非.

需要記住的是,若要完成配置的修改需在BroControl中按順序輸入命令checkinstall以及restart

0x06 Bro日志分析

使用日志文件

在Bro日志文件夾下存在多個文件分別對應(yīng)不同的類型的日志。

文件名 作用
conn.log 關(guān)于連接的日志
dpd.log 非標準端口協(xié)議的日志
dns.log dns活動日志
ftp.log ftp會話活動日志
files.log HTTP FTP SMTP 文件日志
http.log http請求和響應(yīng)日志
known_certs.log SSL證書
smtp.log SMTP活動日志
ssl.log SSL會話,包括使用的證書
weird.log 意料外的協(xié)議層活動日志

使用bro-cut工具

這個工具是讀取日志輸出,根據(jù)日志中各項屬性的名字來提取對應(yīng)的值。

處理時間戳

施工中

使用Unique IDs

施工中

0x07 以Bro監(jiān)聽HTTP流量

Bro能夠?qū)⒄麄€HTTP流量記錄到http.log日志中,該日志能夠用于隨后的分析和審計。

這部分的思想和技術(shù)當(dāng)然也可適用于檢測其他不同的協(xié)議。

初識HTTP日志

本日志包含所有的HTTP請求以及響應(yīng)。如下圖所示。

每行都由時間戳,uid,源地址,源端口,目的地址,目的端口組成。UID用于唯一標識一個活動,與UID相對應(yīng)的是一個連接生命周期內(nèi)的源地址-源端口-目的地址-目的端口四值對。其余部分則詳述了這個活動。

偵測代理服務(wù)器

人們配置代理服務(wù)器來請求來自第三方系統(tǒng)的服務(wù)。代理用于管理網(wǎng)絡(luò)并提供更好的封裝特性。代理本身不存在安全威脅,但是一個錯誤配置的或者無鑒權(quán)的代理將使得網(wǎng)絡(luò)內(nèi)外的用戶訪問到任何站點,甚至是進行惡意活動。

代理服務(wù)器間的流量特征

與代理的對話流量長啥樣呢?一般來說流量包含兩部分:

  1. GET請求

  2. HTTP響應(yīng)

     Request: GET http://www.baidu.com/ HTTP/1.1
     Reply:  HTTP/1.0 200 OK
    

這就將代理的流量與瀏覽器同Web服務(wù)器的流量區(qū)分出來了,因為瀏覽器發(fā)出的GET請求不應(yīng)該會有'http'字段。

如此一來我們就可以根據(jù)這個去識別代理服務(wù)器了。

文件檢查

0x08 動手寫腳本

如何理解Bro腳本語言

Bro擁有一個事件驅(qū)動的腳本語言,它能夠為組織提供對Bro功能進行擴展和定制的方法。Bro腳本能夠高效地知會Bro有我們定義的事件發(fā)生了,讓我們獲得連接的信息,因此我們可以對其進行操作。

一般的Bro腳本劃分為三個部分。首先是無縮進的加載庫指令,以@load來加載module中定義的命名空間。隨后是格式化縮進的自定義變量,使用標識符export來將變量寫入腳本的命名空間。最終是對特定時間采取的特定指令。

@load base/frameworks/files
@load base/frameworks/notice
@load frameworks/files/hash-all-files

第一部分由@load命令組成,這些命令能夠執(zhí)行__load__.bro腳本。這些命令能夠加載Files框架,Notice框架以及hash文件框架。

export {
    redef enum Notice::Type += {
        ## The hash value of a file transferred over HTTP matched in the
        ## malware hash registry.
        Match
    };

    ## File types to attempt matching against the Malware Hash Registry.
    const match_file_types = /application\/x-dosexec/ |
                             /application\/vnd.ms-cab-compressed/ |
                             /application\/pdf/ |
                             /application\/x-shockwave-flash/ |
                             /application\/x-java-applet/ |
                             /application\/jar/ |
                             /video\/mp4/ &redef;

    ## The Match notice has a sub message with a URL where you can get more
    ## information about the file. The %s will be replaced with the SHA-1
    ## hash of the file.
    const match_sub_url = "https://www.virustotal.com/en/search/?query=%s" &redef;

    ## The malware hash registry runs each malware sample through several
    ## A/V engines.  Team Cymru returns a percentage to indicate how
    ## many A/V engines flagged the sample as malicious. This threshold
    ## allows you to require a minimum detection rate.
    const notice_threshold = 10 &redef;
}

第二部分定義了枚舉常量,該常量描述了我們會從Notice框架產(chǎn)生的Notice類型。Bro允許重定義常量,這些常量都是非直觀的。Notice類型允許使用NOTICE函數(shù)產(chǎn)生Match類型的Notice。Notice是Bro產(chǎn)生的額外通知。

接下來最后部分本腳本開始定義針對特定事件的指令。

function do_mhr_lookup(hash: string, fi: Notice::FileInfo){
    local hash_domain = fmt("%s.malware.hash.cymru.com", hash);
    when ( local MHR_result = lookup_hostname_txt(hash_domain) ){
        # Data is returned as "<dateFirstDetected> <detectionRate>"
        local MHR_answer = split_string1(MHR_result, / /);
        if ( |MHR_answer| == 2 ){
            local mhr_detect_rate = to_count(MHR_answer[1]);
            if ( mhr_detect_rate >= notice_threshold ){
                local mhr_first_detected = double_to_time(to_double(MHR_answer[0]));
                local readable_first_detected = strftime("%Y-%m-%d %H:%M:%S", mhr_first_detected);
                local message = fmt("Malware Hash Registry Detection rate: %d%%  Last seen: %s", mhr_detect_rate, readable_first_detected);
                local virustotal_url = fmt(match_sub_url, hash);
                # We don't have the full fa_file record here in order to
                # avoid the "when" statement cloning it (expensive!).
                local n: Notice::Info = Notice::Info($note=Match, $msg=message,$sub=virustotal_url);
                Notice::populate_file_info2(fi, n);
                NOTICE(n);
                }
            }
        }
    }
    
event file_hash(f: fa_file, kind: string, hash: string)
{
    if ( kind == "sha1" && f?$info && f$info?$mime_type && match_file_types in f$info$mime_type )
        do_mhr_lookup(hash, Notice::create_file_info(f)); 
}

首先這段腳本中提供了file_hash的事件處理器。file_hash事件允許腳本訪問文件信息中的hash值,其中文件是f,hash函數(shù)是kind,hash值是hash。在file_hash事件處理函數(shù)中存在一個if語句用于檢查hash函數(shù)類型和mime類型是否符合我們感興趣的類型,隨后調(diào)用do_mhr_lookup函數(shù)。其中when語句可以執(zhí)行異步操作,而不影響性能。

事件隊列與處理器

Bro的腳本是事件驅(qū)動的,它依賴于處理由Bro生成的事件,會修改事件的數(shù)據(jù)結(jié)構(gòu)狀態(tài),根據(jù)信息做出決策。

Bro核心將事件放置到有序的事件隊列中,允許處理器按先到先服務(wù)的原則處理他。事件和事件處理方式對于理解Bro以及腳本語言很關(guān)鍵。Bro產(chǎn)生的事件可以通過在線事件文檔查閱。

連接記錄數(shù)據(jù)類型

連接記錄數(shù)據(jù)類型傳遞大量Bro定義的事件,連接記錄本身是嵌套數(shù)據(jù)類型,用于追蹤連接在其生命周期中的狀態(tài)。由于Bro能夠進行包層的處理,其強項在于源點和目的點之間的連接上下文。

數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)

Scope 域:Local和Global

要了解Bro的原生數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)得先掌握可用的scope和正確的使用時刻。Bro里有兩種聲明變量的方法(1. SCOPE name: TYPE 2. SCOPE name = EXPRESSION),變量聲明的時候可以帶也可以不帶定義。若EXPRESSION的結(jié)果是TYPE類型的,那么兩者效果相同。

全局變量

某腳本中的使用Global聲明的變量能夠在其他腳本中被訪問。腳本使用module關(guān)鍵字會給腳本一個命名空間,我們必須更加關(guān)注全局變量的聲明。當(dāng)全局變量在有用命名空間的腳本中聲明時,我們的變量將會有兩個輸出。其一是命名空間的輸出,使用同樣命名空間的腳本將可以訪問聲明的變量,而使用不同命名空間或無命名空間的將不能訪問變量。若全局變量以export {...}聲明,變量就可以被任何腳本以MODULE::variable_name的方式來訪問了。

當(dāng)module關(guān)鍵字在腳本中使用時,就是說腳本中export出來的的變量被加入到了module后的命名空間中了。當(dāng)全局變量未在模塊內(nèi)聲明時,它可以按其名字來訪問,而聲明在模塊內(nèi)部的全局變量就必須導(dǎo)出且通過MODULE_NAME::VARIABLE_NAME來訪問。

常量

Bro利用const關(guān)鍵字來定義常量。不同于全局變量的是,若使用了&redef,常量只能在解析時設(shè)置與修改。運行時,常量是無法改動的。重定義的常量是用作配置選項的容器。

局部變量

數(shù)據(jù)結(jié)構(gòu)

基本數(shù)據(jù)類型

數(shù)據(jù)類型 描述
int 64位有符號整數(shù)
count 64位無符號整數(shù)
double 雙精度浮點數(shù)
bool 布爾型
addr IPv4/v6地址
port 傳輸層端口
subnet 子網(wǎng)掩碼
time 絕對時間
interval 時間間隔
pattern 正則表達式

sets

Sets用于存儲統(tǒng)一數(shù)據(jù)類型不可重復(fù)的元素,是集合的概念。Sets的聲明方式為SCOPE var_name : set[TYPE]。使用adddelete語句可以添加和刪除集合中的元素。可以使用in操作符來遍歷集合中的元素。

tables

Tables里是鍵值對的映射關(guān)系,鍵唯一而值不唯一。

Tables的鍵可以是由多個數(shù)據(jù)類型的變量,或者是名為'tuple‘的元素序列構(gòu)成。Bro因表的復(fù)雜變得靈活,人們也為其靈活付出了巨大的代價。

vectors

向量為我們提供了以下標訪問unsigned integer的數(shù)組的方法,然而他更加高效,且能夠允許順序訪問。當(dāng)我們需要連續(xù)存儲相同類型的數(shù)據(jù)時,就可以使用向量。因為向量對其中元素采取連續(xù)存儲的方法,對于向量中的元素我們就能以從0開始的偏移量來進行訪問了。

聲明一個向量需這么做SCOPE v: vector of T,其中v是變量名,T是數(shù)據(jù)類型。

使用for語句可以快速遍歷向量。

for (i in vector)
    print vector[i] ;

詳述基本數(shù)據(jù)類型

addr

地址類型。IPv4用默認的點分隔四段格式類型,IPv6則用方框包住了整個地址。

port

端口類型。<unsigned integer>/<protocol name>22/tcp,53/udp。Bro支持TCP,UDP,ICMP以及UNKNOWN作為支持的協(xié)議類型。ICMP實際并不具有實際的端口,BRO以ICMP消息類型和ICMP消息碼的方式支持ICMP端口的概念。

端口號可以用==或者!=來進行比較或者排序,協(xié)議之間也有順序,即unknown<tcp<udp<icmp,如65535/tcp就比0/udp小。

subnet

子網(wǎng)類型。Bro對CIDR標記的子網(wǎng)類型能夠完全支持,這樣我們就無需以兩個獨立的實體來管理IP以及子網(wǎng)掩碼了。

在Bro腳本里,通常不需要任何網(wǎng)絡(luò)分析,只需要使用address in subnet就可以對IP地址是否屬于該子網(wǎng)進行判斷,如10.0.0.1 in 10.0.0.0/8就會返回true。

time

我們不能自己創(chuàng)建time常量,但是可以通過兩個函數(shù)network_timecurrent_time來返回一個time數(shù)據(jù)類型,這兩個返回的time標準不同:current_time返回OS設(shè)置的墻上時間;而network_time返回的是在線數(shù)據(jù)流或離線數(shù)據(jù)包中處理的最后一個報文中的時間戳。這兩個時間的表達形式都是以秒計數(shù)的,使用函數(shù)strftime可以將其轉(zhuǎn)換成可閱讀的形式,就像這樣:strftime("%Y/%M/%d %H:%m:%S",network_time())。這里用到了時間戳的格式化字符串,具體有哪些格式化字符串和都代表啥意思,就得看我在justniffer使用手冊里介紹的部分了。

interval

時間間隔,作為一個數(shù)據(jù)類型它代表著時間差,表示方法就是數(shù)值常量后跟著一個時間單位,如3 hr。Bro支持以下時間單位

符號 含義
usec 微秒
msec 毫秒
sec
min
hr
day

時間間隔變量中間的空格可有也可無。當(dāng)然時間單位也分為單復(fù)數(shù),雖然都可以表示。和上一句話的意思結(jié)合起來就是42hrs42 hr是一個意思,都對。時間間隔可為負數(shù),- 10 mins表示10分鐘之前。

在Bro里時間間隔可以加減乘除,也可以進行比較。兩個time類型相減會返回一個時間間隔。

Pattern

正則表達式。Bro當(dāng)然支持在腳本中采用正則表達式來對文本進行快速的搜索,我們生聲明的正則表達式對象以兩個/來包裹正則文本。常用的匹配方式是采用in操作符,如pattern in string

split函數(shù)則是通過匹配的正則表達式來劃分字符串,輸出一個表,和python里差不多。

正則表達式和字符串之間可以使用==!=來進行比較,當(dāng)字符串完全與正則表達式匹配時,==返回true,否則就返回false,另一個操作符反之。

record數(shù)據(jù)類型

Bro支持多種數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),當(dāng)然也支持創(chuàng)建自定義的數(shù)據(jù)類型,這個數(shù)據(jù)類型由基本數(shù)據(jù)類型以及數(shù)據(jù)結(jié)構(gòu)組成。這樣的自定義類型采用type關(guān)鍵字來定義record數(shù)據(jù)類型,就像在c里用typedef和struct定義新的結(jié)構(gòu)體。

聲明一個record數(shù)據(jù)類型時,應(yīng)采用一個類型描述名和幾個獨立的域。如:

type Service: record {
    name: string;
    ports: set[port];
    rfc: count;
};

當(dāng)然record數(shù)據(jù)類型也可以進行嵌套,如:

type System: record {
    name: string;
    services: set[Service];
    };

type也可以用于給某數(shù)據(jù)結(jié)構(gòu)改名,如type addr_set: set[addr];

定制日志

為了理解Bro中的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),最好的辦法自然是閱讀bro的框架。框架里最吸引人的是Logging框架。為了設(shè)計一個能夠抽象創(chuàng)建文件并添加有序有組織的數(shù)據(jù)到這個文件中的過程,Logging框架使用潛在的命名系統(tǒng)。Log Streams,Filters和Writers用于維護高速進入的日志。

我們將基于腳本中的決策將數(shù)據(jù)寫入Log Stream,其中的一條日志記錄將以 名-值 對填充到其值域中。隨后數(shù)據(jù)將被過濾,修改,重定向到Logging Filter。Filter能夠用于截斷日志文件或者復(fù)制信息到其他輸出。數(shù)據(jù)的最終輸出由Writer來定義,默認情況下日志輸出是以tab來分割的ASCII文件,當(dāng)然日志也支持DataSeriesElasticsearch(其writer還在開發(fā)中)。

看到這么多的新名詞和新思路是不是有點暈了呢?是不是覺得Logging Framework很難用很難學(xué)呢?

其實按En Wiki的說法,Logging Framework的學(xué)習(xí)曲線不是很陡峭。Logging Framework的大部分腳本對于初學(xué)者來說不一定要全部讀完。實際上,寫入日志文件,定義數(shù)據(jù)格式,讓Bro知道要創(chuàng)建一個新的日志,調(diào)用Log::write方法輸出日志都很簡單。

所以說日志框架的話,你照著他寫的越多,自己寫的越多,你就越會把他當(dāng)成你的第二語言。

在Logging Framework中每個默認log stream都會產(chǎn)生一個自定義時間,該事件能夠被任何想基于寫入的數(shù)據(jù)做些事的人處理。這些事件是log_x的格式,其中x是logging stream的名字。例如由HTTP解析器發(fā)送給LoggingFramework的日志所引發(fā)的的事件都被稱作log_http

我們可以在創(chuàng)建logging stream的時候?qū)α鬟M行配置,設(shè)置他可以引發(fā)的事件,事件一般以global log_x:event(var:Type);在export中聲明。隨后在其他腳本中使用以下腳本來處理事件。

event log_x( var : Type){}

這樣就可以完成指定事件的處理了。具體應(yīng)用到我們的流量事件觸發(fā)處理操作還需進一步研究。

發(fā)出提醒

學(xué)習(xí)中

0x09 Bro IDS

學(xué)習(xí)中

0x0A 獲取HTTP請求中的POST數(shù)據(jù)

我們想在輸出的HTTP日志中添加一列,該列為HTTP請求中的POST數(shù)據(jù)。這樣我們就在PREFIX/share/bro/site/local.bro中添加一部分腳本,用以實現(xiàn)該功能。添加的代碼為:

@load base/protocols/http

module HTTP_PostBody;

export {
    ## The length of POST bodies to extract.
    const extract_length = 100 &redef;
}

redef record HTTP::Info += {
    post_body: string &log &optional;
};

event log_post_bodies(f: fa_file, data: string)
{
    for ( cid in f$conns )
        {
        local c: connection = f$conns[cid];
        if ( ! c$http?$post_body )
            c$http$post_body = "";

        c$http$post_body = c$http$post_body + data;
        if ( |c$http$post_body| > extract_length )
            {
            c$http$post_body = c$http$post_body[0:extract_length] + "...";
            Files::remove_analyzer(f, Files::ANALYZER_DATA_EVENT, [$stream_event=log_post_bodies]);
            }
        }
}

event file_over_new_connection(f: fa_file, c: connection, is_orig: bool)
{
    if ( is_orig && c?$http && c$http?$method && c$http$method == "POST" )
        {
        Files::add_analyzer(f, Files::ANALYZER_DATA_EVENT, [$stream_event=log_post_bodies]);
        }
}

如下圖


0x0B Bro優(yōu)缺點

優(yōu)勢

  1. 開源
  2. 有腳本能夠?qū)ζ漭敵龅娜罩具M行定制
  3. 存在控制臺可以讓系統(tǒng)作為守護進程,通過讀取配置文件以及腳本完成日常的流量分析和日志記錄工作
  4. 腳本由事件驅(qū)動,可以根據(jù)特殊的系統(tǒng)日志情況進行有針對性的操作
  5. 能夠以分布式部署在多臺機器上,對多個網(wǎng)絡(luò)進行監(jiān)控,并通過網(wǎng)絡(luò)將數(shù)據(jù)集中到服務(wù)器,統(tǒng)一篩選查看

劣勢

  1. 腳本語言復(fù)雜,初次接觸難以很快上手
  2. 系統(tǒng)復(fù)雜,要對其進一步定制需要大量時間
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內(nèi)容