Analizando nuestra red (IV)

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.