El gusano de Morris fue de los primeros virus informático que afecto al 10 por ciento de los servidores que estaban conectados a internet o ARPANET. Este virus se creo con el objetivo de medir la profundidad de la red, pero dicho gusano generaba problemas en los equipos dejándolos inútiles porque sus ataques consistían en hacer ataques de fuerza bruta para poder expandirse y utilizando diferentes procesos para utilizar varios núcleos de cpu.

Tipo de malware

Relacionado: shellcode. IDOR. HOME. Forense de memoria de sistema completo. Sistema de Gestion de la Seguridad de la Informacion.

Es un programa maligno de tipo gusano porque se replica a través de la red. Primero manda un fichero l1.c que al no ser un ejecutable no lo bloqueaban los ids y no se asociaba con algo maligno, luego se compilaba en la victima y el l1.c se encarga de traer el gusano de Morris a la nueva víctima para poder seguir expandiéndose.

 Forma de infección

Este virus utiliza cuatro formas para lograr expandirse. Primero intenta un ataque de fuerza bruta utilizando telnelt en caso de tener éxito envía el archivo l1.c para poder expandirse por el resto de los equipos que dispone la red. En caso de no lograrlo con telnet, intenta el segundo paso, verifica el fichero.rhost y hosts.equiv en estos ficheros se encuentra los host los cuales tienen acceso a dicho dispositivo sin tener que usar la contraseña. El gusano de Morris prueba si existe una cierta bidireccionalidad intentando infectar esos hosts con los usuarios de la máquina infectada si esto no funciona se intenta el siguiente paso. El tercer paso es utilizar una vulnerabilidad en el protocolo finger que permita hacer un stack overflow. El protocolo finger funciona de la siguiente forma:

finger usuario@host

Y devuelve lo siguiente:

Login: usuario   Name: John Doe

Directory: /home/usuario  Shell: /bin/bash

On since Wed Feb  1 10:30 (EST) on pts/1 from 192.168.1.5

El problema de esta función es que no tiene una validación de longitud para el usuario, el gusano de Morris hacía lo siguiente, provocaba un stack overflow en el cual ejecuta código que apunta una Shell que está cargada en la misma entrada de datos.

Por poner un ejemplo, en lugar de proporcionarle el usuario le mandaba:

finger NOPSled|Shellcode|direcionPila| @host

Un NOP SLED o tobogán de NOPS, es una cadena de NOPS que son instrucciones que no realizan nada a nivel de máquina que se introducen en la pila con la idea de que la dirección de pila apunta de casualidad a un nop y estos nop van a llevar a que se ejecute la Shell code.

Con la Shell code abierta hacemos lo mismo que en los pasos anteriores cargamos el fichero l1.c se compila y esta carga el gusano para poder volver a ejecutarse, pero esta vez en una víctima nueva.
Por último, en caso de no funcionar ninguno de estos pasos prueba otra vulnerabilidad asociada a los servidores de correo de los años 80. Tenían un modo en debugger el cual permitía ejecutar comando arbitrario y por lo tanto ejecutar una Shell remota.

En caso de no tener éxito con ninguno de estos pasos, este servidor lo marcaba como inalcanzable y lo intentaba con otro dispositivo que estaba conectado en la red.

Forma de trabajar en la máquina

La forma en la que trabaja es la siguiente primero cambia su nombre de proceso por sh(una Shell) esto lo hace sabiendo que el argumento cero de cualquier programa se guarda el nombre del programa con el siguiente comando:

strcpy(argv[0], XS(“sh”));

Desactiva el core.dumps para evitar análisis forense los core dump son ficheros que se genera en caso de que el programa genere fallo. En estos ficheros se guarda el código del programa y sus variables. El gusano de Morris limitaba su tamaño en cero bytes para que no se pudieran generar dichos ficheros en caso de fallo.

Si detecta que hay un gusano de Morris ya ejecutándose, detiene su ejecución, para esto mira si el puerto 23357 está abierto, si está abierto significa que ya ha sido infecto. Porque dicho puerto el gusano lo abre solo marcar que dicho equipo ha sido infectado.

A continuación, envía una señal al servidor de control indicando que ha conseguido infectar una nueva dicha máquina. La ip del servidor es la siguiente: (“128.32.137.13”).

Después realiza el ataque descrito en el punto anterior (forma de infección).

A continuación, borra los archivos cuando ha acabado de ejecutarse el gusano. Para eso ejecuta los siguientes comandos

unlink(argv[0]); 

unlink(XS(“sh”));

unlink(XS(“/tmp/.dumb”));

Indicadores de compromiso

Los indicadores de compromiso son los siguiente, como hemos descrito en los anteriores puntos:

·         Puerto 23357

·         Archivo l1.c en el sistema

·         Creación de procesos sh o rsh.

·         Utilización de anómala de finger y de rsh.

·         Conexiones a 128.32.137.13

Conclusión

El gusano de Morris no solo dejó en evidencia vulnerabilidades técnicas de la época, también abrió los ojos de la comunidad tecnológica sobre la importancia de la ciberseguridad proactiva. A pesar de haber sido creado hace más de tres décadas, sus tácticas siguen siendo relevantes para comprender cómo operan muchos ataques actuales. Conocer estos antecedentes nos ayuda a identificar patrones, prevenir incidentes y construir infraestructuras más seguras desde la base.