淺析bro網絡流量分析

0x00 概述

BRO 是一個開源功能強大的流量分析工具,主要用於協議解析(conn/dce_rpc/dhcp/dnp3/dns/ftp/http/irc /kerberos/modbus/mysql/ntlm/radius/rdp/rfb/sip/smb/smtp/snmp/socks/ssh /ssl/syslog/tunnel),異常檢測,行爲分析等,bro還爲用戶提供了事件驅動的bro腳本語言。本文不講怎麼安裝配置,主要是講通過 bro解析後的各種日誌文件怎麼去分析。

 

0x01 bro命令

bro

-r  讀取一個pcap進行分析

-i ens3 選擇監聽接口

-C 禁用校驗和

-f 捕獲流量時進行過濾

分析本地pcap包

bro  -r ms08067-meterpreter-reverse-tcp-alpha.pcapng   -C local

bro  –i ens3 local –C 開啓bro監聽就會在當前目錄下生成各種日誌,輸入local會選擇bro/share/bro/site/local.bro文件,local.bro 文件控制加載那些bro腳本,想要加載sql注入檢測腳本直接添加@load  protocols/http/detect-sqli

 

 

 0x02 日誌類型  

診斷日誌:capture_loss.log、loaded_scripts.log、stats.log、packet_filter.log 

會話日誌:conn.log

告警信息:weird.log  協議錯誤、notice.log bro腳本產生的告警

協議解析日誌:dns.log、files.log、http.log、sip.log、snmp.log、ssh.log、ssl.log、x509.log 等等

 

 0x03 流量日誌分析

conn.log   會話記

會話記錄實際上對應着netflow信息,將五元組(源ip、源端口、目標ip、目標端口、協議)相同的會話創建一個記錄,tcp流量會根據正常揮手或rst來結束記錄udp/icmp則是根據超時來結束記錄

1.jpg

 

關鍵字段   

  • 第一個數據包時間 ts      

  • 源ip  id.orig_h       

  • 源端口id.orig_p  

  • 目標ip:id.resp_h  

  • 目標端口id.resp_p        

  • 協議proto  

  • 服務service 

  • 連接時間 duration      

  • 發送字節數  orig_bytes   

  • 接受字節 resp_bytes       

  • 連接狀態 conn_state

通過自帶的bro-cut工具來解析bro日誌,在後面輸入字段就會自動提取 -d ts 是將原來的時間戳轉化成正常時間顯示,默認會以TAB分隔字段

bro-cut -d ts id.orig_h id.orig_p id.resp_h id.resp_p service duration orig_bytes resp_bytes conn_state<conn.log   查看bro conn.log日誌

2.jpg

bro-cut -d ts id.orig_h id.orig_p id.resp_h id.resp_p service  duration orig_bytes resp_bytes conn_state<conn.log|sort -k 8 -nr |head -n  10  查看發送數據orig_bytes最大的前10個ip

3.jpg

 bro-cut -d ts id.orig_h  id.orig_p id.resp_h id.resp_p service duration orig_bytes resp_bytes  conn_state<conn.log|awk '$10=="REJ"{print $0}'|awk '{print $2}'|sort|uniq -c  |sort -nr |head -n 10   查找掃描行爲最多的ip

4.jpg

 

bro-cut -d ts id.orig_h id.orig_p id.resp_h id.resp_p service  duration orig_bytes resp_bytes conn_state<conn.log|awk '{ a[$6]++ } END {  for(i in a) { print i " : " a[i] } }'|sort -t ':' -k 2 -rn|head -n  10  協議統計

5.jpg

 

下面重點說一下conn.log日誌裏面最重要的conn_state 字段,bro會爲每個連接記錄分析連接狀態s0 連接請求被丟棄,一般屬於掃描行爲,客戶端對服務器發送syn請求,服務器直接丟棄,開啓防火牆被阻斷時就會出現s0狀態。

6.jpg

SF  正常建立和終止,三次握手與四次揮手以完成。流統計信息完整

7.jpg

 

暴力破解行爲可以根據SF狀態來判斷,duration連接時間短,發送請求字節沒有明顯差距,一些加密協議可以通過連接時間、發送/接受字節等來大概判斷是否存在爆破行爲,爆破是否成功。

下圖是ssh正常登陸記錄 主要取源ip 源端口 目標ip 目標端口 協議 連接時間 發送字節 接受字節 conn_state狀態這幾個字段

8.jpg

ssh爆破流量 對比上圖結果顯而易見 連接時間與字節數沒有太大變化 

9.jpg

REJ連接嘗試被拒絕,對應着TCP連接,端口關閉時的場景,客戶端對服務器端口發送syn請求服務器響應RST。

 

源ip對不同目的端口REJ記錄一般是端口掃描,但是內網機器對外網單個端口大量REJ記錄極有可能是連接一些失效的ioc地址

10.jpg

 

dns.log dns請求與響應

dns日誌會記錄五元組與dns請求域名、請求類型、解析結果等,日誌中應重點關注一些dns txt記錄/超長請求域名/心跳包請求檢測。

bro-cut  -d ts id.orig_h id.orig_p id.resp_h id.resp_p query qtype_name answers  <dns.log

11.jpg

下 圖是從網上找的dns隧道流量解析結果,通過dnscat工具生成,識別dns隧道的一個簡單思路可以通過域名長度/域名訪問頻率/TXT記錄+白名單 (例如互聯網排名前100w域名列表http://s3.amazonaws.com/alexa-static/top-1m.csv.zip)方式實 現,通過白名單對比可以過濾掉一些超長CDN域名或者其他容易產生誤報的請求,如果一個域名請求長度大於90域名又不在top  100w域名列表中訪問又十分頻繁,那麼極有可能是dns隧道產生的記錄。目前可以通過bro裏dns-bad_behavior.bro腳本來記錄超 長請求域名/超長響應域名/非53端口dns請求,domain_stats工具用來比對域名是否在100w列表裏,這些都集成在了 securityonion裏

12.jpg

另外則是通過dns 頻率檢測dns隧道,相同域名只累計一次 ,腳本來源:https://github.com/jbaggs/anomalous-dns

以分鐘爲週期,設置好每分鐘dns訪問閥值,超出閥值則進行告警,例如每分鐘請求這種1.baidu.com、2.baidu.com、3.baidu  .com域名超過20次訪問記錄下來。

13.jpg

 

查看告警信息 

14.jpg

http.log   http協議解析日誌

重 點字段:五元組,method 請求模式,host 主機,uri, referrer 來源,user_agent ua標識,request_body_len 請求體長度 response_body_len響應體長度,status_code 響應狀態嗎,username/password  401認證用戶名與密碼,orig_mime_types  MIME類型 ,post_body post請求數據需要加載bro腳本,cookie_vars  通過腳本提取的cookie信息

記錄http post 請求需要在bro/share/bro/site/local.bro 添加@load policy/misc/http-extract-post.bro

bro-cut -d ts id.orig_h id.orig_p id.resp_h id.resp_p method host uri  status_code post_body<http.log    查看httplog日誌

15.jpg

 

搜索沒有referer 直接訪問php文件記錄

16.jpg

或是搜索一些攻擊特徵,黑客工具特徵,信息泄露,弱口令等

 

ssl.log SSL協議解析日誌

常用字段:五元組信息,SSL版本,加密算法,服務器名稱,證書信息,ja3

bro-cut -d ts id.orig_h id.orig_p id.resp_h  id.resp_p version server_name<ssl.log

bro 裏面加入了對ja3工具的支持,ja3主要用於ssl客戶端指紋識別,在客戶端與服務端進行ssl連接時,將Client  Hello 裏面SSLVersion,Cipher,SSLExtension,EllipticCurve,EllipticCurvePointFormat字 段提取出來,然後做hash處理 相同軟件產生的hash也會一樣,這種方法有點類似user-agent標識那樣 ja3地址:https://github.com/salesforce/ja3

舉個例子,這是一條ssl日誌記錄,將裏面ja3生成的hash與github上提取列表進行對比

https://raw.githubusercontent.com/trisulnsm/trisul-scripts/master/lua/frontend_scripts/reassembly/ja3/prints/ja3fingerprint.json

可以判斷這是chrome程序產生的流量,如果維護好ja3白名單,分析一些罕見的ja3記錄也許能有意想不到的效果,但也容易產生一些誤報

 

mysql.log mysql協議解析日誌

常用字段:五元組、cmd動作、arg執行命令、success是否執行成功、rows列數

bro-cut -d ts id.orig_h id.orig_p id.resp_h id.resp_p cmd arg  success<mysql.log

分析mysql.log日誌,判斷是否存在危險函數(例如load_file/into outfile/system/updatexml)查詢,或是來自外網可疑ip登陸

 

ssh.log SSH登陸記錄

常用字段:五元組、auth_success登陸狀態、client客戶端版本、server服務器版本、cipher 加密算法

bro-cut -d ts id.orig_h id.orig_p id.resp_h id.resp_p auth_success client  <ssh.log

bro支持動態協議檢測(DynamicProtocolDetection)如果協議使用非標準端口也能被識別,在tcp流量payload中匹配協議特徵,一旦命中將採用特定協議解析

 

ssh協議在建立三次握手後,服務器會主動將ssh 版本信息傳送給客戶端,bro就是通過這點來判斷ssh協議,用正則在payload開始處匹配ssh版本號

 

下圖記錄ssh登陸時解析的結果,linux系統中winscp使用scp或sftp這種非交互式shell登陸時last/lastlog不會記錄,但會在bro裏留下客戶端軟件信息

 

審計ssh.log 發現異常登陸或爆破行爲,下圖是使用metasploit  ssh_login爆破產生的ssh客戶端信息

 

Splunk裏查看SSH登陸ip地理位置

 

 0x04 參考來源

https://github.com/Security-Onion-Solutions/security-onion/wiki

https://scholarworks.iu.edu/dspace/bitstream/handle/2022/21529/2017%20GPN%20AHM%20Security%20Log%20Analysis%20training.pdf?sequence=1

https://github.com/salesforce/ja3

https://www.jianshu.com/p/a58d04df8322

https://www.bro.org/sphinx/index.html

 

Tags: Brodnscat工具dns日誌REJSSH客戶端日誌比對域名流量分析工具流量日誌分析爆破解析日誌

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章