LinuxParty

NUESTRO SITIO necesita la publicidad para costear hosting y el dominio. Por favor considera deshabilitar tu AdBlock en nuestro sitio. También puedes hacernos una donación entrando en linuxparty.es, en la columna de la derecha.
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado
 

Hoy quiero centrarme en un tema que puede dar lugar a enormes problemas por cuentas hackeadas, correos de spam, etc: instalaciones de Joomla obsoletas en su servidor.

Por supuesto, esto es válido para otro software, también. El método mencionado debería funcionar de una manera similar para otros programas. Ya que Joomla, está muy extendido en todo el Internet, especialmente en sistemas de hosting compartido CMS (Content Management System), este howto sólo cubrirá Joomla por ahora.

Requisitos previos

Usted necesitará por lo menos, las herramientas bc y sed que no siempre se instalan por defecto.

Empecemos

Al principio hay una pregunta: ¿cómo puedo reconocer la versión de joomla de los archivos instalados?

Esto depende de la versión instalada de Joomla. Hasta ahora he encontrado tres archivos diferentes que contienen la información de la versión:


/libraries/joomla/version.php
/libraries/cms/version/version.php
/includes/version.php

Las líneas más importantes de estos archivos son el número de versión y la versión secundaria que se contienen en las siguientes variables:
var $RELEASE = '1.0';
var $DEV_LEVEL = '12';

En una siguiente etapa se busca la versión más reciente de Joomla en la web oficial. En el momento de escribir este Cómo hay tres grupos de versión: 1.5 (01/05/26), 2.5 (2.5.17) y 3.2 (3.2.1).

Encuentre instalaciones Joomla en su servidor

Una cosa que todas las instalaciones joomla tienen en común es la carpeta de nombre "components", por lo que buscamos todas las carpetas con este nombre. Al mismo tiempo ignoramos todas esas carpetas componentes que están contenidos en una subcarpeta "administrator". La base de ruta /var/ www debe ser ajustada si los sitios web en su servidor.

find /var/www/ -type d -name 'components' ! -wholename '**/administrator/components'

Este comando le dará una lista de todas esas carpetas. El comando dirname  es adecuado para obtener la ruta que contiene la carpeta de componentes. Esta es la ruta de la base de la instalación de Joomla.

Hacemos esto en un bucle para todos los componentes que se encuentran las carpetas:

for L in `find /var/www/ -type d -name 'components' ! -wholename '**/administrator/components'` ; do
    D=`dirname $L` ;
done

Obtenga la versión mayor y menor

Para obtener la versión de su instalación vamos a utilizar los comandos "grep" y "sed".

En primer lugar, comprobamos que de los tres archivos que he mencionado anteriormente existe en la ruta de instalación.

F=$D/libraries/joomla/version.php ;
F2=$D/libraries/cms/version/version.php ;
F3=$D/includes/version.php ;
if [[ -e "$F" || -e "$F2" || -e "$F3" ]] ; then
    if [[ -e "$F" ]] ; then
        F=$F ;
    elif [[ -e "$F2" ]] ; then
        F=$F2 ;
    elif [[ -e "$F3" ]] ; then
        F=$F3 ;
    fi
else
    echo "No joomla version file found." ;
fi

Ahora leemos la versión principal y secundaria de este archivo:

VERSION=`grep '$RELEASE' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"` ;
SUBVERSION=`grep '$DEV_LEVEL' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"` ;

Comparar versiones

Dado que los números de versión no son números enteros, no podemos compararlos dentro del script bash usando -lt etc En lugar de ello tenemos que utilizar un programm externo llamado bc:

ISOK=1 ;
if [[ $(echo "if (${VERSION} < 1.5) 1 else 0" | bc) -eq 1 ]] ; then
    # version is lower than 1.5
    ISOK=0 ;
elif [[ $(echo "if (${VERSION} == 1.5) 1 else 0" | bc) -eq 1 && $(echo "if (${SUBVERSION} < 26) 1 else 0" | bc) -eq 1 ]] ; then
    # version is 1.5.x but lower than 1.5.26
    ISOK=0 ;
### and so on - further version checks
else
    ISOK=1 ;
fi

El Script completo

Ahora estamos listos para ensamblar todas las piezas en un script listo para su uso y añadir algunas mejoras menores. La secuencia de comandos buscará todas las versiones de Joomla en la ruta de la base dada y Muestra información sobre el estado. Por supuesto que no se puede hablar de una versión 1.5.26 como "actual", pero ya que es la versión más actual de la rama 1.5 y una actualización de la rama 2.5 o 3.x es muy complicado en algunos casos, este script marcará este la versión "OK". Usted puede cambiar esto si quieres.

Aquí es un ejemplo del resultado de la secuencia de comandos:

[INFO] version 1.5.26 in /var/www/xxx is ok.
[WARN] outdated Joomla version 1.0.12 in /var/www/yyy
[WARN] outdated Joomla version 1.5.14 in /var/www/zzz
[WARN] outdated Joomla version 2.5.8 in /var/www/aaa
[WARN] outdated Joomla version 1.5.10 in /var/www/bbb

Y ahora: el script completo. Sólo tiene que guardar como "joomlascan.sh" y llamarlo a través de

bash joomlascan.sh

Si usted le da un nombre de archivo como argumento adicional (como bash joomlascan.sh list.csv), se obtiene un archivo llamado list.csv que contiene una lista de todas las instalaciones obsoletas:

/var/www/yyy;1.0.12;1.5.26
/var/www/zzz;1.5.14;1.5.26
/var/www/aaa;2.5.8;2.5.17
/var/www/bbb;1.5.10;1.5.26

Consejo:
Si utiliza ISPConfig 3, debe alterar el BASEPATH a BASEPATH="/var/www/clients/client*/web*".

#!/bin/bash

# current version 1.5.x
CUR15=26
# aktuelle version 2.5.x
CUR25=17
# aktuelle version 3.2.x
CUR3=1

#base path of the websites
BASEPATH="/var/www/"

# write to csv file (optional argument)
OUTFILE=$1

if [[ "$OUTFILE" != "" ]] ; then
    # empty CSV file
    echo -n "" > $OUTFILE ;
fi

for L in `find ${BASEPATH} -type d -name 'components' ! -wholename '**/administrator/components' | grep -v '/tmp/'` ; do
    D=`dirname $L` ;
    F=$D/libraries/joomla/version.php ;
    F2=$D/libraries/cms/version/version.php ;
    F3=$D/includes/version.php ;
    ISOK=0 ;
    SHOWNEWEST="" ;
    IMPORTANCE=0 ;
    if [[ -e "$F" || -e "$F2" || -e "$F3" ]] ; then
        if [[ -e "$F" ]] ; then
            F=$F ;
        elif [[ -e "$F2" ]] ; then
            F=$F2 ;
        elif [[ -e "$F3" ]] ; then
            F=$F3 ;
        fi
        VERSION=`grep '$RELEASE' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"` ;
        SUBVERSION=`grep '$DEV_LEVEL' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"` ;
        if [[ $(echo "if (${VERSION} < 1.5) 1 else 0" | bc) -eq 1 ]] ; then
            # version is lower than 1.5
            SHOWNEWEST="1.5.${CUR15}" ;
            IMPORTANCE=3 ;
        elif [[ $(echo "if (${VERSION} == 1.5) 1 else 0" | bc) -eq 1 && $(echo "if (${SUBVERSION} < ${CUR15}) 1 else 0" | bc) -eq 1 ]] ; then
            # version is 1.5.x but not most current version
            SHOWNEWEST="1.5.${CUR15}" ;
            IMPORTANCE=2 ;
        elif [[ $(echo "if (${VERSION} == 1.6) 1 else 0" | bc) -eq 1 ]] ; then
            # version is 1.6
            SHOWNEWEST="2.5.${CUR25}" ;
            IMPORTANCE=2 ;
        elif [[ $(echo "if (${VERSION} == 1.7) 1 else 0" | bc) -eq 1 ]] ; then
            # version is 1.7
            SHOWNEWEST="2.5.${CUR25}" ;
            IMPORTANCE=2 ;
        elif [[ $(echo "if (${VERSION} > 1.7) 1 else 0" | bc) -eq 1 && $(echo "if (${VERSION} < 2.5) 1 else 0" | bc) -eq 1 ]] ; then
            # version is somewhere between 1.7 and 2.5
            SHOWNEWEST="2.5.${CUR25}" ;
            IMPORTANCE=2 ;
        elif [[ $(echo "if (${VERSION} == 2.5) 1 else 0" | bc) -eq 1 && $(echo "if (${SUBVERSION} < ${CUR25}) 1 else 0" | bc) -eq 1 ]] ; then
            # version is 2.5 but lower than current
            SHOWNEWEST="2.5.${CUR25}" ;
            IMPORTANCE=1 ;
        elif [[ $(echo "if (${VERSION} >= 3) 1 else 0" | bc) -eq 1 && $(echo "if (${VERSION} < 3.2) 1 else 0" | bc) -eq 1 ]] ; then
            # version is 3.0 or 3.1
            SHOWNEWEST="3.2.${CUR3}" ;
            IMPORTANCE=2 ;
        elif [[ $(echo "if (${VERSION} == 3.2) 1 else 0" | bc) -eq 1 && $(echo "if (${SUBVERSION} < ${CUR3}) 1 else 0" | bc) -eq 1 ]] ; then
            # version is 3.2 but lower than current
            SHOWNEWEST="3.2.${CUR3}" ;
            IMPORTANCE=1 ;
        else
            ISOK=1 ;
            echo "[INFO] version $VERSION.$SUBVERSION in $D is ok." ;
        fi
    else
        # seems not to bee a joomla version ...
        ISOK=1 ;
    fi ;
    
    if [[ $ISOK -eq 0 ]] ; then
        echo "[WARN] outdated Joomla version $VERSION.$SUBVERSION in $D" ;
        if [[ "$OUTFILE" != "" ]] ; then
            # write CSV file
            echo "\"$D\";$VERSION.$SUBVERSION;$SHOWNEWEST;$IMPORTANCE" >> $OUTFILE ;
        fi
    fi
done

exit 0 ;

Hay un problema conocido con este script: no puede reconocer Mambo. Así que marcará todas las instalaciones del mambo como "OK", independientemente de la versión que tengan.

Pin It

Escribir un comentario


Código de seguridad
Refescar



Redes:



 

Suscribete / Newsletter

Suscribete a nuestras Newsletter y periódicamente recibirás un resumen de las noticias publicadas.

Donar a LinuxParty

Probablemente te niegues, pero.. ¿Podrías ayudarnos con una donación?


Tutorial de Linux

Filtro por Categorías