Zeek - Sistema de monitorización (1)
En esta serie de artículos se procederá al estudio y análisis de la herramienta de monitorización actualmente conocida como Zeek [1].
Estos artículos son parte de un trabajo que realicé junto con Adrián Bazán durante el Máster de Ciberseguridad.
Zeek es un sistema de detección de intrusos (IDS) basado tanto en anomalías como en firmas. A través de la monitorización y captura del tráfico genera una serie de eventos, como pueden ser inicios de sesión, conexión por un determinado puerto… [2]
Zeek es un software open source. Su desarrollo lo comenzó Vern Paxson en los años 90s para conocer lo que ocurría en las redes de su laboratorio y universidad. El proyecto comenzó con el nombre de Bro, pero a finales de 2018, para celebrar su desarrollo y expansión, decidieron renombrarlo a Zeek.
Zeek se encarga de observar de forma silenciosa y discreta el tráfico de la red. Zeek interpreta lo que ve y crea logs, archivos o salidas personalizadas que puedan ser analizadas de forma manual o a través de otras herramientas como un SIEM.
Las principales características de Zeek son [3]:
- Adaptabilidad: Políticas de monitorización específicas a través de un lenguaje de script propio.
- Efectividad: Redes de alto rendimiento.
- Flexibilidad: No está restringido a un enfoque de detección particular.
- Forense: Registra todo lo que ve y proporciona archivos de alto nivel.
- Análisis en profundidad: Cuenta con analizadores para muchos protocolos por defecto.
- Interfaces abiertas: Puede intercambiar información en tiempo real con otras aplicaciones.
- Open Source: Licencia BSD.
Escenario
En un terreno ideal el monitoreo se haría poniendo el equipo con Zeek conectado a un puerto de un switch con “Port Mirroring” activo, de esta forma la conexión de la red seguiría tal cual y todos los paquetes se replicarían hacia ese puerto donde está conectada la herramienta de monitoreo, en este caso Zeek, para poder analizar el tráfico de la red.
En nuestro caso queremos realizar una prueba de concepto con los recursos que tenemos, por lo que el escenario preparado para llevar a cabo el monitoreo y uso de la herramienta consiste en configurar un equipo con Zeek como punto de acceso intermedio entre el router y los equipos de la red local que quieren conectarse a Internet. Así pues, todo el tráfico pasará por Zeek y se podrá realizar su monitoreo.
Zeek se está ejecutando sobre el sistema operativo Kali Linux 2020.1. A través del uso de la herramienta create_ap [4] se ha establecido un punto de acceso que será donde el resto de equipos se conectarán:
Nos conectaremos a la red a través de RedMonitorizada. La red local para este escenario generado estará compuesta por un ordenador y un smartphone de trabajadores. También habrá un servidor con múltiples servicios, malas configuraciones y muy desactualizado, lo que implica que sea vulnerable. Y, por último, un equipo desconocido y sospechoso que hará de potencial atacante, en este caso será un smartphone que se ha conseguido conectar a la red.
A continuación, podemos ver el diagrama de red del sistema anteriormente expuesto.
Despliegue
La herramienta puede ser instalada en Mac o Linux. En nuestro caso hemos realizado el despliegue sobre máquinas Linux, concretamente en un sistema Linux basado en Debian.
En primer lugar, instalamos las dependencias necesarias [5] con el siguiente comando:
sudo apt-get install cmake make gcc g++ flex bison libpcap-dev libssl-dev python-dev swig zlib1g-dev
Una vez instalados todos los requisitos necesarios pasamos a descargar el código fuente de la herramienta usando Git:
git clone –recursive https://github.com/zeek/zeek
Posteriormente accedemos al repositorio descargado y ejecutamos los siguientes tres comandos para proceder con su instalación:
./configure
make
make install
Después de esto, si todo ha salido correctamente, deberíamos tener Zeek instalado en la ruta /usr/local/zeek. Lo siguiente, para poder utilizar el comando desde cualquier ruta, sería incluir el bin al PATH, para ello se puede utilizar, por ejemplo, el siguiente comando:
export PATH=/usr/local/zeek/bin:$PATH
Para probar su funcionamiento podemos usarlo sobre una captura de tráfico de prueba como es attack-trace.pcap. Para analizar una captura podemos usarlo de la siguiente forma:
Podemos ver como Zeek nos ha dividido la captura del tráfico en diferentes registros, pero esta funcionalidad la estudiaremos más detenidamente en capítulos posteriores.
Zeek también cuenta con una shell interactiva para su manejo llamada ZeekControl. Para la instalación de esta shell interactiva hay que dirigirse a la carpeta /usr/local/zeek/bin y ejecutar el comando:
python zeekctl install
Después de esto ya podremos utilizar el comando ‘zeekctl’ para acceder a ZeekControl. En el primer acceso es recomendable ejecutar el comando ‘deploy’ para la generación de ficheros de configuración:
En cuanto a los ficheros de configuración, los tenemos en la carpeta /etc/ de Zeek que por defecto debe estar situada en /usr/local/zeek/etc/. Ahí dentro podemos ver tres ficheros de configuración, que son los siguientes:
En el archivo networks.cfg tendremos que indicar las diferentes redes que se van a analizar desde Zeek. En nuestro caso se hará un monitoreo sobre una única red que hemos definido en el archivo:
En el archivo de configuración node.cfg se indica la interfaz para monitorear. En nuestro caso utilizaremos la interfaz ap0 creada con la herramienta create_ap.
Y por último tenemos el archivo zeekctl.cfg donde se sitúan todas las variables de configuración de Zeek. Aquí podemos destacar las variables MailTo, que indicará a donde se enviarán los emails de notificación de Zeek, o la variable LogRotationInterval, que indica cada cuanto se irán comprimiendo y almacenando los logs recogidos, por defecto está a 3600 segundos, es decir, una hora. Desde aquí también se pueden modificar las direcciones donde se irán almacenando los logs o activar/desactivar determinados logs que genera Zeek.
Pulsa aquí para continuar con la segunda parte del artículo.
Referencias
[1] The Zeek Network Security Monitor
[2] Mejores IDS Opensource para Detección de Intrusiones
[4] oblique/create_ap: This script creates a NATed or Bridged WiFi Access Point.