Ir al contenido principal

DES hackear webs (PHP) y JOOMLA

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:
  • 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 tarea programada me envía un correo electrónico con los archivos que han sido modificados los últimos 20 días, si no hay ninguno no me manda ningún correo, si los encuentra envía un correo como este.



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

Entradas populares de este blog

Gestionar los permisos de directorio con vb.net

Hola a tod@s !!! El otro día me tope con un error a la hora de guardar un fichero en un directorio en el que en principio si debería tener acceso, ya que es el directorio de la aplicación. Estaba intentando guardar el archivo de esta manera: Dim numAleatorio As New Random(CInt(Date.Now.Ticks And Integer.MaxValue)) ficheroTemporal = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) & "\TEMP\" & _ System.Convert.ToString(numAleatorio.Next) & "_" & _ System.Convert.ToString(numAleatorio.Next) & ".tmp" Dim fs As IO.FileStream fs = New IO.FileStream(ficheroTemporal, IO.FileMode.Append) Esta instrucción crea en el directorio de la aplicación en una carpeta llamada TEMP un archivo temporal por la numeración que tiene tipo a 1248632552_1248632552.tmp, pero puede dar error por la siguientes causas:

Obtener la ultima versión con un BAT

Hola a tod@s, Cuantas veces nos hemos puesto a descargarnos un proyecto entero desde el Microsoft Visual SourceSafe y se nos a quedado o bloqueado o tirado este entorno gráfico. Aquí propongo una solución que para mi a sido de gran ayuda, es un archivo con extensión .BAT que se conecta a la base de datos del SourceSafe y descarga la ultima versión de todos los ficheros, salvo los que tengas desprotegidos en ese momento que no los toca. Es recomendable no tener abierto el proyecto en ese momento para que no te de problemas.

Backup MySql servidor compartido

Buenas a tod@s !!! Hoy se me a ocurrido dejaros este post sobre como hacer copias de seguridad de nuestras bases de datos de MySql en servidores en la nube como por ejemplo 1and1. Esta función estará metida en un fichero SH que ejecutaremos con una tarea CRON en nuestro servidor linux. Tener en cuenta que tenéis que tener permisos para ejecutar SSH, estos permisos solo se suelen dar en los contratos mas avanzados de los servidores compartidos. #!/bin/bash # ## ------ VARIABLES DE CONFIGURACION ----##