浅析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则是根据超时来结束记录

关键字段

第一个数据包时间 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

查看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

查看发送数据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

查找扫描行为最多的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日志里面最重要的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隧道流量解析结果,通过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访问阀值,超出阀值则进行告警,例如每分钟请求这种

域名超过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

查看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

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日志,判断是否存在危险函数(例如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

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180731G1B4NX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券