En las últimas semanas nuestro equipo de trabajo ha estado levantando estadísticas de los sitios web que han sido vulnerados, clasificándolos de acuerdo a su dominio, y durante ese proceso nos hemos dado a la tarea de validar si los webadmin han detectado el problema y si han mitigado la vulnerabilidad, el resultado fue alarmante, el 80% de los casos el problema seguía latente, en el 30% de los casos la Prueba dejada por el atacante todavía seguía ahí.
El 100% de los casos fueron reportados como defacement en el sitio zone-h.org, sin embargo ¿cómo saber si han dejado algo más, en nuestro servidor? Por ejemplo un web Shell, lo cual dejaría vulnerable nuestro server a merced del atacante.
Comencemos entendiendo que es un web Shell y como funciona, pues es si lo vemos de la manera más simple es un trozo de código que le permite al atacante ejecutar comandos en nuestro servidor a su antojo, en su forma más sencilla sería algo como esto:
<?php system($_GET[«cmd»]); ?>
Donde el código espera un parámetro y luego lo ejecuta, si el servidor no ha sido endurecido apropiadamente, el comando se ejecutara sin problemas, permitiendo al atacante realizar cualquier actividad que el usuario dueño del servicio web le permita. Otras variantes pueden ser:
<?php Shell_exec($_POST[«cmd»]); ?>
<?php passthru ($_GET[«cmd»]); ?>
Y existe una gran variedad de posibilidades, según cada programador, de lo simple a lo complejo, ahora bien todos ellos tendrán alguna de estas funciones, entonces
¿cómo saber si tengo alguno de estos web Shell en mi servidor? Si es un Linux podríamos realizar una búsqueda simple como la siguiente:
# grep -lir «shell_exec\|system\|passthru\|strrev» /var/www/html/
Y este nos devolverá todos los archivos que en tu código usen esas funciones, ahí estarán webshell de atacantes que han dejado en nuestro directorio web o códigos que nuestros desarrolladores usen que deberían ser corregidos pues código que usen esas funciones pueden ser explotados por atacantes.
Se deberá revisar cada archivo que haya sido listado por el comando.
Debido a que los webshell pueden ser más complejos que los trozos de códigos mostrados en este artículo, se recomienda realizar una búsqueda más extensiva, por personal calificado para esta tarea, o utilizar una herramienta como un Shell detector
https://github.com/emposha/PHP-Shell-Detector
Siempre es necesario validar cada archivo de manera manual para descartar los falsos positivos.
Ahora siempre es bueno pensar cómo prevenir, los web Shell, una buena gestión de cambios, es el primer paso, ya que esto nos podrá indicar cuando fueron agregados nuevos archivos, quien los modifico y la razón, podemos automatizar esto a través de procesos de auditoria de sistemas operativos o utilizando un FIM (File Integrity Manager), un SysLog, y un SIEM.
Sanitizar nuestros códigos de funciones como las mostradas, validar los archivos que se suben a nuestro sitio para garantizar que son lo que dicen ser.
Los directorios utilizados para la subida de archivos deberán ser colocados en zonas no ejecutables dentro de nuestro servidor web, es decir fuera de nuestro directorio www.
El usuario utilizado para ejecutar nuestros procesos web, no deben tener permisos administrativos.
Espero que les sirva, y si tienen dudas favor deja tu comentario.