Monitorizar ataques en Cisco

Recientemente la red de un conocido empezó a tener un tráfico totalmente atípico y sospechando un ataque de DOS (Denegación de servicio) me pidieron mi ayuda.

El método que use para determinar que máquina estaba comprometida es muy sencillo y la mayoría de los administradores de sistemas lo conocen, no obstante lo cuento aquí por si puede ser de utilidad para alguien.

En este caso son routers cisco, pero con adaptaciones puede funcionar con la mayoría de los demás fabricantes.

Nada mas conectarme hice un “show interfaces | i protocol|rate”, es una forma rapida de ver de forma resumida el trafico por cada interfaz:

GigabitEthernet0/0 is up, line protocol is up 
  Queueing strategy: fifo
  30 second input rate 1691000 bits/sec, 3405 packets/sec
  30 second output rate 57859000 bits/sec, 5920 packets/sec
     0 unknown protocol drops
GigabitEthernet0/1 is up, line protocol is up 
  Queueing strategy: fifo
  30 second input rate 55911000 bits/sec, 5723 packets/sec
  30 second output rate 1365000 bits/sec, 3382 packets/sec
     118 unknown protocol drops

Aquí está el pimer detalle interesante, Gi0/0 es la interfaz HACIA Internet y Gi0/1 HACIA la red interna de mi conocido.

Es decir la red interna estaba ENVIANDO tráfico a Internet.

Por tanto no era un ataque de DOS, sino un equipo aparentemente hackeado enviando tráfico a Internet.

El segundo problema, averiguar cual. lo primero que hice es ver cuantas maquinas habia activas en la red interna (a partir de aquí las IP se han modificado para proteger identidades):

router(config)#do sh arp                                      
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
...
Internet  192.0.2.33            -   c471.fe88.8888  ARPA   GigabitEthernet0/1
Internet  192.0.2.34            0   0044.8856.0022  ARPA   GigabitEthernet0/1
Internet  192.0.2.35            0   0044.8856.0063  ARPA   GigabitEthernet0/1
Internet  192.0.2.36            8   0044.8856.0063  ARPA   GigabitEthernet0/1
Internet  192.0.2.37            0   0044.8856.0020  ARPA   GigabitEthernet0/1
Internet  192.0.2.38            0   0044.8856.0069  ARPA   GigabitEthernet0/1
Internet  192.0.2.39            8   0044.8856.0063  ARPA   GigabitEthernet0/1
Internet  192.0.2.40            8   0044.8856.0063  ARPA   GigabitEthernet0/1
Internet  192.0.2.41            2   0044.8856.0026  ARPA   GigabitEthernet0/1
Internet  192.0.2.42            0   0044.8856.001d  ARPA   GigabitEthernet0/1
Internet  192.0.2.43            0   0044.8856.0013  ARPA   GigabitEthernet0/1
Internet  192.0.2.44            3   0044.8856.0027  ARPA   GigabitEthernet0/1
Internet  192.0.2.45            0   Incomplete      ARPA  
Internet  192.0.2.46            0   Incomplete      ARPA

A continuación construí un access-list con todas esas direcciones:

access-list 169 permit ip host 192.0.2.34 any
access-list 169 permit ip host 192.0.2.35 any
access-list 169 permit ip host 192.0.2.36 any
access-list 169 permit ip host 192.0.2.37 any
access-list 169 permit ip host 192.0.2.38 any
access-list 169 permit ip host 192.0.2.39 any
access-list 169 permit ip host 192.0.2.40 any
access-list 169 permit ip host 192.0.2.41 any
access-list 169 permit ip host 192.0.2.42 any
access-list 169 permit ip host 192.0.2.43 any
access-list 169 permit ip host 192.0.2.44 any
access-list 169 permit ip host 192.0.2.45 any
access-list 169 permit ip host 192.0.2.46 any
access-list 169 permit ip any any

Varios detalles sobre este access-list:

  • Es extendido (entre 100 y 199) para poder poner como condición la IP de origen del paquete (nos interesa saber que máquina interna está enviando los paquetes)
  • Cada IP que hemos identificado está en una línea y no nos importa el destino, por eso hemos puesto any.
  • Deja pasar  todo el trafico, pero vamos a aprovechar una particularidad de cisco. Cuando un paquete es aceptado (matcheado que dicen alguno) por la condición de una línea, se incrementa un contador. Mirando ese contador sabremos que maquina es la que envía más paquetes y por tanto es la culpable.

Ahora aplicamos el access-lis en entrada en la red interna:

inter gi0/1
ip access-group 169 in

Dejamos reposar unos minutos (como los quitamanchas) y…

router#sh ip access-lists 169
Extended IP access list 169
    10 permit ip host 192.0.2.34 any (307926 matches)
    20 permit ip host 192.0.2.35 any (50 matches)
    30 permit ip host 192.0.2.36 any (487 matches)
    40 permit ip host 192.0.2.37 any (189 matches)
    50 permit ip host 192.0.2.38 any (3539 matches)
    60 permit ip host 192.0.2.39 any (46 matches)
    70 permit ip host 192.0.2.40 any (290 matches)
    80 permit ip host 192.0.2.41 any (398 matches)
    90 permit ip host 192.0.2.42 any (5 matches)
    100 permit ip host 192.0.2.43 any (68 matches)
    110 permit ip host 192.0.2.44 any (5 matches)
    120 permit ip host 192.0.2.45 any
    130 permit ip host 192.0.2.46 any

Ya tenemos un ganador. La IP 192.0.2.34 es el culpable.

Resulta que era un servidor de correo que había sido hackeado y se estaba usando para envia spam.

Si resulta que en nuestra red interna hay demasiadas maquinas, no resulta práctico poner un access-list tan largo. Usemos la dicotomía, por ejemplo si tenemos una red /24, podemos hacer:

access-list 169 permit ip 192.0.2.0 0.0.0.63 any
access-list 169 permit ip 192.0.2.64  0.0.0.63 any
access-list 169 permit ip 192.0.2.128 0.0.0.63 any
access-list 169 permit ip 192.0.2.192 0.0.0.63 any

Descubrimos cual de las cuatro subredes es la que tiene el trafíco (supongamos que la segunda) y la subdividimos a su vez:

no access-list 169
access-list 169 permit ip 192.0.2.64 0.0.0.15 any
access-list 169 permit ip 192.0.2.80  0.0.0.15 any
access-list 169 permit ip 192.0.2.96 0.0.0.15 any
access-list 169 permit ip 192.0.2.112 0.0.0.15 any

Con este resultado ya sabremo en que grupo de 16 direcciones esta la culpable y podemos hacer una lista de 16 hosts para descubrir cual es.

Por otra parte, si fuera al reves, es decir un ataque desde Internet a tu máquina, bastaría con cambiar el orden en el access-list, poner el any delante, y el access-list configurarlo como out en lugar de in en la interfaz.

Espero que este sencillo hack le sea de utilidad a alguine.