浅析bro网络流量分析

2018-07-31 14,126

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

image.png

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上提取列表进行对比

image.png

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

可以判断这是chrome程序产生的流量,如果维护好ja3白名单,分析一些罕见的ja3记录也许能有意想不到的效果,但也容易产生一些误报

image.png


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登陆

image.png


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中匹配协议特征,一旦命中将采用特定协议解析

image.png


ssh协议在建立三次握手后,服务器会主动将ssh 版本信息传送给客户端,bro就是通过这点来判断ssh协议,用正则在payload开始处匹配ssh版本号

image.png


下图记录ssh登陆时解析的结果,linux系统中winscp使用scp或sftp这种非交互式shell登陆时last/lastlog不会记录,但会在bro里留下客户端软件信息

image.png


审计ssh.log 发现异常登陆或爆破行为,下图是使用metasploit  ssh_login爆破产生的ssh客户端信息

image.png


Splunk里查看SSH登陆ip地理位置

image.png


 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


本文作者:al0ne

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/73882.html

Tags:
评论  (0)
快来写下你的想法吧!

al0ne

文章数:4 积分: 53

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号