Sistemas

Limpiar servidor al que han hackeado todos los wordpress

Limpiar un servidor al que han añadido lineas de código en los ficheros PHP, es algo habitual en servidores con WordPress + Cpanel / Plesk. Aunque cada proceso de infección es un mundo, publico este proceso porque los tips que desarrolla el artículo, pueden servir para muchas variaciones de trabajos a realizar en el mantenimiento de nuestro servidor, sobre todo después de una infección o hacking.

Limpiando un servidor al que han hackeado todos los wordpress

Ayer tuve que limpiar un servidor al que a través de un exploit en un blog con WordPress, unido a una falla de seguridad en el modelo Apache/Cpanel, le habían infectado todos los blog WordPress del servidor.

Analizando la infección (hack)

En cada WordPress habían ubicado un fichero llamado options.php que había sido el encargado de infectar todos los ficheros .php de esa cuenta. La característica diferenciadora, era que cada cuenta se le añadía una variable distinta a la primera linea.

?php $drnrwsrl = '27tfs%6&>*17-SFEBFI,6>t;......?>

Localización de los ficheros infectadores

Localizamos los ficheros options.php de todos los usuarios, cuya segunda cadena de la primera linea sea una variable (comienza por $) guardándolo en un fichero, por ejemplo options.txt (Preferimos el trabajo sobre ficheros, que en un encadenado de programación, por seguridad, ya que como en el ejemplo, hablamos de mas de cien mil ficheros infectados)

find /home/*/public_html/ -name "options.php"  >>; options.txt

Localización de ficheros infectados de cada usuario

En un bucle for, sobre el fichero anterior, extraemos la variable del archivo infectador, que sabemos que es única por cada usuario, y guardamos el path del fichero, y la variable separados por comas.

for o in $(cat options.txt)
do

   first=$(awk 'NR==1 { print $2}' $o)

   if [[ ${first:0:1} == '$' ]]
   then
       echo $o,$first >> optionsvars.txt
   fi
done

Lectura y búsqueda de ficheros infectados

Con esa lista, tenemos la posibilidad de analizar cada usuario, que tiene una cadenas hack específica. Sabemos que todos los usuarios del sistema nuestro están en /home (si fuera de otra forma, porque existen /home2, /home3, /homen, tendríamos que modificar el código)

Como es una var por usuario, utilizaremos una variable de control para determinar cuando estamos trabajando con un usuario del que ya tenemos la variable.

prevUser=""
for file in $(cat optionsvars.txt)
do
    user=$(echo $file | awk -F"/" '{print $3}')

    if [ "$user" != "$prevUser" ]
    then
        hack=$(echo $file | awk -F"," '{print $2}')
        
        for clean in $(find /home/$user/public_html/ -name "*.php" -exec grep -il "$hack" {} \;)
        do
            echo "Limpiando $clean"
            sed -i.bak '1 s/^.*$/;

De esta forma la cuestión era borrar todo lo que existiera entre dos limitadores, incluidos ellos mismos. Bueno un poco de ayuda no esta mal, y puse un artículo Delete the characters of a line between two limiters including themselves y con ello cree el último trozo de código.

prevUser=""
for file in $(cat optionsvars.txt)
do
    user=$(echo $file | awk -F"/" '{print $3}')

    if [ "$user" != "$prevUser" ]
    then
        hack=$(echo $file | awk -F"," '{print $2}')
        
        for clean in $(find /home/$user/public_html/ -name "*.php" -exec grep -il "$hack" {} \;)
        do
            echo "Limpiando $clean"
            sed -i.bak -E "s/()(<\?php)/\2/" $clean 
        done
      
        prevUser=$user
    fi
done

Imagen Designed by Freepik y modificada por Abdelkarim Mateos

Comparte este artículo

Artículo Antiguo
Este artículo tiene más de 2 años. Es muy probable que su contenido este anticuado, aunque pueda ser de utilidad, es conveniente que revises otras informaciones al respecto. Si lo encuentras útil o crees que puede ser actualizado, deja tu comentario con la actualización para poder editarlo y que pueda ser útil a los demás.

Comparte este articulo en

Abkrim

Yo solo se que no se nada, y que me paso la vida aprendiendo

Entradas recientes

Fatal error: Allowed memory size of 268435456 bytes exhausted en WordPress. Otro post más… pero diferente

No es la primera vez que me encuentro con el agotamiento de la memoria en…

5 meses hace

Problemas de Acceso con Centos 7, Almalinux 8, Ubuntu 20.04, y Debian 10/11: Un Enigma Firewall CSF

Descubre cómo solucionar problemas de acceso a servidores con Centos 7, Almalinux 8, Ubuntu 20.04…

9 meses hace

MySQL no inicia debido a errores en la base de datos interna de MySQL

Uno de los mensajes más alarmantes que puedes encontrarte es aquel que indica que tu…

11 meses hace

Actualización de seguridad 6.2.1 para WordPress y la importancia de los backups confiables

La seguridad de nuestro sitio web es de vital importancia en el mundo digital actual.…

12 meses hace

El mito de los ficheros SVG inseguros en las subidas de ficheros

Los ficheros SVG son archivos gráficos vectoriales escalables ampliamente utilizados en diseño web. Aunque no…

12 meses hace

Solución de problemas de errores 500 en Castris Hosting: una guía para usuarios de cPanel

En este artículo, te guiamos en la solución de problemas de errores 500 en Castris…

12 meses hace