Cómo detectar malware en nuestro sitio web

Cloud, Seguridad

Trevenque Group » Blog » Cómo detectar malware en nuestro sitio web

Actualmente la mayoría de los sitios webs que hay en la red se basan en algún CMS. El más popular de ellos es WordPress (con aproximadamente un 35% del total). Estos CMS normalmente permiten una gran variedad de plugins, módulos o extensiones que agregan nuevas funcionalidades. Se calcula que aproximadamente un 2% de las vulnerabilidades afectan al core del CMS. El 98% restante corresponde a estos agregados que amplían su funcionalidad y que habitualmente son desarrollados por terceros.

En época de pandemia, se están incrementando los ciberataques. Nuestros sitios web son atacados aprovechando vulnerabilidades conocidas de estos CMS. Existen muchas herramientas para escanear sitios web. No hay más que hacer una búsqueda en Google: Muchas de ellas son online, otras cuentan con versiones de escaneo gratuitas, y otras muchas son de pago.

Ante tal variedad, es muy difícil decidirse por una en concreto. Si bien ninguna de ellas es 100% segura, yo vengo a proponer una solución más manual y artesanal para PHP (aunque se podría adaptar para otros lenguajes de programación), la cual tampoco es infalible. Se basa en localizar los ficheros recientemente modificados y posteriormente buscar en ellos ciertos patrones que suelen usar los hackers en los ficheros que inyectan en nuestros sitios web. Si esto lo realizamos con periodicidad y notificamos a los encargados de gestionar el sitio web nuestros hallazgos, es fácil discernir si hemos sido infectados.

Pautas

Por ejemplo, algunas de las cosas que nos pueden hacer sospechar que hay algo extraño en nuestros ficheros, son las siguientes:

  • Ficheros index.php anormalmente grandes, normalmente suelen contener unas pocas líneas.
  • Uso de ciertas funciones que suelen usar los hackers para conseguir sus objetivos: shell_exec, system, stream_socket_client, str_rot13, gzinflate, system, passthru, eval, base64_decode, preg_replace…
  • Cadenas hacked, hacker o hack, suelen dejar mensajes atribuyéndose el mérito de la intrusión.
  • Otras cadenas sospechosas: paypal, @mail, @copy, @set_time_limit, shell, move_uploaded_file, chr…

Con todo esto, podemos crear un script que nos localice todos los ficheros con extensión .php modificados en los últimos dos días. En ellos, buscaremos lo que hemos indicado anteriormente y volcaremos el resultado en un fichero individualizado:

 #!/bin/bash
DocumentRoot="/var/www/"
php_mod="php_modificados.txt"
DATE=$(date  +%Y%m%d)
# Directorio donde se guardan las copias
DST=/tmp/escaneo_diario/
mkdir -p ${DST}

#Escaneamos los ficheros .php modificados en los últimos 2 días, excluyendo directorios cache
find ${DocumentRoot} -mtime -2 -name '*.php' -not -path "*/cache/*" >> ${DST}${DATE}_${php_mod}
while IFS= read -r line
do
#Dentro de los ficheros modificados buscamos index.php anormalmente grandes
  find ${line} -name 'index.php' -size +1900c >> ${DST}${DATE}_scanresult_indexmorekb.txt
done < ${DST}${DATE}_${php_mod}
#Buscar funciones
  xargs -ra ${DST}${DATE}_${php_mod} egrep -i "(shell_exec|system|stream_socket_client|str_rot13|gzinflate|system|passthru|eval|base64_decode|preg_replace) *\(" >> ${DST}${DATE}_scanresult_funciones.txt
#Buscar cadenas HACK
 xargs -ra ${DST}${DATE}_${php_mod} egrep -i "hacked|hacker|hack" >> ${DST}${DATE}_scanresult_hacked.txt
#Buscar otras cadenas sospechosas
 xargs -ra ${DST}${DATE}_${php_mod} egrep -i "paypal" >> ${DST}${DATE}_scanresult_paypal.txt
 xargs -ra ${DST}${DATE}_${php_mod} egrep -i "\.chr*\(" >> ${DST}${DATE}_scanresult_chr.txt
 xargs -ra ${DST}${DATE}_${php_mod} egrep -i "move_uploaded_file" >> ${DST}${DATE}_scanresult_fileupload.txt
 xargs -ra ${DST}${DATE}_${php_mod} egrep -i "shell" >> ${DST}${DATE}_scanresult_shell.txt
 xargs -ra ${DST}${DATE}_${php_mod} egrep -i "@mail" >> ${DST}${DATE}_scanresult_mail.txt
 xargs -ra ${DST}${DATE}_${php_mod} egrep -i "@copy\(" >> ${DST}${DATE}_scanresult_copy.txt
 xargs -ra ${DST}${DATE}_${php_mod} egrep -i "@set_time_limit" >> ${DST}${DATE}_scanresult_time.txt

El resultado de la búsqueda aparecerá en el directorio /tmp/escaneo_diario/, donde se crearán los ficheros con cada uno de los resultados encontrados:

-rw-r--r--. 1 root root 178 Dec 28 01:36 20201228_php_modificados.txt
-rw-r--r--. 1 root root 0 Dec 28 01:36 20201228_scanresult_chr.txt
-rw-r--r--. 1 root root 0 Dec 28 01:36 20201228_scanresult_copy.txt
-rw-r--r--. 1 root root 0 Dec 28 01:36 20201228_scanresult_fileupload.txt
-rw-r--r--. 1 root root 29 Dec 28 01:36 20201228_scanresult_funciones.txt
-rw-r--r--. 1 root root 47 Dec 28 01:36 20201228_scanresult_hacked.txt
-rw-r--r--. 1 root root 0 Dec 28 01:36 20201228_scanresult_indexmorekb.txt
-rw-r--r--. 1 root root 0 Dec 28 01:36 20201228_scanresult_mail.txt
-rw-r--r--. 1 root root 27 Dec 28 01:36 20201228_scanresult_paypal.txt
-rw-r--r--. 1 root root 0 Dec 28 01:36 20201228_scanresult_shell.txt
-rw-r--r--. 1 root root 0 Dec 28 01:36 20201228_scanresult_time.txt
En el fichero 20201228_php_modificados.txt, encontraremos todos los ficheros .php modificados en los últimos dos días. Luego, tenemos un fichero por cada una de las cadenas que buscamos, donde aparecerá la ruta del fichero que contiene la cadena y la línea donde aparece. Un ejemplo del contenido de esto archivos sería:
# cat /tmp/escaneo_diario/20201228_php_modificados.txt
/var/www/prueba.php
# cat /tmp/escaneo_diario/20201228_scanresult_hacked.txt
/var/www/prueba.php:hacked by a big big hacker

Podemos automatizar una tarea que se ejecute diariamente, y que además nos notifique por mail si se han modificado ficheros y se han encontrado cadenas sospechosas, adjuntando los ficheros con los detalles:

#!/bin/bash
DocumentRoot="/var/www/"
php_mod="php_modificados.txt"
DATE=$(date +%Y%m%d)
# Directorio donde se guardan las copias
DST=/tmp/escaneo_diario/
mkdir -p ${DST}

ADJUNTOS=""
VULNERABILIDAD=""
ENVIAR=0
MAIL="miemail@trevenque.es"
# Directorio donde se guardan las copias
DST=/tmp/escaneo_diario/
# Los escaneos se guardarán 15 días
KEEPDAYS=15
ARRAY_FICHEROS=(_scanresult_indexmorekb.txt _scanresult_funciones.txt _scanresult_hacked.txt _scanresult_paypal.txt _scanresult_chr.txt _scanresult_fileupload.txt _scanresult_shell.txt _scanresult_mail.txt_scanresult_copy.txt _scanresult_time.txt)
ARRAY_DESCRIP=("- Index.php anormalmente grande: " "- Funciones: " "- Cadena hack: " "- Cadena paypal: " "- Cadena chr: " "- Cadena fileupload: " "- Cadena shell: " "- Cadena mail: " "- Cadena copy: " "-Cadena time: ")
#Borramos lo que haya en el directorio con más de 15 días
find ${DST} -type f -mtime +${KEEPDAYS} -exec rm -rf {} \;
#Escaneamos los ficheros .php modificados en los últimos 2 días, excluyendo directorios cache
find ${DocumentRoot} -mtime -2 -name '*.php' -not -path "*/cache/*" >> ${DST}${DATE}_${php_mod}
while IFS= read -r line
do
#Dentro de los ficheros modificados buscamos index.php anormalmente grandes
find ${line} -name 'index.php' -size +1900c >> ${DST}${DATE}_scanresult_indexmorekb.txt
done < ${DST}${DATE}_${php_mod}
#Buscar funciones
xargs -ra ${DST}${DATE}_${php_mod} egrep -i "(shell_exec|system|stream_socket_client|str_rot13|gzinflate|system|passthru|eval|base64_decode|preg_replace) *\(" >> ${DST}${DATE}_scanresult_funciones.txt
#Buscar cadenas HACK
xargs -ra ${DST}${DATE}_${php_mod} egrep -i "hacked|hacker|hack" >> ${DST}${DATE}_scanresult_hacked.txt
#Buscar otras cadenas sospechosas
xargs -ra ${DST}${DATE}_${php_mod} egrep -i "paypal" >> ${DST}${DATE}_scanresult_paypal.txt
xargs -ra ${DST}${DATE}_${php_mod} egrep -i "\.chr*\(" >> ${DST}${DATE}_scanresult_chr.txt
xargs -ra ${DST}${DATE}_${php_mod} egrep -i "move_uploaded_file" >> ${DST}${DATE}_scanresult_fileupload.txt
xargs -ra ${DST}${DATE}_${php_mod} egrep -i "shell" >> ${DST}${DATE}_scanresult_shell.txt
xargs -ra ${DST}${DATE}_${php_mod} egrep -i "@mail" >> ${DST}${DATE}_scanresult_mail.txt
xargs -ra ${DST}${DATE}_${php_mod} egrep -i "@copy\(" >> ${DST}${DATE}_scanresult_copy.txt
xargs -ra ${DST}${DATE}_${php_mod} egrep -i "@set_time_limit" >> ${DST}${DATE}_scanresult_time.txt


for index in ${!ARRAY_FICHEROS}
do
if } ] #Si los ficheros tinen contenido
then
 ADJUNTOS=${ADJUNTOS}" -a "${DST}${DATE}${ARRAY_FICHEROS}
 VULNERABILIDAD=${VULNERABILIDAD}${ARRAY_DESCRIP}${DATE}${ARRAY_FICHEROS}"\n"
 ENVIAR=1
fi
done
if 
then
 echo -e "Se han detectado archivos sospechosos modificados en los ultimos 2 dias.\nPor favor revise los siguientes archivos adjuntos:\n${VULNERABILIDAD}\nEquipo ISP Trevenque ." | mailx ${ADJUNTOS} -s "Revisar ficheros" ${MAIL}
fi

Debemos tener la funcionalidad mailx, para poder enviar correos (aunque podemos usar cualquier otra). Para ello, configuramos en /etc/mail.rc, la cuenta de correo desde la que enviar, agregando al final de dicho fichero las siguientes líneas:

set smtp-use-starttls
set ssl-verify=ignore
set smtp=smtp://mismtpserver.trevenque.es:587
set smtp-auth=login
set from="miemail@trevenque.es(MiServer - Check Files)"
set smtp-auth-user=mieemail@trevenque.es
set smtp-auth-password=miPassword
set nss-config-dir=/etc/pki/nssdb/

Tan solo nos queda agregar línea en cron, para que se ejecute diariamente el script y recibamos notificaciones de las posibles infecciones.

El script se puede adaptar y/o modificar según nuestras necesidades o para otros lenguajes de programación. Lo que está claro es que si el encargado de la web recibe uno de estos mails y no ha sido él el que ha modificado los ficheros, ¡¡hay bichito encerrado!!

Otra aspecto muy importante es tener copias de seguridad recientes, para en caso de duda consultarlas, y si es necesario, restaurarlas si efectivamente se detecta infección. Aunque lo más importante es tenerlo todo actualizado. De esta forma, las vulnerabilidades conocidas estarán parcheadas y no seremos una víctima fácil para los ciberdelincuentes.

¿Te ha gustado? ¡Compártelo!

Logo Trevenque

trevenque group

Ofrecemos un conjunto de servicios completos para que puedas desarrollar tu negocio, gestionar tus datos de manera inteligente y tomar decisiones rentables.

Deja un comentario

Artículos similares

Sigue de cerca la actualidad de Grupo Trevenque y las últimas tendencias tecnológicas y de Business Intelligence.

Ver todas las noticias