BRO IDS: “el ojo que todo lo ve…”

broidsBRO es una herramienta open-source para el análisis de tráfico de red cuyo objetivo es reconocer actividades sospechosas.

El análisis de red reporta varios tipos de registros divididos según el protocolo y características como puede ser HTTP, DNS, SSL, FTP, sesiones IRC, SMTP, etc.

Para la captura de paquetes utiliza libpcap. Es capaz de analizar y detectar túneles (incluyendo Ayiya, Teredo, GTPv1) además de desencapsularlos para luego analizar su contenido.

Arquitectura

Se basa en dos componentes:

  1. Motor de eventos (event engine): Reduce el flujo de paquetes, organizándolos para ser llevados a un nivel superior.
  2. Interprete de Scripts (policy script interpreter): acciones a tomar cuando se detecta una actividad determinada.

Instalación

(La instalación se ha hecho en un sistema Debian Wheezy)

apt-get install cmake make gcc g++ flex bison libpcap-dev libssl-dev python-dev swig zlib1g-dev libgeoip-dev
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
cp GeoLiteCity.dat /usr/share/GeoIP/GeoIP
cd /usr/local/src
http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz
tar -xvzf libunwind-1.1.tar.gz
cd libunwind-1.1
./configure && make && make install
wget https://googledrive.com/host/0B6NtGsLhIcf7MWxMMF9JdTN3UVk/gperftools-2.3.90.tar.gz
tar xzf gperftools-2.3.90.tar.gz
./configure && make && make install
wget  https://www.bro.org/downloads/release/bro-2.4.tar.gz 
tar -xvzf bro-2.4.tar.gz
cd bro-2.4
./configure –enable-perftool
make
make install
export PATH=/usr/local/bro/bin:$PATH

BroControl

BroControl es una shell interactiva para el manejo de BRO que tiene dos modos de operación:

  1. stand alone: para administrar BRO de forma habitual (un nodo).
  2. cluster mode: múltiples nodos actuando en conjunto para conseguir balanceo de la carga (BRO es mono-núcleo y puede trabajar con varios nodos para repartir el trabajo).

Instalación de broctl (modo stand alone):

cd /usr/local/bro/bin
python broctl install
creating policy directories ...
installing site policies ...
generating standalone-layout.bro ...
generating local-networks.bro ...
generating broctl-config.bro ...
generating broctl-config.sh ...
updating nodes ...

Ejecución de broctl:

./usr/local/bro/bin/broctl
Welcome to BroControl 1.4
Type "help" for help.

La primera vez que se usa broctl es recomendable usar el comando deploy (chequea la configuración de BRO: broctl.cfg, node.cfg y networks.cfg). El resto de veces se puede usar el comando start, pero si los ficheros de configuración nombrados antes se modifican, se deberá usar deploy.

[BroControl] > deploy
checking configurations ...
installing ...
removing old policies in /usr/local/bro/spool/installed-scripts-do-not-touch/site ...
removing old policies in /usr/local/bro/spool/installed-scripts-do-not-touch/auto ...
creating policy directories ...
installing site policies ...
generating standalone-layout.bro ...
generating local-networks.bro ...
generating broctl-config.bro ...
generating broctl-config.sh ...
updating nodes ...
stopping ...
bro not running
starting ...
starting bro ...

Comando status para ver el estado de BRO:

[BroControl] > status
Getting process status ...
Getting peer status ...
Name         Type       Host          Status    Pid    Peers  Started
bro          standalone localhost     running   31540  0      08 Jul 16:02:43

Para ver los scripts:

[BroControl] > scripts

 /usr/local/bro/share/bro/base/files/x509/__load__.bro
 /usr/local/bro/share/bro/base/files/x509/main.bro
 /usr/local/bro/share/bro/base/files/hash/__load__.bro
 /usr/local/bro/share/bro/base/files/hash/main.bro

 [...]

Ver estadísticas de tráfico de red:

[BroControl] > capstats

Interface             kpps       mbps       (10s average)
----------------------------------------
localhost/eth0        0.0        0.0

Mostrar la configuración:

[BroControl] > config
bindir = /usr/local/bro/bin
bro = /usr/local/bro/bin/bro
bro-expect-running = True
bro-host = localhost
bro-pid = 31540
bro-port = 47760
broargs = 
brobase = /usr/local/bro
[…]

En el caso de tener varios nodos en funcionamiento, se pueden detallar con el siguiente comando (en este caso solo muestra uno, el propio del equipo):

BroControl] > nodes
bro - addr=::1 aux_scripts= brobase= count=1 env_vars= ether= host=localhost interface=eth0 lb_interfaces= lb_method= lb_procs= name=bro pin_cpus= test_mykey= type=standalone zone_id=

Name         Type       Host          Pid     Proc    VSize  Rss  Cpu   Cmd
bro          standalone localhost     31540   parent  184M    45M  25%  bro
bro          standalone localhost     31542   child    97M    37M   0%  bro

Con el comando stop paramos la captura. Aquí se muestra la lista de procesos, una vez ejecutada la captura en BroControl:

ps aux|grep bro

root     11505  0.0  0.0  10812  1544 ?        S    13:16   0:00 /bin/bash /usr/local/bro/share/broctl/scripts/run-bro -1 -i eth0 -U .status -p broctl -p broctl-live -p standalone -p local -p bro local.bro broctl broctl/standalone broctl/auto
root     11511 33.4  1.1 179304 45584 ?        Rl   13:16   1:54 /usr/local/bro/bin/bro -i eth0 -U .status -p broctl -p broctl-live -p standalone -p local -p bro local.bro broctl broctl/standalone broctl/auto
root     11513  0.0  0.9  95296 38196 ?        SN   13:16   0:00 /usr/local/bro/bin/bro -i eth0 -U .status -p broctl -p broctl-live -p standalone -p local -p bro local.bro broctl broctl/standalone broctl/auto

Para ver los log que se están capturando en tiempo real hay que visualizar el contenido de logs/current:

ls -l /usr/local/bro/logs/current/

-rw-r--r-- 1 root root   593 jul  9 13:16 communication.log
-rw-r--r-- 1 root root 14786 jul  9 13:23 conn.log
-rw-r--r-- 1 root root   384 jul  9 13:21 dhcp.log
-rw-r--r-- 1 root root 11056 jul  9 13:23 dns.log
-rw-r--r-- 1 root root  1185 jul  9 13:20 files.log
-rw-r--r-- 1 root root   327 jul  9 13:21 known_services.log
-rw-r--r-- 1 root root 20008 jul  9 13:16 loaded_scripts.log
-rw-r--r-- 1 root root   226 jul  9 13:16 packet_filter.log
-rw-r--r-- 1 root root   667 jul  9 13:16 reporter.log
-rw-r--r-- 1 root root    46 jul  9 13:16 stderr.log
-rw-r--r-- 1 root root   188 jul  9 13:16 stdout.log
-rw-r--r-- 1 root root  1918 jul  9 13:23 weird.log
-rw-r--r-- 1 root root   985 jul  9 13:20 x509.log

Una vez parada la captura los guarda en una carpeta con el nombre de la fecha y el día en /usr/local/bro/logs/ de forma comprimida:

ls /usr/local/bro/logs/2015-07-08/

communication.16:02:43-16:25:20.log.gz  dhcp.16:09:28-16:25:20.log.gz  http.16:11:55-16:25:20.log.gz     notice.16:22:43-16:25:20.log.gz   ssl.16:06:12-16:25:20.log.gz
conn.16:02:58-16:25:20.log.gz    dns.16:03:12-16:25:20.log.gz
[…]

Bro se puede lanzar de forma manual sin ayuda de BroControl, eligiendo las redes internas y la interfaz de la siguiente forma:

/usr/local/bro/bin/bro -ieth0 local "Site::local_nets += {192.168.1.0/24, 192.168.101.0/24, 172.10.0.0/16}"

Otra forma es definir primero las redes internas en el siguiente fichero:

vi /usr/local/bro/share/bro/site/local.bro

# This script detects DNS results pointing toward your Site::local_nets
# where the name is not part of your local DNS zone and is being hosted
# externally.  Requires that the Site::local_zones variable is defined.
@load protocols/dns/detect-external-names

redef Site::local_nets = {
        10.0.0.0/8,     # Red privada.
        192.168.0.0/16, # Red privada.
        172.16.0.0/12,  # Red privada.
};

También se puede definir la interfaz de captura y el tipo (standalone, es decir un solo nodo):

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

# This is a complete standalone configuration.  Most likely you will
# only need to change the interface.
[bro]
type=standalone
host=localhost
interface=eth0

Tipos de logs:

  • conn-log: todas las conexiones vistas.
  • notice.log: todas las conexiones potencialmente interesantes reorganizadas por BRO.

Políticas, directivas y plugins

Dentro de /usr/local/bro/share/bro/site/local.bro es donde se indica qué plugins, políticas y scripts van a ser cargados en el inicio. Se hace con la clausula «@load«. Por ejemplo, para cargar un script propio (en este caso, estando en el directorio /usr/local/bro/share/bro/site/, cargamos el fichero custom_script.bro):

@load custom_script

Existen muchos scripts en internet hechos por la comunidad, que se pueden descargar por ejemplo de:

Las políticas se dividen en frameworks, integration, misc, protocols y tuning. Se encuentran en /usr/local/bro/share/bro/policy/. Estas políticas deciden qué se captura (HTTP, DNS, RDP…) y cómo se captura el tráfico (búsqueda de patrones, reglas, etc…).

Las opciones generales de BRO se pueden configurar en /usr/local/bro/etc/broctl.cfg.

Además, BroControl tiene la posibilidad de integración de plugins escritos en python, que se encuentran en /usr/local/bro/lib/broctl/plugins. Éstos sirven para realizar acciones determinadas en BroControl antes o después de ejecutar una orden o crear nuestros propios comandos.

Visualización de Log

Para visualizar los logs se puede usar awk o bro-cut (/usr/local/bro/bin/bro-cut). En los ejemplos se usa bro-cut para facilitar la tarea. Con esta herramienta podemos visualizar las columnas que interesen y en el orden elegido de entre aquellas que aparecen al inicio del log:

1. conn.log

zcat /usr/local/bro/logs/2015-07-09/conn.17:31:55-17:35:26.log.gz|/usr/local/bro/bin/bro-cut ts id.orig_h id.orig_p id.resp_h id.resp_p proto orig_bytes|more 

1436455895.486565  172.20.3.31  5353   224.0.0.251    5353  udp  214
1436455895.486769  172.20.3.16  5353   224.0.0.251    5353  udp  214
1436455905.935003  172.20.3.31  42754  172.20.1.10      53  udp  86
1436455914.932816  172.20.3.31  49904  172.20.1.10      53  udp  84
1436455923.120296  172.20.3.31  56397  216.58.210.163  443  tcp  0
1436455918.937119  172.20.3.31  40130  172.20.1.10      53  udp  84
1436455931.674040  172.20.3.31  58464  216.58.211.206  443  tcp  711
1436455936.634502  172.20.3.31  51913  192.168.4.47   7272  tcp  10702
[…]

2. Resumen de conexiones

zcat /usr/local/bro/logs/2015-07-09/conn-summary.17:31:55-17:35:26.log.gz

>== Outgoing === 2015-07-09-17-31-31 - 2015-07-09-17-35-19
 - Connections  503.0 - Payload 958.1k - 
  Ports        | Sources                   | Destinations                 | Services        | Protocols     | States          |
  53     36.0% | 172.20.3.12#1       57.5% | 172.20.1.10#2          34.4% | -         47.1% | 6       51.9% | S0        40.6% | 
  80     34.2% | 172.20.3.31#3       36.0% | 255.255.255.255#4       4.0% | dns       38.8% | 17      47.5% | SHR       29.2% | 
  443    19.1% | 172.20.3.100#5       3.6% | 216.58.210.206#6        2.8% | http       2.1% | 1        0.6% | OTH       27.6% | 
  10001   3.6% | 172.20.3.16#7        1.2% | 216.58.210.198#8        2.2% | ssl        1.8% |           | SH             1.6% | 
  137     1.4% | 172.20.3.23#9        0.6% | 185.31.18.130#10        2.2% | dhcp       0.2% |           […]

3. DHCP

zcat /usr/local/bro/logs/2015-07-09/dhcp.13:21:06-13:47:10.log.gz

ts          uid  id.orig_h    id.orig_p    id.resp_h  id.resp_p  mac        assigned_ip  lease_time  trans_id

1436440866.978188  CD77rR2aoVO9fEPWp2  172.20.3.12  68  172.20.3.253  67  00:1b:bc:81:b3:89  172.20.3.12  7200.000000  3917337635
[...]

4. DNS

zcat /usr/local/bro/logs/2015-07-09/dns.17:31:38-17:35:26.log.gz|/usr/local/bro/bin/bro-cut ts id.orig_h id.orig_p id.resp_h id.resp_p query qclass qclass_name rcode_name TTLs |more 

1436456086.318043  172.20.3.12  31573  172.20.1.10  53  s0.cyberciti.org  -  -  NOERROR  86400.000000,60.000000,60.000000,60.000000,60.000000,60.000000,60.000000,60.000000,60.000000
1436456086.231939  172.20.3.12  25209  172.20.1.10  53  pagead2.googlesyndication.com  -  -  NOERROR  16.000000,16.000000
1436456086.816385  172.20.3.12  14904  172.20.1.10  53  bid.g.doubleclick.net  -  -  NOERROR  80549.000000,215.000000
1436456086.805647  172.20.3.12   6982  172.20.1.10  53  cas.fr.eu.criteo.com  -  -  NOERROR  789.000000
1436456086.816392  172.20.3.12  45815  172.20.1.10  53  cas.nl.eu.criteo.com  -  -  NOERROR  788.000000
1436456086.805911  172.20.3.12  56462  172.20.1.10  53  cm.g.doubleclick.net  -  -  NOERROR  80177.000000,262.000000
1436456086.805626  172.20.3.12  22517  172.20.1.10  53  fonts.googleapis.com  -  -  NOERROR  3039.000000,127.000000
[…]

5. HTTP (con la opción bro-cut –d la fecha se transforma el formato Epoc a human time):

zcat /usr/local/bro/logs/2015-07-09/http.17:32:26-17:35:26.log.gz|/usr/local/bro/bin/bro-cut -d ts id.orig_h id.orig_p id.resp_h id.resp_p method host uri referrer user_agent filename username password  |more 

2015-07-09T17:32:21+0200  172.20.3.31  42323  193.110.128.199  80  GET  www.marca.com  /  -  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36  -  --
2015-07-09T17:32:22+0200  172.20.3.31  44682  154.53.129.51  80  GET  estaticos03.marca.com  /deporte/img/v3.0/marca-apuestas.png  http://www.marca.com/  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like
 Gecko) Chrome/43.0.2357.130 Safari/537.36  -  -  -
2015-07-09T17:32:22+0200  172.20.3.31  44682  154.53.129.51  80  GET  estaticos03.marca.com  /imagenes/2015/07/09/futbol/equipos/barcelona/1436427993_extras_portada_0.jpg  http://www.marca.com/  Mozilla/5.0 (X11; Linux
 x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36  -  -  -
2015-07-09T17:32:25+0200  172.20.3.31  44682  154.53.129.51  80  GET  estaticos03.marca.com  /deporte/img/v3.0/opinion/espanasemueve.jpg  http://estaticos03.marca.com/deporte/css/v3.1/portada_todos.css  Mozilla/5.0 (X1
1; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36  -  -  -
2015-07-09T17:32:25+0200  172.20.3.31  44682  154.53.129.51  80  GET  estaticos03.marca.com  /deporte/img/v3.0/1px_zonainferior_sindivision.gif  http://estaticos03.marca.com/deporte/css/v3.1/portada_todos.css  Mozilla
/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36  -  -  -
[…]

6. Software

zcat /usr/local/bro/logs/2015-07-09/software.17:32:21-17:35:26.log.gz |more

1436455941.576647  172.20.3.31  -  HTTP::BROWSER  Chrome  43  0  2357  130  -  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36
1436456004.862866  172.20.3.31  -  HTTP::BROWSER  Chrome  43  0  2357  132  -  Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36

7. Ficheros

zcat /usr/local/bro/logs/2015-07-09/files.17:32:55-17:35:26.log.gz|/usr/local/bro/bin/bro-cut ts tx_hosts rx_hosts source analyzers mime_type filename total_bytes md5 extracted |more

1436456089.594059  185.31.19.133  172.20.3.12  SSL  X509,MD5,SHA1  application/pkix-cert  -  -  aaeepcf8b0d8596d2e0cbe67421cf7db  -
1436456089.597102  185.31.19.133  172.20.3.12  SSL  X509,MD5,SHA1  application/pkix-cert  -  -  9262sf3dfffe144f8b461c957e17f819  -
1436456089.597102  185.31.19.133  172.20.3.12  SSL  X509,MD5,SHA1  application/pkix-cert  -  -  aaeepcf8b0d8596d2e0cbe67421cf7db  -
1436456090.673853  85.31.217.175  172.20.3.12  HTTP  MD5,SHA1  image/jpeg  -  -  d2753665ae6cbb83d276fd0312c47bb9  -
1436456090.686528  216.58.210.206  172.20.3.12  HTTP  MD5,SHA1  application/javascript  f.txt  -  2677ave03fc503c1dfe50ed55c9ab45e  -
1436456091.049318  198.199.102.190  172.20.3.12  HTTP  MD5,SHA1  text/html  -  160  9f0b38c9a810496daebc8bd0894ad734  -
1436456091.347570  90.94.53.137  172.20.3.12  HTTP  MD5,SHA1  text/plain  -  -  adf5b8d2e96302466d849dee82703b1d  -
1436456092.071341  198.199.102.190  172.20.3.12  HTTP  MD5,SHA1  text/plain  -  581  727c0b2b9e9305115585ca7635affaff  -
1436456096.447983  74.86.144.194  172.20.3.12  HTTP  MD5,SHA1  image/x-icon  -  1150  7870256daf52ese443424357228f46e8  -
[…]

8. SSL

zcat /usr/local/bro/logs/2015-07-09/ssl.17:32:16-17:35:26.log.gz|/usr/local/bro/bin/bro-cut -d ts id.orig_h id.orig_p id.resp_h id.resp_p version cypher server_name established cert_chain_fuids|more 

2015-07-09T17:32:11+0200  172.20.3.31  58464  216.58.211.206  443  -    clients1.google.com  F  -
2015-07-09T17:32:16+0200  172.20.3.31  48987  173.194.45.87  443  -    www.google.es  F  -
2015-07-09T17:32:22+0200  172.20.3.31  37949  173.194.45.68  443  -    safebrowsing.google.com  F  -
2015-07-09T17:32:24+0200  172.20.3.31  57764  104.83.67.68  443  -    connect.facebook.net  F  -
2015-07-09T17:32:24+0200  172.20.3.31  47948  192.229.233.25  443  -    platform.twitter.com  F  -
2015-07-09T17:33:19+0200  172.20.3.31  56482  216.58.210.163  443  -    www.google.es  F  -
2015-07-09T17:35:00+0200  172.20.3.12  41520  199.96.57.7  443  TLSv11    -  F  FW3Cl5nRZj6aUmVXd,FforNn27NxJS9V6cR6
2015-07-09T17:35:00+0200  172.20.3.12  41519  199.96.57.7  443  TLSv11    -  F  FNcsSe3AXwIBMUXlnb,Fd0L5m1uPJlhShnRXe
2015-07-09T17:35:00+0200  172.20.3.12  41518  199.96.57.7  443  TLSv11    -  F  F48I5m4wbVFMygDXOf,FLirav3GLwGeMgfAb5
2015-07-09T17:35:01+0200  172.20.3.12  44298  199.96.57.6  443  TLSv11    -  F  -
2015-07-09T17:35:00+0200  172.20.3.12  41522  199.96.57.7  443  TLSv11    -  F  FgN1X14PABOund1CS9,FZ7zMm1hy2mzakroC1
2015-07-09T17:34:56+0200  172.20.3.12  54285  185.31.19.134  443  TLSv11    -  F  FYgMaa4Twxjkprxayj,FqAyHtKCG0D8qO5e6
2015-07-09T17:34:51+0200  172.20.3.12  57748  66.51.116.236  443  TLSv10    -  F  -
[...]

9. X509

zcat /usr/local/bro/logs/2015-07-09/x509.17:32:55-17:35:26.log.gz|/usr/local/bro/bin/bro-cut -d ts certificate.version certificate.serial certificate.subject certificate.issuer certificate.key_alg certificate.key_type certificate.key_length san.dnssan.urisan.emailsan.ipbasic_constraints.ca |more 

2015-07-09T17:32:55+0200  3  0C85CCFACE62F3DC  CN=*.google.com,O=Google Inc,L=Mountain View,ST=California,C=US  CN=Google Internet Authority G2,O=Google Inc,C=US  id-ecPublicKey  ecdsa  256  
2015-07-09T17:34:49+0200  3  27DEBBB719698B  CN=*.pleasantsolutions.com,OU=Domain Control Validated  CN=Starfield Secure Certificate Authority - G2,OU=http://certs.starfieldtech.com/repository/,O=Starfield Technologies\\, Inc.,L
=Scottsdale,ST=Arizona,C=US  rsaEncryption  rsa  2048  
2015-07-09T17:34:49+0200  3  0F8B2FB1A2840BE42DAADB14D9317C21  CN=www.github.com,O=Fastly\\, Inc.,ST=California,L=San Francisco,C=US  CN=DigiCert SHA2 High Assurance Server CA,OU=www.digicert.com,O=DigiCert Inc,C=US  rsaEncryption  rsa  2048  
[…]

BRO IDS es un sistema de vigilancia muy completo ya que en una sola herramienta se tiene la posibilidad de capturar tráfico distinguiendo HTTP, SMTP, DNS, etc. Las posibilidades de BRO IDS son muchas, ya que existe una comunidad por detrás que desarrolla herramientas actuales, muy útiles para la detección de amenazas y además existe la opción de integración en sistemas de tratamiento de Log como ELK (Elasticsearch-Logstash-Kibana) o la inserción de logs en una base de datos al estilo de un PassiveDNS.

Fuentes: