bro框架-- 檔案分析
檔案分析(File Analysis)
檔案分析框架(FAF)為檔案相關的資訊提供了一個一般的表示形式。
檔案生命週期事件(File Lifecycle Events),在一個檔案的生命週期中有file_new, file_over_new_connection, file_timeout, file_gap, file_state_remove等事件。處理這些事件可以提供一些關於檔案的資訊,比如當前有什麼樣的網路連線,是何種協議在傳輸檔案,到目前為止已經傳送了多少位元組,它的MIME型別是什麼。
一個簡單的例子:
File_analysis_01.bro
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;
}
# bro -r http/get.trace file_analysis_01.bro
file_state_remove
FakNcS1Jfe01uljb3
CHhAvVGS1DHFjwGM9
[orig_h=141.142.228.5, orig_p=59856/tcp, resp_h=192.150.187.43, resp_p=80/tcp]
HTTP
connection_state_remove
CHhAvVGS1DHFjwGM9
[orig_h=141.142.228.5, orig_p=59856/tcp, resp_h=192.150.187.43, resp_p=80/tcp]
HTTP
上例沒有做什麼有趣的分析,但很好地展示了連線分析和檔案分析之間的相似點。連線(connection)是由通常的五元祖和一個uid標識。檔案由一個與連線uid一樣的字串來標識。
新增分析 我們有可以附加到檔案上的內建的檔案分析器。一旦附加到檔案上,它們(檔案分析器)便開始接受檔案的內容(Bro從網路連線上獲取的)。它們對檔案內容作何種處理就取決於具體的檔案分析器實現了。它們要麼通過事件來報告關於檔案的更多資訊(比如,Files::ANALYZER_MD5會報告檔案的MD5校驗和(一旦file_hash計算結束)),要麼它們會有一些副作用(比如Files::ANALYZER_EXTRACT會將檔案的內容寫出到本地檔案系統)。
未來會有自動附加到檔案(基於啟發[heuristics]的)上的檔案分析器,與連線的動態協議探測框架(dynamic protocol detection framework)相似,但總會要求一個顯式的附加決定(Ann explicit attachment decision)。
下例說明了如何使用MD5檔案分析器去計算一個明文檔案的MD5:
event file_sniff(f: fa_file, meta: fa_metadata)
{
if ( ! meta?$mime_type ) return;
print "new file", f$id;
if ( meta$mime_type == "text/plain" )
Files::add_analyzer(f, Files::ANALYZER_MD5);
}
event file_hash(f: fa_file, kind: string, hash: string)
{
print "file_hash", f$id, kind, hash;
}
# bro -r http/get.trace file_analysis_02.bro
new file, FakNcS1Jfe01uljb3
file_hash, FakNcS1Jfe01uljb3, md5, 397168fd09991a0e712254df7bc639ac
有一些檔案會有可調諧引數用於在呼叫中指定
Files::add_ananlyzer :
event file_new(f: fa_file)
{
Files::add_analyzer(f, Files::ANALYZER_EXTRACT,
[$extract_filename="myfile"]);
}
在這個例子中,檔案抽取分析器不會生成任何事件,但是可以將檔案內容寫到本地檔案系統中去(由FileExtract::prefix和字串myfile拼接起來)。當然,對於有不止一個檔案傳輸的網路而言,最好為每個問價提供不同的解壓路徑,與這個例子不同。
不管是哪個檔案解析器對檔案進行了操作,關於這個檔案的基本資訊(比如大小,資料傳輸時間,MIME型別等)都會被記錄在files.log中。
輸入框架整合(Input Framework Integration)
FAF可以很方便地跟輸入框架進行整合,所以Bro可以從不同的外部源分析檔案,就如同Bro分析從網路介面中監視得到的流量而生成的檔案。僅需要呼叫Input::add_analysis
redef exit_only_after_terminate = T;
event file_new(f: fa_file)
{
print "new file", f$id;
Files::add_analyzer(f, Files::ANALYZER_MD5);
}
event file_state_remove(f: fa_file)
{
print "file_state_remove";
Input::remove(f$source);
terminate();
}
event file_hash(f: fa_file, kind: string, hash: string)
{
print "file_hash", f$id, kind, hash;
}
event bro_init()
{
local source: string = "./myfile";
Input::add_analysis([$source=source, $name=source]);
}
注意fa_file的“source”域和Input::AnalysisDescription的“name”域相對應(因為輸入框架用這個域來唯一地標識一個輸入流)。
上面的指令碼的輸出可能如下(假設一個名為myfile的檔案存在):
# bro file_analysis_03.bro
new file, FZedLu4Ajcvge02jA8
file_hash, FZedLu4Ajcvge02jA8, md5, f0ef7081e1539ac00ef5b761b4fb01b3
file_state_remove
沒有什麼特別的東西,但至少證實了MD5檔案解析器讀取了輸入檔案的所有位元組並且正確地計算出了它的校驗和!