一、功能概述

BRO 是一个开源功能强大的流量分析工具,主要用于协议解析异常检测,行为分析等,bro还为用户提供了事件驱动的bro脚本语言。

  • 协议解析

站点部署BRO所能获得的最直接好处就是获得日志文件的扩展集,这些文件在高层次记录网络的行为。这些日志文件不仅全方位记录了所有线路上可见的每个连接,还记录了应用层传输,例如HTTP会话以及请求的URL、关键头、MIME类型、服务器反馈,DNS请求及反应,SSL证书,SMTP会话的关键内容等等。默认情况下BRO将这些信息写进结构化,tab键分隔的日志文件(通过配置也可以使输出日志的格式为json)中以供其他软件后续处理。当然我们也可以选择其他输出格式和后端来和数据库对接。

 

  • 安全检测

bro还有内建函数来完成分析和检测任务,包括在HTTP会话中取文件,在与其他注册点对接时监测恶意软件,报告脆弱的软件版本,识别web应用监测SSH暴力破解,认证SSL证书链等等。

 

  • 安全检测扩展

从根本上来看是一个全定制化和可扩展的流量分析平台。BRO为用户提供了特定域的,完备的脚本语言用于表达任意的分析任务。你可以将BRO视作特定域的Python或者Perl。如同Python,BRO自带大量预建功能,即标准库。如此你将不受限于系统,而能以编写自己的代码的方式来使用BRO。事实上BRO的默认分析,如日志就是基于这些脚本的,核心系统中没有硬编码任何特定分析。即分析检测功能都是在脚本语言实现的。

二、特征

部署

Unix-like系统上运行

基于监控端口和网络窃听装置的全被动分析

标准libpcap的抓包接口

线上&线下分析

支持簇的大规模部署

统一管理框架

开源

 

分析

离线分析和取证的全面日志记录

应用层协议的独立端口分析

支持多种应用层协议 DNS FTP HTTP IRC SMTP SSH SSL

应用层协议交换的文件内容分析

全IPv6支持

隧道检测与分析 Ayiya Teredo GTPv1

扩展的检查

支持IDS的正则匹配

 

脚本语言

图灵完备

基于事件

特定域数据类型

追踪与管理网络状态

 

接口

结构化ASCII日志输出

ElasticSearch和DataSeries后端

将输入实时整合到分析工具中

bro将事件用C库与其他程序交换

以脚本语言触发任意处理

 

  • 实现架构

组件架构

 

其一是核心事件引擎,他会减少进入的数据包流,成为一系列高层事件。这些事件反映了网络活动。如每个HTTP请求会变成http_request事件,承载了IP地址和端口,请求的URI以及HTTP版本信息。事件不会表达任何深入的意义

其二是脚本解释器他会根据BRO的脚本语言编写的程序执行一系列事件处理。该脚本会表达站点安全规则,例如当监控装置侦测到不同的活动时BRO该采取什么样的动作。他们可以从输入流量中产生任意属性和统计数字。脚本语言自带特定域的类型和支持功能,并允许脚本维护状态。脚本能够生成实时告警也能按需执行任意外部程序来触发对攻击的响应动作。

详细架构图如下:

Bro的簇架构

Bro不是多线程的,因此一旦到达单处理器核心的限制,唯一的选择就是将附在分摊到多核心(绑核)或者多物理机上。簇部署就是针对这样大系统的场景设计的解决方案。伴随Bro的工具和脚本提供了易于管理许多Bro进程的结构来检查包处理相关动作,从而形成一个整体。

Bro簇的架构

 

 

 

Bro簇主要组件

Tap

划分数据流来形成一个可检测的拷贝。//我理解应该就是指端口镜像或流量镜像

前端

前端是一个分离的硬件设备或主机技术,能够将流量划分为许多的stream或flow。

管理端

管理端进程有两个主要任务,即从该簇的其他节点接收日志消息以及提示。其输出是一个单一的日志,你需要将某行为和后期处理相结合,你当然可以选择重复提示。

管理端进程首先由BroControl启动,仅开放特定端口等待连接,他不会初始任何对其他簇的连接,一旦工作端启动并连接到管理端,日志和提示将开始从工作端抵达管理端进程。

代理端

管理同步状态的进程。变量能够跨进程自动同步。代理端帮助工作端(指Worker),减轻工作端之间彼此的直连需求。

工作端

工作端嗅探网络流量并做协议分析。活动簇的绝大部分工作发生在工作端上,因此工作端需要最快的内存和CPU速度。但是其硬盘需求不大,因为日志直接发给了管理端。

前端选项

设置前端流分发器的时候存在许多选项,多数情况下采取多步骤流分发具有益处。

cPacket-分离硬件 //小字这部分我理解应该是专指Front部分可实现的几种分流方案

若是监控多个10G网卡,建议使用cFlow或者cVu设备。这些设备能通过重写目的mac地址引发与特定流关联的包具有相同的目的mac从而实现链路层负载均衡。

OpenFlow交换机-分离硬件

使用OpenFlow交换机来直接实现基于流的负载均衡。

PF_RING-主机负载均衡

PF_RING软件具有簇特征,它会通过大量嗅探同网卡的进程来进行基于流的负载均衡。这会使你轻松利用同一物理机上多核的优势,因为Bro的事件主循环是单线程,且不能简单利用所有的核心。

Netmap

基于流的负载均衡

软路由

简单配置 基于流的负载均衡。

Dynamic Protocol Detection(DPD)

Port-based Protocol Analysis

了解DPD之前,我们先了解一下Port-based Protocol Analysis。这是传统NIDS的检测协议的方式,根据端口来判断使用的是哪一种协议。如80端口认为是http协议,443端口认为是https协议等。这种方式有点是简单,但是缺点也是显而易见,这种方式像ftp协议也是分析不了的。

DPD简介

Bro使用动态协议检测框架,我们将分析器树与每个连接关联起来。此树可以包含任意数量的各种分析器,并且可以在连接的整个生命周期内进行修改。即我们可以动态启用/禁用分析器。它提供了两个功能:

  • 可以独立于端口执行协议分析。通过使用一组匹配典型协议对话的签名,Bro通过查看payload以匹配正确的分析器。当这样的签名匹配时,它将打开相应的分析器。
  • 当分析程序明显地解析错误的协议时,我们可以关闭它们。这允许我们使用松散的协议签名,如果有解析错误,可以并行多个分析程序分析。

DPD协议签名

有固定格式协议协议通过特征提取即可识别,而对于无固定格式协议,无法采用通用方法提取协议指纹,而只能针对特定协议特定分析提取协议指纹的可能性。所幸的是,属于该类型的应用层协议很少。因此,对于这种情形可以单独对待。如下为http协议签名样例:

signature dpd_http_client {

  ip-proto == tcp

  payload /^[[:space:]]*(GET|HEAD|POST)[[:space:]]*/

  tcp-state originator

}

 

signature dpd_http_server {

ip-proto == tcp

payload /^HTTP\/[0-9]/

tcp-state responder requires-reverse-signature dpd_http_client

enable "http"

}

四、安装部署

安装:https://docs.zeek.org/en/stable/install/install.html#id1

  1. 安装依赖

sudo yum install cmake make gcc gcc-c++ flex bison libpcap-devel openssl-devel python-devel swig zlib-devel

  1. 安装bro

源码安装:git clone --recursive https://github.com/zeek/zeek 

./configure

make

make install

 

二进制包安装 https://www.zeek.org/download/packages.html //非常方便、建议,还自动安装证书私钥。

cd /etc/yum.repos.d/

wget http://download.opensuse.org/repositories/network:bro/CentOS_7/network:bro.repo

yum install bro

  1. 设置环境变量

export PATH=/opt/bro/bin:$PATH

  1. 常用配置文件
  • 修改$PREFIX/etc/node.cfg,设置监听网卡 //PS:$PREFIX是我们当时最初安装bro所在的目录。s

    配置监视的节点:$EDITOR /usr/local/bro/etc/node.cfg

[bro]

type=standalone

host=localhost

interface=eth0

inferface的值是本机公网网口

 

  • 修改$PREFIX/etc/network.cfg,注释默认设置,添加本地网络作为监控对象

 

   配置监视节点的网络

$EDITOR /usr/local/bro/etc/networks.cfg

# List of local networks in CIDR notation, optionally followed by a

# descriptive tag.

# For example, "10.0.0.0/8" or "fe80::/64" are valid prefixes.

10.0.0.0/8          Private IP space

172.16.0.0/12       Private IP space

192.168.0.0/16      Private IP space

#删除这三条或者注释掉这三条内容,然后输入服务器的公用和专用 IP 空间

 

  • 修改$PREFIX/etc/broctl.cfg,设置MailTo属性,改为希望发送告警信息的邮箱,设置LogRotationInterval属性,改为将当前日志文件夹内的文件压缩的指定频率,归档文件夹以日期命名。

$EDITOR /usr/local/bro/etc/broctl.cfg   #配置邮件设置

# Recipient address for emails sent out by Bro and BroControl

MailTo = admin@example.com

 

五、使用

以root用户启动

/usr/local/bro/bin/broctl   #启动bro

/usr/local/bro/bin/broctl status  #查看运行状态

初次使用broctl需要先在shell中执行install和以start启动bro实例。由于抓包需要操作系统的root权限,所以最好是赋予你的账户抓包的权限。

[BroControl] > install

[BroControl] > start

你若是要停止bro实例。

[BroControl] > stop

随后我们打开浏览器,打开网页,查看$PREFIX/logs/current/http.log就可以看到了Bro对HTTP协议的分析结果。见下图。

基本可以看到其中的时间戳,uid,源地址&端口,目的地址&端口等信息。

部署Bro是一个更新规则来对不同的时间来采取不同的行为以及使用其脚本语言以一个精确的方式扩展器流量分析能力的递归过程。定制Bro过程的第一步是熟悉Bro的notice日志。

当我们已经定义我们要做的事之后,我们需要知道我们在哪做这些事了。使用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

 

Bro脚本

脚本一般装在$PREFIX/share/bro下且使用.bro扩展名。该目录下的文件不应该被直接编辑因为所做的修改会在升级新版本时丢失。而目录$PREFIX/share/bro/site下的文件是个例外,指定站点的文件能够被放置而不必担心失败。

$PREFIX/share/bro/base和$PREFIX/share/bro/policy目录也是主要的脚本目录。Bro默认加载base文件夹下的脚本,除非使用-b来设定,该目录下的脚本处理收集网络活动的基础/有用状态或者提供框架/工具来拓展Bro的功能而不损失性能。policy目录下的脚本更加有条件或存在耗费,因此我们要选择是否加载这些脚本

用于BroControl管理的独立Bro实例的配置的主入口点是脚本$PREFIX/share/bro/site/local.bro,基于他我们可以做一系列修改。

Bro的脚本有自己独特的一套语法,这部分内容较多,后续再单独研究,这里暂时跳过。

重定义脚本变量 //这部分没太理解后续再深入研究

简单的定制仅需要以自己的值来重定义标准Bro脚本中的变量,使用redef操作符来完成。脚本发布可调整的选项的方法是定义有&redef属性和const修饰的变量。可重定义的常量看起来很奇怪吧,但这意味着该变量的值不能在运行时被修改,但是其初始值能通过redef操作符在解析时修改。

$PREFIX/share/bro/base/frameworks/notice/main.bro中的Notice命名空间在此是必要的,因为变量在模块Notice中声明并导出,在模块外被引用。既然仍在模块内,若要引用变量,模块内被声明和引用的变量不会被纳入范围。

在对该脚本语言记录域成员的访问采用$而非.。

需要记住的是,若要完成配置的修改需在BroControl中按顺序输入命令check、install以及restart。

需求:如果http的get请求的uri中包含passwd敏感词则报警。

脚本如下:

 

event http_request(c: connection, # Connection.

                                method: string, # HTTP method.

                                original_URI: string, # Requested URL.

                                unescaped_URI: string, # Decoded URL.

                                version: string) # HTTP version.

{

    if ( method == "GET" && unescaped_URI == /.*passwd/ )

        NOTICE(...); # Alarm.

}

 

日志分析

在Bro日志文件夹下存在多个文件分别对应不同的类型的日志。

日志类型  

诊断日志: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

关于连接的日志

dpd.log

非标准端口协议的日志

dns.log

dns活动日志

ftp.log

ftp会话活动日志

files.log

HTTP FTP SMTP 文件日志

http.log

http请求和响应日志

known_certs.log

SSL证书

smtp.log

SMTP活动日志

ssl.log

SSL会话,包括使用的证书

weird.log

意料外的协议层活动日志

使用bro-cut工具

这个工具是读取日志输出,根据日志中各项属性的名字来提取对应的值。

 

Berkeley Lab Cyber Security Team(伯克利实验室网络安全团队)Bro集群部署规模

 

分析流量:100g

使用的机器数量:5台物理机

每台机器配置:128g内存,12核心cpu,120g SSD盘+1T机械硬盘

部署情况:每台机器部署一个Proxy和10个Worker

参考地址:https://commons.lbl.gov/display/cpp/100G+Intrusion+Detection

 

Bro http日志中记录额外字段

参考链接:https://github.com/lishengjia/bro_scripts

 

提升Bro抓包性能

默认Bro使用libpcap抓包。这种方式会导致大量的中断和kernel到用户空间的数据切换,从而造成大量的cpu开销。PF_RING 是一个高速数据包捕获库,通过它可以实现将通用 PC 计算机变成一个有效且便宜的网络测量工具箱,进行数据包和现网流量的分析和操作。同时支持调用用户级别的API来创建更有效的应用程序。相比传统抓包方式,主要特点是减少了数据包在传输中的拷贝次数,来降低cpu的消耗。

Bro默认使用libpcap抓包,但是也支持PF_RING和PF_RING + DNA方式抓包。具体见如下链接:https://www.bro.org/documentation/load-balancing.html

 

Bro从一台机器的多个网卡同时抓取流量

 

修改配置bro的node配置文件如下:

 

vim /usr/local/bro/etc/node.cfg

[logger]

type=logger

host=1.1.1.1

 

[manager]

type=manager

host=1.1.1.1

 

[proxy-1]

type=proxy

host=1.1.1.1

 

[worker-1]

type=worker

host=1.1.1.1

interface=eth0

#lb_method=pf_ring
#lb_procs=8
#pin_cpus=1,2,3,4,5,6,7,8

[worker-2]

type=worker

host=1.1.1.1

interface=eth1

#lb_method=pf_ring
#lb_procs=8
#pin_cpus=9,10,11,12,13,14,15,16

Bro优缺点

优势

  1. 开源
  2. 有脚本能够对其输出的日志进行定制
  3. 存在控制台可以让系统作为守护进程,通过读取配置文件以及脚本完成日常的流量分析和日志记录工作
  4. 脚本由事件驱动,可以根据特殊的系统日志情况进行有针对性的操作
  5. 能够以分布式部署在多台机器上,对多个网络进行监控,并通过网络将数据集中到服务器,统一筛选查看

劣势

  1. 脚本语言复杂,初次接触难以很快上手
  2. 系统复杂,要对其进一步定制需要大量时间


 

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐