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則是根據超時來結束記錄
關鍵字段
-
第一個數據包時間 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日誌
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
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
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 協議統計
下面重點說一下conn.log日誌裏面最重要的conn_state 字段,bro會爲每個連接記錄分析連接狀態s0 連接請求被丟棄,一般屬於掃描行爲,客戶端對服務器發送syn請求,服務器直接丟棄,開啓防火牆被阻斷時就會出現s0狀態。
SF 正常建立和終止,三次握手與四次揮手以完成。流統計信息完整
暴力破解行爲可以根據SF狀態來判斷,duration連接時間短,發送請求字節沒有明顯差距,一些加密協議可以通過連接時間、發送/接受字節等來大概判斷是否存在爆破行爲,爆破是否成功。
下圖是ssh正常登陸記錄 主要取源ip 源端口 目標ip 目標端口 協議 連接時間 發送字節 接受字節 conn_state狀態這幾個字段
ssh爆破流量 對比上圖結果顯而易見 連接時間與字節數沒有太大變化
REJ連接嘗試被拒絕,對應着TCP連接,端口關閉時的場景,客戶端對服務器端口發送syn請求服務器響應RST。
源ip對不同目的端口REJ記錄一般是端口掃描,但是內網機器對外網單個端口大量REJ記錄極有可能是連接一些失效的ioc地址
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
下 圖是從網上找的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裏
另外則是通過dns 頻率檢測dns隧道,相同域名只累計一次 ,腳本來源:https://github.com/jbaggs/anomalous-dns
以分鐘爲週期,設置好每分鐘dns訪問閥值,超出閥值則進行告警,例如每分鐘請求這種1.baidu.com、2.baidu.com、3.baidu .com域名超過20次訪問記錄下來。
查看告警信息
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日誌
搜索沒有referer 直接訪問php文件記錄
或是搜索一些攻擊特徵,黑客工具特徵,信息泄露,弱口令等
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: Bro、dnscat工具、dns日誌、REJ、SSH、客戶端、日誌、比對域名、流量分析工具、流量日誌分析、爆破、解析日誌