Hace ya tiempo hablamos en este blog del uso de Netflow para analizar nuestra red y la posibilidad de detectar patrones de tráficos sospechosos.
Dado que para analizar tráfico, una de las formas habituales es disponer de un port mirror configurado en la electrónica de red enviando el tráfico interesante hacia nuestro NIDS, y no siempre existe la posibilidad de recibir tráfico Netflow directamente de los dispositivos, si no necesitamos el payload de la comunicaciones, por ejemplo para sacar información estadística o buscar anomalías, podemos usar herramientas para enviar el tráfico recibido como flujo Netflow y proceder a analizarlos. Para este post, usaremos Softflowd para realizar dicho envío.
[Disclaimer: existen otras herramientas, seguramente más actualizadas o con mayores funcionalidades, pero he decidido usar esta por sencillez.]
Una vez instalada la herramienta a través de nuestro gestor de paquetes favorito, indicamos en el fichero /etc/default/softflowd la interfaz a través de la cual voy a recibir el tráfico y el destino donde enviamos el flujo Netflow:
INTERFACES = "eth1" OPTIONS = "-n 10.10.10.1:9995"
Y arrancamos el servicio:
root@debian:# /etc/init.d/softflowd start
En nuestro caso, para depurar el correcto funcionamiento, lo arrancamos directamente desde la consola, lo que nos permite ver el tráfico que recibe y que convierte en flujos:
softflowd -i eth1 -n 10.10.10.1:9995 -D softflowd v0.9.9 starting data collection Exporting flows to [10.10.10.1]:9995 ADD FLOW seq:1 [10.10.10.1]:41302 <> [10.10.10.10]:22 proto:6 ADD FLOW seq:2 [10.10.10.216]:60272 <> [239.255.255.250]:1900 proto:17 ADD FLOW seq:3 [10.10.10.116]:50295 <> [239.255.255.250]:1900 proto:17 ADD FLOW seq:4 [10.10.10.216]:5353 <> [224.0.0.251]:5353 proto:17
Con la opción statistics podemos obtener información más detallada del tipo de tráfico recibido:
root@debian:# softflowctl statistics softflowd[10123]: Accumulated statistics since 2019-02-20T08:58:43 UTC: Number of active flows: 565 Packets processed: 227026 Fragments: 0 Ignored packets: 192535 (192535 non-IP, 0 too short) Flows expired: 23668 (2336 forced) Flows exported: 23668 in 3884 packets (0 failures) Packets received by libpcap: 419562 Packets dropped by libpcap: 0 Packets dropped by interface: 4294967290 Expired flow statistics: minimum average maximum Flow bytes: 46 26208 593533285 Flow packets: 1 8 78647 Duration: 0.00s 37.93s 7483.87s Expired flow reasons: tcp = 49 tcp.rst = 0 tcp.fin = 12 udp = 15458 icmp = 5813 general = 0 maxlife = 0 over 2 GiB = 0 maxflows = 2336 flushed = 0 Per-protocol statistics: Octets Packets Avg Life Max Life Unknown (6): 606248816 111105 31.12s 234.52s Unknown (17): 12177738 62378 34.40s 7483.87s Unknown (58): 1875904 25985 45.24s 3615.52s
El siguiente paso es usar nfcapd para recolectar los flujos enviados por softflowd y almacenarlos. A partir de aquí, es indiferente quien envía el tráfico, si un dispositivo de red o un software que convierte el formato.
El servicio de nfcapd tiene que estar escuchando en el mismo puerto por el que softflowd envía el tráfico; como siempre, para depurar, lo lanzamos desde la consola, indicando donde almacena los flujos de tráfico recibidos:
root@debian:# nfcapd -w -l /var/cache/nfdump -P /var/run/nfcapd.pid Add extension: 2 byte input/output interface index Add extension: 4 byte input/output interface index Add extension: 2 byte src/dst AS number Add extension: 4 byte src/dst AS number Bound to IPv4 host/IP: 10.10.10.1, Port: 9995 Startup. Init IPFIX: Max number of IPFIX tags: 62 Process_v9: [0] Add template 1024 Process_v9: [0] Add template 2048
Por lo que en el directorio de logs, podemos ya ver los flujos almacenados:
root@debian:# ls -l /var/cache/nfdump -rw-r--r-- 1 root root 29172 feb 20 12:25 nfcapd.201902201220 -rw-r--r-- 1 root root 29652 feb 20 12:30 nfcapd.201902201225 -rw-r--r-- 1 root root 32788 feb 20 12:35 nfcapd.201902201230 -rw-r--r-- 1 root root 276 feb 20 12:40 nfcapd.current.10126
Llegados a este punto, solo quedaría analizar la información obtenida, lo cual podemos hacer por ejemplo con nfdump:
root@debian:# nfdump -R /var/cache/nfdump/ Date first seen Duration Proto Src IP Addr:Port Dst IP Addr:Port Packets Bytes Flows 2019-02-20 12:21:45.404 147.307 UDP 10.10.3.120:5353 -> 224.0.0.251:5353 2 123 1 2019-02-20 12:24:16.637 0.000 UDP 10.10.10.61:52421 -> 224.0.0.252:5355 1 58 1 2019-02-20 12:24:34.959 0.000 UDP 172.17.1.127:60537 -> 10.10.3.255:8082 1 168 1 2019-02-20 12:24:38.673 0.000 UDP 10.10.3.120:43697 -> 255.255.255.255:138 1 229 1 2019-02-20 12:14:13.350 633.080 UDP 172.17.2.42:138 -> 10.10.3.255:138 26 5786 1 2019-02-20 12:24:41.153 6.936 UDP 10.10.3.86:60544 -> 239.255.255.250:3702 7 4788 1 2019-02-20 12:24:51.319 6.945 UDP 10.10.3.86:60545 -> 239.255.255.250:3702 7 4788 1 2019-02-20 12:29:42.885 16.754 TCP 10.10.10.87:41302 -> 172.17.2.10:22 53 3168 1 2019-02-20 12:29:42.885 16.754 TCP 172.17.2.10:22 -> 10.10.10.87:41302 44 6248 1 2019-02-20 12:25:04.026 3.002 UDP 10.10.3.238:5353 -> 224.0.0.251:5353 6 408 1 2019-02-20 12:26:37.072 0.000 UDP 10.10.10.90:57245 -> 239.255.255.253:11427 1 180 1 2019-02-20 12:31:23.854 23.862 TCP 10.10.10.87:41302 -> 172.17.2.10:22 80 5536 1 2019-02-20 12:31:23.854 23.862 TCP 172.17.2.10:22 -> 10.10.10.87:41302 44 5728 1 2019-02-20 12:26:57.947 6.457 UDP 10.10.3.86:60272 -> 239.255.255.250:3702 7 4564 1 2019-02-20 12:27:21.888 6.954 UDP 10.10.3.86:51347 -> 239.255.255.250:3702 7 4788 1 2019-02-20 12:27:29.587 0.000 UDP 10.10.10.237:5353 -> 224.0.0.251:5353 1 175 1 2019-02-20 12:27:38.772 0.000 UDP 10.10.3.154:53600 -> 10.10.3.255:19375 1 69 1 2019-02-20 12:27:32.006 7.010 UDP 10.10.3.86:58520 -> 239.255.255.250:3702 7 4788 1 2019-02-20 12:28:00.521 0.000 UDP 10.10.3.4:38140 -> 255.255.255.255:138 1 229 1 2019-02-20 12:28:00.633 0.000 UDP 10.10.3.105:54205 -> 10.10.3.255:137 1 78 1
Dado que toda la información en bruto puede ser tediosa de analizar, podemos jugar con las opciones de filtrado y visualización que nos proporciona nfdump, y por ejemplo, buscar solo flujos de tráfico SSH.
root@debian:# nfdump -R /var/cache/nfdump/ 'port 22' 2019-02-20 12:29:42.885 16.754 TCP 172.17.2.10:22 -> 10.10.10.87:41302 44 6248 1 2019-02-20 12:29:42.885 16.754 TCP 10.10.10.87:41302 -> 172.17.2.10:22 53 3168 1
Adicionalmente, podemos formatear la salida para que sirva de entrada a un sistema de representación gráfica y ver, de forma más cómoda, los flujos de tráfico capturados; como he dicho antes, existen otras herramientas para representar conexiones de red.
Una vez realizado todo este proceso, es trabajo del analista buscar patrones de tráfico sospechosos, siempre teniendo presente que no tenemos el payload, como pueden ser conexiones de administración sin cifrar, flujos de tráfico DNS que un número elevado de bytes, incrementos del volumen de conexiones de un puerto o una IP, etc.