En esta entrada voy explicar el funcionamiento de este Script de PHP que nos va a servir para mantener un control de nuestra web, de los archivos modificados, nuevos o que se les cambien los permisos.
Este Script esta en principio creado para Joomla, pero puede ser utilizado para cualquier web que este creada en PHP. El origen de este script viene de un hangout de desarrolloweb #joomlaIO, en el cual se explicaba como limpiar nuestra pagina web Joomla después de un ataque.
Después de ver el hangout, empece a realizar modificaciones en el Script, y estuve probandolo durante ya mas o menos un par de meses. He tenido que utilizarlo en varias ocasiones y ya esta más que pulido y automatizado.
He ido añadiendo versión a la vez que lo iba probando y me iban atacando las web del servidor estas versiones están en la cabecera del Script.
1.0.0 Codigo Base
1.1.0 Se añade las funciones de envio de coreo y se recoge el HTML para enviarlo por correo
Se añaden los archivos PHPmailes y Smtp
1.2.0 Se añade un control de direcctorio para no tener que escribir el directorio en el que esta.
En el asunto del correo se carga la variable HTTP_HOST
1.3.0 Se añade el parametro Show, que tiene dos modos 1 saca por pantalla la info y 0 o null, lo envia al correo.
1.4.0 Se configuran las leyendas
1.5.0 Se añade el nombre de este archivo para que no lo pille como fichero modificado recientemente "test_XXX.php". Line 121
1.6.0 Se añade el parametro delete_htaccess, que si es 1 elimina los archivos htaccess del directorio.
Comentaros que este Script esta preparado para que si encuentra alguna anomalía es decir si encuentra algún cambio en nuestra web, nos enviara un correo electronico, para ello, en este mismo Script al final esta integradas las clases class.phpmailer.php y class.smtp.php.
Para que nos envíe el correo tendremos que configurar nuestra cuenta de correo. Linea 31.
/*********************************************************
****** CABECERA DE CONFIGURACION --> PHP MAILER
**********************************************************/
$mail = new phpmailer();
$mail->PluginDir = "";
$mail->Mailer = "smtp";
$mail->Host = "smtp.pruebas.es";
$mail->Port="110";
$mail->SMTPAuth = true;
$mail->Username = "pruebas@pruebas.com";
$mail->Password = "Password";
Continuando con el código a diferencia del código inicial que tenia esta script en donde se ponía la ruta entera de donde se encontraba la web, encontré en Internet esta función que nos genera la ruta entera de nuestro servidor, como se ve a continuación. Linea 43.
/*****************************************************
* COMPROBAMOS LA INFORMACION SOBRE LOS DIRECTORIOS *
*****************************************************/
$path = $_SERVER['SCRIPT_FILENAME'];
$data["exists"] = is_file($path);// Comprobamos si el fichero es escribible
$data["writable"] = is_writable($path);// Leemos los permisos del fichero
$data["chmod"] = ($data["exists"] ? substr(sprintf("%o", fileperms($path)), -4) : FALSE);// Extraemos la extensión, un sólo paso
$data["ext"] = substr(strrchr($path, "."),1);// Primer paso de lectura de ruta
$data["path"] = array_shift(explode(".".$data["ext"],$path));// Primer paso de lectura de nombre
$data["name"] = array_pop(explode("/",$data["path"]));// Ajustamos nombre a FALSE si está vacio
$data["name"] = ($data["name"] ? $data["name"] : FALSE);// Ajustamos la ruta a FALSE si está vacia
$data["path"] = ($data["exists"] ? ($data["name"] ? realpath(array_shift(explode($data["name"],$data["path"]))) : realpath(array_shift(explode($data["ext"],$data["path"])))) : ($data["name"] ? array_shift(explode($data["name"],$data["path"])) : ($data["ext"] ? array_shift(explode($data["ext"],$data["path"])) : rtrim($data["path"],"/")))) ;
// Ajustamos el nombre a FALSE si está vacio o a su valor en caso contrario
$data["filename"] = (($data["name"] OR $data["ext"]) ? $data["name"].($data["ext"] ? "." : "").$data["ext"] : FALSE);// Devolvemos los resultados
$current_dir = $data["path"]."/";
Después de estas lineas en las que se prepara el correo y el PATH del directorio ya estaría la llamada a la función principal y el envío del correo, siempre y cuando, salten las alertas. Linea 61
/*********************************************
* ESTA ES LA LLAMADA A LA FUNCION PRINCIPAL **
*********************************************/
find_files($current_dir);
/*********************************************************
****** MENSAJE --> PHP MAILER
**********************************************************/
//Indicamos cual es nuestra dirección de correo y el nombre que
//queremos que vea el usuario que lee nuestro correo
$mail->From = "pruebas@pruebas.com";
$mail->FromName = "Control Web";
//El valor por defecto de Timeout es 10, le voy a dar un poco mas
$mail->Timeout=30;
//Indicamos cual es la dirección de destino del correo.
$mail->AddAddress('"pruebas@pruebas.com";');
$mail->AddBCC("pruebas@pruebas.com");
$mail->Subject = "(".$_SERVER['HTTP_HOST'].") Archivos --> ".$ssw;
//Cuerpo del mensaje. Puede contener html
$mail->Body = $msg;
$mail->AltBody = $msg;
$mail->isSendMail();
/* COMPROBAMOS QUE ACCION QUEREMOS REALIZAR
, MOSTRAR EN PANTALLA O ENVIAR CORREO*/
if(isset($_GET['show'])&&$_GET['show']=='1') {
echo $msg;
}else{
if($ssw > 0){
$resultado = $mail->Send();
}
}
Después de toda esta configuración y de la llamada a la función principal existen varias funciones las cuales he comentado en el código y comento aquí mismo también.
//$seed --> directorio de la web
function find_files($seed)
/************************************************************************************************
****** FUNCIONES check_files
* Se le añaden al array $str_to_find las funciones que se quiere que se encuentren como
* por ejemplo: "base64_decode", "djeu84m"
* Se quedan comentadas: Fucniones de alto Riesgo
* Se crea este array que contiene, los archivos de Joomla que contienen estas funciones, para que no los cuente como malos.
* Potencialmente peligrosas, creo que son útiles para el funcionamiento del sistema.
************************************************************************************************/
function check_files($this_file) {
//Esta función muestra los archivos htaccess y si tenemos el parámetro delete_htaccess a 1, elimina todos los archivos htaccess de la web.
function Control_htaccess()
/************************************************************************************************
****** FUNCIONES print_record_table()
* Imprime la tabla con los resultados, la leyenda con los resultados en la siguiente:
* - Eliminado: Archivo eliminado por estar en el array de eliminacion
* - PELIGRO MODIFICADO: Este en caso de Virus es el mas tipico, en el que le meten algun tipo de Script.
* - Mirar contenido: Este salta cuando no se tiene acceso al archivo, por ejemplo cuando se le cambian los permisos
* - FUNCION PELIGROSA: Este salta cuando dentro del contenido de uno de los ficheros se encuentra una funcion peligrosa
* - JOOMLA FILE: Archivo de Joomla pero con contenido que puede ser peligroso, por ahora no se tiene en cuenta.
* Hay que tener en cuenta en esta funcion, la variable "ssw", que contendra segun mi criterio el numero de
* archivos peligrosos detectados, no todos los tipos suman, solo suman: PELIGRO MODIFICADO, Mirar Contenido:... y FUNCION PELIGROSA.
************************************************************************************************/
function print_record_table()
//Esta funcion contiene un array de archivos que si queremos podemos eliminar, actualmente solo hay uno, index_backup.php, archivo que se crea con alguno de los ataques que hay a web de joomla.
function delete_the_file()
//Esta funcion lo unico que hace es escribir una leyenda que se mostrara en pantalla o en el correo electronico. function tabla_leyenda($time_dif)
Este Script PHP, tiene que recibir ciertos parámetros para que realice las acciones que deseamos o no recibir ninguna estas son las posibilidades que tiene:
Unas recomendaciones importantes, si os es posible mantener siempre actualizada vuestra versión de PHP del servidor, si utilizamos un CMS como Joomla, también al igual que sus componentes, plugins y plantillas, esto evita por lo menos el 95% de los ataques.
Descarga el Script completo.
Después de ver el hangout, empece a realizar modificaciones en el Script, y estuve probandolo durante ya mas o menos un par de meses. He tenido que utilizarlo en varias ocasiones y ya esta más que pulido y automatizado.
He ido añadiendo versión a la vez que lo iba probando y me iban atacando las web del servidor estas versiones están en la cabecera del Script.
1.0.0 Codigo Base
1.1.0 Se añade las funciones de envio de coreo y se recoge el HTML para enviarlo por correo
Se añaden los archivos PHPmailes y Smtp
1.2.0 Se añade un control de direcctorio para no tener que escribir el directorio en el que esta.
En el asunto del correo se carga la variable HTTP_HOST
1.3.0 Se añade el parametro Show, que tiene dos modos 1 saca por pantalla la info y 0 o null, lo envia al correo.
1.4.0 Se configuran las leyendas
1.5.0 Se añade el nombre de este archivo para que no lo pille como fichero modificado recientemente "test_XXX.php". Line 121
1.6.0 Se añade el parametro delete_htaccess, que si es 1 elimina los archivos htaccess del directorio.
Comentaros que este Script esta preparado para que si encuentra alguna anomalía es decir si encuentra algún cambio en nuestra web, nos enviara un correo electronico, para ello, en este mismo Script al final esta integradas las clases class.phpmailer.php y class.smtp.php.
Para que nos envíe el correo tendremos que configurar nuestra cuenta de correo. Linea 31.
/*********************************************************
****** CABECERA DE CONFIGURACION --> PHP MAILER
**********************************************************/
$mail = new phpmailer();
$mail->PluginDir = "";
$mail->Mailer = "smtp";
$mail->Host = "smtp.pruebas.es";
$mail->Port="110";
$mail->SMTPAuth = true;
$mail->Username = "pruebas@pruebas.com";
$mail->Password = "Password";
Continuando con el código a diferencia del código inicial que tenia esta script en donde se ponía la ruta entera de donde se encontraba la web, encontré en Internet esta función que nos genera la ruta entera de nuestro servidor, como se ve a continuación. Linea 43.
/*****************************************************
* COMPROBAMOS LA INFORMACION SOBRE LOS DIRECTORIOS *
*****************************************************/
$path = $_SERVER['SCRIPT_FILENAME'];
$data["exists"] = is_file($path);// Comprobamos si el fichero es escribible
$data["writable"] = is_writable($path);// Leemos los permisos del fichero
$data["chmod"] = ($data["exists"] ? substr(sprintf("%o", fileperms($path)), -4) : FALSE);// Extraemos la extensión, un sólo paso
$data["ext"] = substr(strrchr($path, "."),1);// Primer paso de lectura de ruta
$data["path"] = array_shift(explode(".".$data["ext"],$path));// Primer paso de lectura de nombre
$data["name"] = array_pop(explode("/",$data["path"]));// Ajustamos nombre a FALSE si está vacio
$data["name"] = ($data["name"] ? $data["name"] : FALSE);// Ajustamos la ruta a FALSE si está vacia
$data["path"] = ($data["exists"] ? ($data["name"] ? realpath(array_shift(explode($data["name"],$data["path"]))) : realpath(array_shift(explode($data["ext"],$data["path"])))) : ($data["name"] ? array_shift(explode($data["name"],$data["path"])) : ($data["ext"] ? array_shift(explode($data["ext"],$data["path"])) : rtrim($data["path"],"/")))) ;
// Ajustamos el nombre a FALSE si está vacio o a su valor en caso contrario
$data["filename"] = (($data["name"] OR $data["ext"]) ? $data["name"].($data["ext"] ? "." : "").$data["ext"] : FALSE);// Devolvemos los resultados
$current_dir = $data["path"]."/";
Después de estas lineas en las que se prepara el correo y el PATH del directorio ya estaría la llamada a la función principal y el envío del correo, siempre y cuando, salten las alertas. Linea 61
/*********************************************
* ESTA ES LA LLAMADA A LA FUNCION PRINCIPAL **
*********************************************/
find_files($current_dir);
/*********************************************************
****** MENSAJE --> PHP MAILER
**********************************************************/
//Indicamos cual es nuestra dirección de correo y el nombre que
//queremos que vea el usuario que lee nuestro correo
$mail->From = "pruebas@pruebas.com";
$mail->FromName = "Control Web";
//El valor por defecto de Timeout es 10, le voy a dar un poco mas
$mail->Timeout=30;
//Indicamos cual es la dirección de destino del correo.
$mail->AddAddress('"pruebas@pruebas.com";');
$mail->AddBCC("pruebas@pruebas.com");
$mail->Subject = "(".$_SERVER['HTTP_HOST'].") Archivos --> ".$ssw;
//Cuerpo del mensaje. Puede contener html
$mail->Body = $msg;
$mail->AltBody = $msg;
$mail->isSendMail();
/* COMPROBAMOS QUE ACCION QUEREMOS REALIZAR
, MOSTRAR EN PANTALLA O ENVIAR CORREO*/
if(isset($_GET['show'])&&$_GET['show']=='1') {
echo $msg;
}else{
if($ssw > 0){
$resultado = $mail->Send();
}
}
Después de toda esta configuración y de la llamada a la función principal existen varias funciones las cuales he comentado en el código y comento aquí mismo también.
//$seed --> directorio de la web
function find_files($seed)
/************************************************************************************************
****** FUNCIONES check_files
* Se le añaden al array $str_to_find las funciones que se quiere que se encuentren como
* por ejemplo: "base64_decode", "djeu84m"
* Se quedan comentadas: Fucniones de alto Riesgo
* Se crea este array que contiene, los archivos de Joomla que contienen estas funciones, para que no los cuente como malos.
* Potencialmente peligrosas, creo que son útiles para el funcionamiento del sistema.
************************************************************************************************/
function check_files($this_file) {
//Esta función muestra los archivos htaccess y si tenemos el parámetro delete_htaccess a 1, elimina todos los archivos htaccess de la web.
function Control_htaccess()
/************************************************************************************************
****** FUNCIONES print_record_table()
* Imprime la tabla con los resultados, la leyenda con los resultados en la siguiente:
* - Eliminado: Archivo eliminado por estar en el array de eliminacion
* - PELIGRO MODIFICADO: Este en caso de Virus es el mas tipico, en el que le meten algun tipo de Script.
* - Mirar contenido: Este salta cuando no se tiene acceso al archivo, por ejemplo cuando se le cambian los permisos
* - FUNCION PELIGROSA: Este salta cuando dentro del contenido de uno de los ficheros se encuentra una funcion peligrosa
* - JOOMLA FILE: Archivo de Joomla pero con contenido que puede ser peligroso, por ahora no se tiene en cuenta.
* Hay que tener en cuenta en esta funcion, la variable "ssw", que contendra segun mi criterio el numero de
* archivos peligrosos detectados, no todos los tipos suman, solo suman: PELIGRO MODIFICADO, Mirar Contenido:... y FUNCION PELIGROSA.
************************************************************************************************/
function print_record_table()
//Esta funcion contiene un array de archivos que si queremos podemos eliminar, actualmente solo hay uno, index_backup.php, archivo que se crea con alguno de los ataques que hay a web de joomla.
function delete_the_file()
//Esta funcion lo unico que hace es escribir una leyenda que se mostrara en pantalla o en el correo electronico. function tabla_leyenda($time_dif)
Este Script PHP, tiene que recibir ciertos parámetros para que realice las acciones que deseamos o no recibir ninguna estas son las posibilidades que tiene:
- www.misitio.com/test_XXX.php --> Generara un correo electrónico con los archivos que han sido modificados en los últimos 20 días
- &show=1 --> muestra por pantalla el resultado en vez de enviar un correo electrónico, no tendrá en cuanta los días a no ser que se pasen por parámetro.
- &days=20 --> Buscara los archivos modificados en los últimos 20 días.
- &commons=1 --> muestra los archivos de joomla
- &delete=1 --> elimina los archivos, que están en el array de eliminados.
- &delete_htaccess=1 --> eliminara todos los archivos .htaccess que encuentre, si tenemos alguno que sepamos que es nuestro 100%, hacemos una copia antes de ejecutar la eliminación.
Resumiendo, para que no te tengas que preocupar del tema lo que yo personalmente hago es una tarea programada o cron, que realiza la siguiente llamada:
- w3m http://www.misitio.com/test_XXX.php?days=20
Este correo lo recibí después de un ataque como el que describo a continuación, eso si en cuanto me llego el correo, ejecute la limpieza como describo mas abajo y listo.
Si hemos sufrido un ataque en nuestra web Joomla por ejemplo, y en el ataque nos han creado el archivo .htaccess en todos los directorios y un archivo index_backup.php, para ejecutar la limpieza del sitio en una llamada, haremos esta llamada:
- www.misitio.com/test_XXX.php?show=1&delete=1&delete_htaccess=1
Esta llamada, nos mostrara en pantalla (show=1), la lista de archivos eliminados (delete=1), de los archivos .htaccess eliminados (delete_htaccess=1), y seguramente que algún archivo más también que sera el causante de este ataque, que en estas ultimas semanas los crean llamándolos wp-xxxxxx.php. Advertencia, si vuestra web ya contiene archivos .htaccess ojo que este modo de ejecución los eliminara, habra que hacerse una copia de ellos antes o mantener una copia de nuestro sitio actualizada para comprobar si un archivo esta infectado o no.
Unas recomendaciones importantes, si os es posible mantener siempre actualizada vuestra versión de PHP del servidor, si utilizamos un CMS como Joomla, también al igual que sus componentes, plugins y plantillas, esto evita por lo menos el 95% de los ataques.
Descarga el Script completo.
Comentarios
Publicar un comentario