Buscar y eliminar código malicioso en wordpress

Se ha creado una nueva versión de este script de borrado.

Ir a la nueva versión
“Buscar y eliminar código malicioso en PHP v.2″

Esta última semana ha sido un caos en el trabajo, nos llegaron varias webs en la que se había inyectado código malicioso que había que limpiar cuanto antes, ya que aparte de los problemas obvios de posibles infecciones en los ordenadores de los visitantes, estaba influyendo en las búsquedas ya que google lo etiquetaba como web con software malintencionado y no permitía el acceso.

Investigando un poco internet se pueden encontrar multitud de páginas que te indican cómo eliminarlo, pero lo que realmente te están diciendo es como encontrarlo (existen sitios gratuitos como http://sitecheck.sucuri.net/scanner/ para buscar código malicioso en los archivos) pero no te dan la posibilidad de eliminarlo sin editar los ficheros manualmente.

Los ficheros más comunes en los que se puede alojar son el malware son : index.php, wp-config.php y los ficheros alojados en  “wp-content/themes/” y “wp-content/plugins/“. Pero el problema no es saber cuales son o encontrarlos, sino el eliminar ese código malicioso; en la última web que tuve que revisar el código malicioso se había alojado en todos los ficheros, y no solamente al comienzo (el lugar mas común también) sino tras todas las aperturas de php “<?php” por lo que había ficheros en los cuales existían hasta 50 códigos maliciosos que había que eliminar a mano uno a uno. Nota: aquí tenemos que ser cuidadosos de borrar solo el código malicioso por lo que esta tarea puede acabar llevando horas y horas (yo lo he sufrido).

En fin, como la mejor forma de hacer algo es hacerlo tu mismo, me he preparado un script que recorre el directorio en el que está alojado (y todos los subdirectorios) en busca de códigos susceptibles de ser malware; entre los que hemos encontrado hasta el momento tenemos:

  • - eval(base64_decode(“chorrazo de caracteres sin sentido acabado en ==”)); // la mayoría de de los casos
  • - carga de php mediante  ficheros javascript  <script src=”ruta/nombre-fichero.js.php”></script>
  • - iframes a urls con código malicioso
  • - código en los .htaccess e inserción de nuevos ficheros con llamadas a $_POST
  • Y aunque no lo hemos encontrado hasta el momento en ninguna de las webs, este también puede ejecutar código malicioso: gzinflate();

Vamos a ver por pasos como podemos detectar y eliminar en la mayoría de los casos el malware de una web.

Nota importante: este código solo es una ayuda para poder eliminar más rápidamente ciertos códigos maliciosos (los indicados anteriormente) o encontrar posibles errores, pero siempre van surgiendo nuevos códigos. Este post y el fichero se irán actualizando a medida que se vayan encontrando más malware. Si vosotros encontráis alguno que no se haya indicado aquí podéis dejar un comentario para actualizar el fichero. Cualquier mejora del código fuente también es bien recibida.

 

1º) ¿Cómo eliminamos la línea de código malicioso?

Vamos a usar expresiones regulares, en este caso la función preg_replace(), que busca un contenido en concreto en la cadena pasada y lo sustituye por otra cadena. Lo que nosotros queremos buscar es

y sustituirlo por vacío (eliminar) por lo que el código usado será:

 

Con este paso ya eliminamos todos esos códigos maliciosos de la cadena, pero también tenemos que investigar si existen otras posibilidades, para ello usaremos la función preg_match() para buscar lo mismo “eval(base64_decode(())” pero esta vez sin los dos “==” lo que nos devolverá cualquier código dudoso y que nosotros mismos tendremos que revisar y decidir si realmente es malware ya que algunos son necesarios por los plugins instalados para el buen funcionamiento del mismo. Otros valores que buscaremos será “.php” para posibles inclusiones de código malicioso desde javascript o includes php y también “<iframe” para buscar posibles cargas externas mediante este tag., los códigos a usar serán:

 

2º) Realizar el proceso anterior en todo el fichero php

Para esto abrimos el fichero,  lo recorremos lanzando el código anterior en cada línea y al finalizar guardamos el fichero con el código limpio.

 

3º)  Realizar el proceso anterior en todos los directorios y ficheros:

Ahora solo nos queda abrir el directorio actual e ir recorriendo de forma recursiva todas sus subcarpetas, revisando los ficheros php

 

Ahora os pongo todo el código anterior con sus funciones y sus comentarios, y por si  queréis descargar una versión algo más completa, al final tenéis un rar con el script con algunas mejoras como la visualización de los diferentes resultados con colores para diferenciarlos y poder ocultar/mostrar algunos de ellos.

Nota: En una página de tamaño medio con 5 carpetas de themes y 10 de plugins el resultado fue de más de 800 líneas de código malicioso reparadas y 40 posibles comprobaciones manuales en un tiempo total de 17 segundos. (El mismo proceso en otra web de forma manual había llevado 4 horas)

Se ha creado una nueva versión de este script de borrado.

Ir a la nueva versión
“Buscar y eliminar código malicioso en PHP v.2″

22 Comentarios

  1. AUREL IOAN

    Hola.
    Tengo creo el mismo problema. Google ha declarado este sitio web con contenido malicioso. he descargado todo el contenido de la ftp del sitio y he abierto todos los index.php y los headers.php con notepad++ y he buscado las cosas que has puesto tu arriba. No he encontrado nada. Ahora queria ejecutar tu codigo y aver si el encuentra algo. Con que programa puedo ejecutarlo o como puedo hacer que busque en mi web¿? Gracias de antemano por la informacion.
    Un saludp

    • admin

      Hola Aurel. Lo que tendrías que hacer con ese fichero sería subirlo al directorio raiz de tu web y llamarlo desde tu navegador con http://tudominio.com/limpieza_codigo_malicioso.php (creo que le di ese nombre al fichero del zip) Tardará x segundos y te devolverá un listado con los ficheros reparados (en verde) y los posibles ficheros con errores (en rojo) indicando la linea en la que puede encontrarse el código malicioso.

      Esos posibles ficheros con errores sería necesario revisarlos a mano, ya que en algunos casos son códigos propios del wordpress (en el caso de estar usándolo) que obviamente no podemos borrar automáticamente pero que pueden ser susceptibles de contener el código malicioso. Si es una página propia, podría devolverte como posibles errores algún php que contenga iframes, en ese caso tienes que comprobar la url a la que se dirigen y comprobar que no sea maliciosa.

      Espero haberte ayudado, en cualquier caso, si ves que te resulta complicado el revisar ciertos ficheros y ante cualquier duda antes de borrar un fichero o código que no conozcas puedes comentármelo e intentaré ayudarte en lo que pueda.

      Un saludo.

  2. Ioan

    Acabo de su archivo y me da da muchos resultados en rojo. Todos los resultados son código mal intencionado o los iframes que pueden haver son de la propia pagina. La pagina web no es mía sino de la empresa donde les ayudo informaticamente mas o menos. Entonces me dijeron este problema y dije que probaria a de ver si puedo solucionarlo. Creo que un poco mas complicado de lo que parece . Si quieres puedes ejecutar esta direccion: http://viviendalujobcn.com/limpieza_codigo_malicioso.php , ahi supongo que te saldra lo mismo que ami. Nose si google saltara como pagina sospechosa.
    Gracias enserio. Eres la primera persona que me arroja un poco de luz en esto.

  3. Ioan

    He hecho lo que me ha indicado y en ficheros limpiados no me da ningun resultado y luego me muestra unos cuantos , bastantes errores diferentes a base64_decode que deberia investigar yo. Ahi he encontrado iframes. Todos los iframes son malintecionados? esque la web no la hice yo sino otra persona yo solo intento ver si puedo ayduar y desinfectar el codigo. Se ve que alguien peto la contraseña ftp y bueno. Puedes hecharle un ojo si quieres a los resultados que obtengo aqui: http://viviendalujobcn.com/limpieza_codigo_malicioso.php . Agradeceria algun comentario que pueda darme alguna pista. Y si no consigo nada les diré que busquen a alguien mas cualificado para que les resuelvan esto.
    Gracias por arrojar un poco de luz en el tema. Muy buena aportacion.

    • admin

      Hola de nuevo, he intentado entrar en la url que me has dado pero me dice que página no encontrada, volviste a borrar el fichero despues de subirlo?. En cuanto a los iframes, no todos son maliciosos, algunos son necesarios para ciertas funcionalidades de las páginas donde se incluyen, por eso el script de limpieza no los borra sino que te muestra el aviso para que tu los revises. De los errores que te muestra hay muchos que sean por ficheros .htaccess? Porque he entrado en la web y veo que es un wordpress, y en un wordpress como mucho solo debería existir un .htaccess en la raiz, ese podría se un punto a solucionar, borrar todos los htacces que no esten en la raiz, y a su vez, borrar todos los ficheros a los que enlazan, pueden llamarse index_backup.php,o algo por el estilo.

      Si quieres, genera de nuevo los errores lanzando la llamada al fichero de limpieza y guarda el resultado como html, me lo envías a ektoral(arroba)hotmail.com en un zip, y te lo puedo revisar y comentarte algo por encima, aunque claro, para limpiarlo sería necesario acceder via ftp para solucinarlo.

      Un saludo.

  4. Rescatando este post, recientemente al menos en Dreamhost, ha pasado algo similar:
    http://www.issux.com/2012/09/02/dreamhost-infeccion-por-malware-en-wordpress/

    Pregunto, ¿se podría hacer un script similar para eliminar esta amenaza como se hizo con la de base 64?.

    Pongo un enlace con el php con código malicioso y el bueno.
    http://www.adames.org/infectado_bueno.zip

    Gracias

    • admin

      Hola Victor.

      Suponiendo que el código fuera siempre el mismo al menos en el inicio y en el final si que se podría; me explico, al buscarlo con las expresiones regulares tenemos que indicarle un comienzo y un final de cadena, al menos esa es la forma mas sencilla que he encontrado para poder limpiarlo directamente; si el comienzo siempre fuera “if(1){global $O10O1OO1O” y el final “\x4F01100llO());”));}}” (mas o menos, se podrían ir acortando las cadenas porque el $O10O1OO1O es raro raro) si que lo podríamos eliminar automáticamente, en cualquier caso siempre se podría controlar el “if(1){” ya que no creo que nadie lo vaya a programar de esa forma, y en el caso de encontrarlo lo mostraría como un posible código malicioso a revisar manualmente. Voy a probarlo (últimamente ando algo liadillo con el curro así que igual no lo tengo antes del finde) y si veo que los resultados son buenos lo añado al script de limpieza.

      Por mi parte tambien he encontrado algunos códigos nuevos que están dando problemas, pero parece que son bastante variables y es difícil detectarlos automáticamente.

      Muchas gracias por el comentario y por el aporte de ese código ^^

      Un saludo.

  5. Creo que siempre es el mismo código. Por lo que creo que se puede añadir al script. Aunque como seguramente volverá a salir… lo pondré de igual modo para contrastar, pero vamos, que por lo que visto suele ser siempre igual.

  6. Victor

    Por cierto, cada vez que actualices el código podrías poner la fecha en el post de “última actualización” así si vemos que hay una nueva fecha lo ajamos y probamos.

    • admin

      Si si, es lo que tenía pensado hacer, lo que pasa que este fin de semana no pude ponerme con ello. Hemos encontrado otra versión de código malicioso en otra web, con lo que aprovecharé y lo incluiré.

  7. Bueno, pongo aquí el código de php del archivo post-template.php de WordPress. Como se ve en Dreamhost siguen entrando estos códigos.

    Se ve claramente el código al final pues es un chorro que salta a la vista.
    http://pastebin.com/nn16M9Wy

    • admin

      Hola Zhares, al pasarle el código de limpieza no te lo ha limpiado? Cual has seleccionado? El de este post o el de la 2ª versión? El applyfilter es uno de los que contempla esa nueva versión. Si no es así puede ser que hayan cambiado algo en la programación, tendría que revisarlo de nuevo, en cualquier caso esa función applifilter y las tres justo debajo de ella que la añaden se pueden eliminar directamente.

      Analizaré el código para ver que han podido cambiar.

      Un saludo.

  8. Me ha vuelto a avisar el servidor en un escaneo rutinario, y bueno, todos los wodpress que tengo estaban infectados, la putada es que no sé cómo se están colando (Dreamhost). Ellos lo borran el código y renombran la copia infectada.

    Creo que algo ha cambiado en el código, se ve al final de todo el código malware, que no es el mismo que sale en el primero.

    http://pastebin.com/1vz2GjCQ

    • admin

      Hola Zhares. Si, la verdad es que es (perdón por la expresión) una putada, cada vez que tenemos algo que podemos usar nos salen con códigos nuevos. Estas semanas de atras he tenido bastante jaleo y no he podido ponerme con ello, a ver si en breve puedo retomar el tema y sacar una nueva versión.

      Un saludo.

  9. La verdad es que es grande la putada, supongo que el “O01100llO”, la cantidad de %34%342%345 y /345/34/ que salen puede servir para avisar de que entre los { }, lo que hay es malo.

    Saludos y gracias por esa currada que te pegas.

  10. Por lo que parece hay archivos que se crean y que son malignos, podría incluirse la búsqueda de estos y eliminarlos

    http://wordpress.org/support/topic/wordpress-hacked-files-to-delete-or-update-when-youve-been-hacked?replies=11

    class-wp-theme-edit.php
    class-ziplibs.php
    wp-raze.php
    wp-ajax-gadget.php
    /wp-includes/https.php

    • admin

      Hola Zhares.

      Uff… acabas de nombrar mi mayor temor, el borrar ficheros. Para mi obviamente sería lo mas sencillo, mantengo un listado con los ficheros a borrar y si los encuentra eliminarlos. Pero el peligro es que alguno de los temas que se hayan instalado en un wordpress contenga alguno de esos ficheros sin ser maliciosos, o que a algún fichero php de una web programada desde cero le hayan dado alguno de esos nombre.

      Lo que si puedo hacer es mostrar el mensaje de comprobación de ficheros tal y como hago con las cadenas de “iframe” etc…

      Un saludo y gracias por tu mensaje y sugerencias ^^

  11. Estos suelen ser archivos que crea el malware.

    wp-includes/Text/class-https.php
    wp-includes/https.php
    wp-includes/css/class-https.php
    wp-admin/css/edit-form-header.php

  12. Hola, necesito tu ayuda, te ruego ver mi sitio y veras que hay codigo malicioso, que a lo mejor fue injectado por un formulario que tengo en linea (donde usuarios llenany suben archivos). http://www.gradodigital.edu.sv

    Por favor, puedes ayudarme a eliminarlos!

    Mil gracias
    Marlon

  13. Hola.
    Tengo un problema con mi blog de wordpress. De la noche a la mañana comenzó a aparecer en el cabecero de mi blog “403 Forbidden nginx”. Contacté con el soporte de wordpress y me dijeron que encontraron este código malicioso “” aunque no me dijeron dónde o cómo erradicarlo.

    Honestamente no sé cómo fui capaz de crear el blog, puesto que no tenía ni pajolera idea y a punta de ver tutoriales y buscarme la vida he conseguido hacer lo que he necesitado para el blog. Sin embargo me he tropezado con este quebradero de cabeza y no tengo ni idea de cómo solucionarlo. Sé muy poco de html y milagrosamente he logrado modificar algunas cosa en mi tema que no me terminaban de gustar, pero poco más.

    No sé dónde se encuentra ese código, ni si lo debo borrar literalmente una vez lo encuentre o hacerle otra cosa.

    Por otro lado, instalé un plugin para scannear mi blog y al finalizar el análisis dice lo siguiente:

    “Potential Threats
    * NOTA: Estos son scripts probablemente no maliciosos (pero es un buen lugar para empezar a buscar SI su sitio está infectado y no se encontraron amenazas conocidas).”

    A continuación me muestra un listado de archivos que “es posible” puedan tener código malicioso. Cuando abro uno cualquiera al azar, en la parte superior de la ventana de ese mismo archivo dice esto “Amenazas potenciales en el archivo: ( [1] [2] [3] )”. Cuando hago clic, por ejemplo, en [1], aparece seleccionado, marcado en azul, un texto o código que se lee así ” eval(
    jQuery.ajax({
    type: “GET”,
    url: “<?php echo esc_url($_SERVER['PHP_SELF']); "

    Esto se me parece mucho a lo que mencionas en tu explicación, y aparece en infinidad de archivos.

    Vi que explicas cómo eliminarlo, pero mi cerebro limitado me impide comprender 100% cómo se hace. Se borra literalmente dicho código o se "desactiva" añadiéndole algo? Qué debo hacer?

    Por otro lado recordé que hice un backup el año pasado y decidí comparar los archivos actuales del blog, con los de la backup para ver si ese código aparece o fue añadido, y veo que el código está también en la copia de seguridad, que no daba problemas ni parecía infectada.

    Escribí a los de wordpress para ver si me podían decir dónde está o dónde encontraron ese código pero no me dicen nadita… Así que me veo con un blog "enfermo" que me costó sudor y lágrimas levantar y que no soy capaz de limpiar.

    Leo explicaciones pero me siento como una estudiante de medicina de primer año tratando de entenderse con los de último año.

    Por favor, si me pudieses dar un poco de luz y sobre todo hablarme como si fuese una niña pequeñita…. xD te agradecería.

    un saludo y felicitaciones por el blog.

    • admin

      Hola Aday. Antes de nada tienes que tener mucho cuidado con ciertos plugins, ya que también pueden contener código malicioso, yo te recomiendo que uses wordfence, es bastante bueno y ademas de indicarte posibles códigos maliciosos también ayuda a proteger el sitio. También sería bueno que, si no los tienes, te instales el askimet y el wp-optimize; este último está mas orientado a optimización de bases de datos pero también es una buena ayuda eliminando comentarios de spam.

      En cuanto a los códigos que me comentabas, casi cualquier código que vaya dentro de un eval() podría ser potencialmente peligroso (sobre todo si se encuentra en ficheros php), y casi seguro que lo es si va acompañado de un base64_decode(); en otros casos, sobre todo si se encuentra en ficheros de javascript (extensión .js) no es malicioso sino que se usa para realizar ciertas operaciones. El problema es que últimamente los códigos maliciosos se han perfeccionado y mi script no está lo suficientemente actualizado como para eliminarlos, como mucho podría indicarte los ficheros y las lineas en las que se encuentra, y serían necesarios conocimientos de programación para poder eliminar solo lo que es malicioso.

      Si quieres puedes enviarme un email a ektoral(at)hotmail.com con un usuario de acceso a tu ftp y podría echarle un vistazo.

      Un saludo y gracias por tu mensaje.

  14. Por cierto… el código malicioso que encontraron ellos no es el mismo que me aparece en el análisis del blog. El código malicioso que ellos mencionan es este ” (añadí espacios para que el código apareciese dado que en el primer comentario que hice desapareció). No sé cómo buscarlo ni por dónde empezar…
    Gracias de nuevo.

Deja un comentario


*