Como encontrar facilmente scripts de PHP que envían SPAM

Tengo la costumbre de revisar cada pocos días los gráficos que genera la herramienta Munin para controlar los recursos de mi servidor. Ayer por la tarde, detecté una gráfica de lo más inusual:

Cola de postfix en Munin

Cola de postfix en Munin

Se trata de la gráfica de la cola de correo pendiente de enviar de Postfix. Como se puede ver en el gráfico por mes o por semana, en el caso de mi servidor, la cola rara vez tiene una gran ocupación. En algún envío masivo a los usuarios de algún foro es posible que tenga algunas decenas de correos pendientes en un instante dado, pero ayer había mas de 4000 correos en la cola, pendientes de su envío, algo totalmente fuera de lo común.

Eché un vistazo a la cola con el comando “mailq”, y el resultado fue desalentador:

Y así hasta 4000 correos y aumentando cada segundo. Demasiados intentos de enviar correo a direcciones de Rusia para mi gusto.

Inicialmente borre la cola de postfix con el comando

de ahí que en la gráfica se vez un brusco descenso del numero de correos, pero esto no supuso ni siquiera un alivio temporal, ya que en pocas horas volvía a tener varios miles de correos en cola (hasta 14.000).

En el volcado del comando mailq, pudimos ver que el usuario que enviaba los correos era el usuario de ubuntu “www-data”, bajo el cual se ejecuta normalmente el servidor web Apache. Por lo tanto, todo parecía indicar, que alguien había subido un script a alguno de los sitios alojados en el servidor, quizás aprovechando un exploit, y estaba usando mi servidor para enviar spam masivo. La pregunta es, ¿como localizar el script php que esta enviando los correos?

Recientemente, con la versión de PHP 5.3, hay una novedad que nos facilita mucho saber que script de PHP está actuando como spammer en nuestro servidor. Concretamente, consiste en añadir las siguientes lineas a nuestro fichero php.ini (normalmente descomentarlas, ya que ya estarán presentes):

Lo que hace la primera sentencia, es añadir una cabecera a todo email saliente, que incluye el UID y el nombre del fichero del script que ha enviado el correo.

La segunda linea, se encarga de guardar en un fichero log, cada vez que se envía un correo, dicha cabecera. Es importante crear el archivo si no existía, y asegurarse de que el usuario “www-data” tiene permisos de escritura sobre dicho archivo.

Una vez añadidas las dos nuevas lineas en nuestro fichero php (en Ubuntu, localizado normalmente en /etc/php5/apache/php.ini), reiniciamos nuestro servidor web apache para que tenga en cuenta nuestra nueva configuración (apache2ctl graceful).

Inmediatamente empecé a ver en el fichero phpmail.log, el origen de los envíos de spam:

Haciendo un tail -F sobre el fichero /var/log/phpmail.log, apreciamos que el ritmo de envío de spam era vertiginoso, no se podía leer el fichero log de lo rápido que era el desplazamiento. Así que para poder trabajar cómodamente, y como el sitio web no era critico, decidimos desactivarlo temporalmente para interrumpir el envio de spam:

Con esto conseguimos interrumpir el envío masivo de correos. Una vez hecha una copia de seguridad del sitio, por si acaso se nos va la mano durante la desinfección, observamos que todo el árbol de directorios del mismo estaba infestado por scripts php de origen extraño. Se trata de una instalación antigua de Joomla, que por motivos técnicos no puede ser actualizada, y suponemos que los spammers conocen bien los exploits para subir scripts maliciosos en esta versión.

Examinando el código fuente de los ficheros sospechosos, vemos que efectivamente, son scripts que envían correo de manera masiva. Algunos ficheros son fácilmente identificables, y los borramos manualmente, pero para otros, decidimos utilizar el antivirus de Linux Clamav.

La manera de instalarlo no podría ser más sencilla:

Si planeamos usarlo de manera automática ejecutándose como un demonio, tendremos que instalar

En ambos casos el comando “freshclam” se usa para actualizar la base de datos del antivirus con la ultima versión.

Una vez instalado y actualizado, para escanear nuestro servidor:

O si queremos escanear todo el servidor:

Con esto nuestro sitio web infectado debería quedar mejor que antes. Es recomendable en estos casos, actualizar en cuanto se pueda la versión del software que tengamos para ese sitio web, o si no es posible, realizar alguna otra actuación que permita asegurar el sitio.

En nuestro caso, no es posible por motivos técnicos y deseos del cliente, subir la versión de Joomla a otra mas reciente / segura. Así que hemos optado por una solución numantina: proteger la carpeta y todas sus subcarpetas contra escritura. Esto es factible en el caso actual, que la web no puede ser actualizada, pero tampoco es utilizada, simplemente permanece ahí como reliquia “on line”. Pero en otros escenarios, lo mas probable es que no sea una solución válida.

Solo queda reactivar el sitio web, y vigilar el phpmail.log y el mail.log para comprobar que el envío de spam ha remitido.

Ya podemos observar en el grafico de Munin como se normaliza la cola de Postfix:

Postfix normalizado
Postfix normalizado

6 comentarios en “Como encontrar facilmente scripts de PHP que envían SPAM

  1. Muy buen post!!

    Putadas de estas nos pasan a todos… yo he llegado a tener 500.000 mensajes en cola 😉

    • Ya, el problema ya no es la saturación del servicio de correo, sino que la ip del servidor puede acabar en alguna lista negra y perjudicar a alguno de los dominios que tengas hospedados…

      en fin.

  2. Hola Roque…

    Primero de todo, muchas gracias por el post: aunque mis versiones de los paquetes no son como las tuyas, me has dado la “inspiración” para solucionar el problema.
    En mi caso ha sido un exploit del CMS DRUPAL mantenido por el cliente y que no había actualizado a la versión 7.32 (la 7.31 es la comprometida …)
    – Una vez actualizada la versión del núcleo de DRUPAL, el sistema continuaba generando correos… así que con tu solución encontré la fuente del problema: el fichero “start.php” añadido a uno de los módulos contribuidos (no del núcleo de DRUPAL) (el módulo infectado era “fontyourfaces” por si a alguien le sirve).

    Gracias
    Saludos

  3. Hola Roque!
    Yo tengo picos de uso de la memoria RAM de mi servidor (VPS optimizado) de 80 o 90% y no se si el problema tiene que ver con lo que comentas pero me parece bastante razonable ya que mis sitios no tienen un nivel de visitas que ocasionen estos picos repentinos y no soy programadora pero me estoy haciendo cargo de este servidor y me gustaría saber cómo identificar esos ficheros en Vesta y cómo instalar Clamav en mi servidor…
    De antemano mil gracias si puedes darme una mano con esto!!

    • Es un poco dificil decir por que tu vps tiene esos picos de uso de cpu. Lo primero que tienes que hacer es confirmar sin lugar a dudas que el causante del abuso de cpu son scripts que envian spam, porque sino estaras dando palos de ciego. Como comento en el articulo, yo instalaria Munin, lo dejaria recopilar estadisticas durante unos dias, y relacionaria las diferentes graficas. Por ejemplo, si cuando tienes picos de cpu, al mismo tiempo observas actividad en la grafica de postfix, pues si, es debido al envio de correo.

      Pero puede que tengas problemas con consultas poco optimizadas sobre la base de datos, o que tengas poca ram y el servidor este paginando, como digo, es dificil de decir.

      No puedo decirte como instalar munin ni clamav en el panel de control vesta. Yo no suelo usar paneles de control, me gusta gestionar mis servidores desde la linea de comandos.

      Un saludo

  4. Hola Roque , la fila phpmail.log no me despliega nada, hice todos los pasos grupo www-data todo pero nada 0 bytes, gracias desde ya!

    Xubuntu server + ehcp

Los comentarios están cerrados.

SUBSCRIBE TO NEWSLETTER
All rights reserved © Company Name, 2014
Dolor aliquet augue augue sit magnis, magna aenean aenean et! Et tempor, facilisis cursus turpis tempor odio, cursus montes ac turpis. Ultrices! Massa integer augue ridiculus adipiscing, massa cras pid. Turpis placerat scelerisque, vut odio mus non, mattis porttitor, nunc odio, turpis tortor sit? Pid amet, sed facilisis.
  • Goblinus globalus fantumo tandempo
  • Scelerisque cursus dignissim donus
  • Montes vutario lacus quis arcupolisio
  • Leftomato denitro oculus tepircos den
  • Spiratio dodenus christmas popupius
  • Afrenius globalus spiritum tandempo
  • Fitatos vutario lacus quis arcup delis
SUBSCRIBE NOW!
Receive messages whit news about Smart Thermostat
  We will not share your details with any 3rd party.
¡SUSCRÍBETE AHORA!
Recibe en tu correo las novedades del proyecto Termostato Inteligente
  Tus datos no serán compartidos con terceros.