Hoy quiero centrarme en un tema que puede conducir a grandes problemas de cuentas pirateadas, correos no deseados, etc.:Instalaciones desactualizadas de Joomla en su servidor.
Por supuesto, esto también es válido para otro software. El método mencionado debería funcionar de manera similar para otro software. Desde Joomla está muy extendido en Internet, especialmente en alojamiento compartido sistemas CMS (Sistema de Gestión de Contenidos) , este howto solo cubrirá Joomla hasta ahora.
Requisitos previos
Necesitará al menos las herramientas bc y sed que no siempre están instaladas por defecto.
Comencemos
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 menor que están contenidos en las siguientes variables:
var $RELEASE ='1.0';
var $DEV_LEVEL ='12';
En un siguiente paso buscamos la versión más reciente de Joomla en el sitio web oficial. Al momento de escribir este howto hay tres grupos de versiones:1.5 (1.5.26), 2.5 (2.5.17) y 3.2 (3.2.1).
Encuentre instalaciones de joomla en su servidor
Una cosa que todas las instalaciones de joomla tienen en común es el nombre de la carpeta "components", por lo que buscamos todas las carpetas con este nombre. Al mismo tiempo ignoramos todas aquellas carpetas de componentes que están contenidas en una subcarpeta "administrador". La ruta base /var/www debe ajustarse si los sitios web de su servidor no se encuentran allí.
encuentre /var/www/ -type d -name 'components' ! -wholename '**/administrador/componentes'
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 base de la instalación de Joomla.
Hacemos esto en un bucle para todas las carpetas de componentes encontrados:
para L en `find /var/www/ -type d -name 'components' ! -wholename '**/administrador/componentes'`; hacer
D=`dirname $L`;
hecho
Obtener la versión principal y secundaria
Para obtener la versión de su instalación utilizaremos los comandos combinados "grep" y "sed".
Primero verificamos cuál de los tres archivos que mencioné 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;
si [[ -e "$F" || -e "$F2" || -e "$F3" ]]; entonces
if [[ -e "$F" ]]; entonces
F=$F;
elif [[ -e "$F2" ]]; entonces
F=$F2;
elif [[ -e "$F3" ]]; luego
F=$F3;
fi
else
echo "No se encontró el archivo de la versión de Joomla".;
fi
Ahora leemos la versión mayor y menor de este archivo:
VERSIÓN=`grep '$LIBERAR' $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 su lugar, necesitamos usar un programa externo llamado bc:
ISOK=1;
if [[ $(echo "if (${VERSION} <1.5) 1 else 0" | bc) -eq 1 ]]; entonces
# versión es inferior a 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 ]]; entonces
# versión es 1.5.x pero inferior a 1.5.26
ISOK=0;
### y así sucesivamente - más verificaciones de versión
otros
ISOK=1;
fi
El guión completo
Ahora estamos listos para ensamblar todas las partes en un script listo para usar y agregar algunas mejoras menores. El script buscará todas las versiones de joomla en la ruta base dada e imprimirá información sobre el estado. Por supuesto no se puede hablar de una versión 1.5.26 como "actual" pero como es la versión más actual de la rama 1.5 y una actualización a la rama 2.5 o 3.x es muy complicada en algunos casos, este script marcará esta versión como "OK". Puedes cambiar esto si quieres.
Aquí hay una salida de muestra del script:
[INFO] la versión 1.5.26 en /var/www/xxx está bien.
[ADVERTENCIA] versión desactualizada de Joomla 1.0.12 en /var/www/yyy
[ADVERTENCIA] versión desactualizada de Joomla 1.5.14 en /var/www/zzz
[ADVERTENCIA] Joomla versión 2.5.8 obsoleta en /var/www/aaa
[ADVERTENCIA] Joomla versión 1.5.10 obsoleta en /var/www/bbb
Y ahora:el guión completo. Simplemente guárdelo como "joomlascan.sh" y llámelo a través de
bash joomlascan.sh
Si proporciona un nombre de archivo como argumento adicional (como bash joomlascan.sh list.csv), 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 usa ISPConfig 3, debe modificar 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 de mambo como "OK" independientemente de la versión que tengan.