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.