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解析后的各种日志文件怎么去分析。
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
诊断日志: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 等等
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地理位置
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