Script busca shells backdoors de php en linux


Icono de bash script

Puede darse el caso de que necesites estar constantemente, o en una ocasión concreta, buscando shells php subidas en tu servidor para dar acceso a algún cyberdelincuente. Estás shells pueden encontrarse en diferentes carpetas de /var/www o en cualquier otra que se haya configurado, así que el siguiente script busca constantemente shells para luego guardarlas en /root/shells con la fecha de captura y por supuesto dejándolas fuera de combate.

Ten en cuenta que al buscar pueden darse falsos positivos, así que antes de configurar el "machacashells" deberías comprobar que en el caso de que salgan falsos positivos los puedas deshabilitar con un grep -v para que no tenga en cuenta esos ficheros o carpetas a la hora de buscar la shells y eliminarlas.

Para buscar falsos positivos y que no se te borren ficheros que realmente no son shells ejecuta este comando.

grep -lroE '((eval.*(base64_decode|gzinflate|\$_))|\$[0O]{4,}|FilesMan|JGF1dGhfc|IIIl|die\(PHP_OS|posix_getpwuid|Array\(base64_decode|document\.write\("\\u00|sh(3(ll|11)))' /var/www/ --include=*.php* | grep -vE 'symfony|Twig'

El comando loq ue hace es buscar con la expresión regular en los ficheros que se alojan en /var/www/ que contengan en su nombre la palabra ".php" y después obvia los ficheros con las palabras "symfony|Twig" en su nombre o en el nombre de la ruta; es decir, en este ejemplo "/var/www/web/symfony/index.php" no se mostraría el fichero.

Revisa los ficheros que salen en la consulta y mira bien cuales son ficheros que sabes que no son shells de php. Mira los nombres de los ficheros y añade el nombe en la última parte del comando. Es decir, este trozo grep -vE 'symfony|Twig' . Por ejemplo en el caso de que quieras añadir un fichero que se llama pepe.php porque sabes que es un falso positivo el último grep del comando será así grep -vE 'symfony|Twig|pepe.php'.

Una vez tienes el comando añadelo al script sustituyendo el existente. En el caso de que no te salga ningún fichero en el comando anterior entonces dejalo tal cual.

Recuerda que únicamente es necesario configurar un cron para cuando quieras comprobar si existen shells. También tienes que instalar, en caso de que lo quieras, un cliente de correo para que te envie una alerta en caso de que quieras recibirlas cuando se encuentre una shell.

#!/sbin/bash
# Need installed mailutils
# apt-get install mailutils
# */1 * * * *   root    bash /root/searchShells.sh > /root/searchShells.log
server="servidor"
result=( $(grep -lroE '((eval.*(base64_decode|gzinflate|\$_))|\$[0O]{4,}|FilesMan|JGF1dGhfc|IIIl|die\(PHP_OS|posix_getpwuid|Array\(base64_decode|document\.write\("\\u00|sh(3(ll|11)))' /var/www/ --include=*.php* | grep -vE "symfony|Twig") )

if [[ ! -z "$result" ]];then
    date +"%Y-%m-%d %H:%M:%S"
    for (( j=0; j<${#result[@]}; j++ ))
    do
        nameFile=$(echo "${result[$j]}" | tr "/" _)
        nameFile=$(date +"%Y-%m-%d_%H:%M:%S")"-$nameFile-"
        echo "${result[$j]}"
        mv "${result[$j]}" /root/shells/"$nameFile"
    done
    mensaje="Alerta! Han subido shells en el server $server en los directorios ${result[@]}"
    asunto="Alerta! Han subido shells en el server $server -"$(date +"%Y-%m-%d %H:%M:%S")
    echo $mensaje | mail -s "$asunto" "admin.mail"
fi