BRO 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:
- Motor de eventos (event engine): Reduce el flujo de paquetes, organizándolos para ser llevados a un nivel superior.
- 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:
- stand alone: para administrar BRO de forma habitual (un nodo).
- 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: