Oggi voglio concentrarmi su un argomento che può portare a enormi problemi di account hackerati, mailing di spam ecc.:Installazioni Joomla obsolete sul tuo server.
Naturalmente, questo vale anche per altri software. Il metodo menzionato dovrebbe funzionare in modo simile per altri software. Da Joomla è ampiamente diffuso su Internet, in particolare su hosting condiviso sistemi CMS (Sistema di gestione dei contenuti) , questo howto coprirà solo Joomla finora.
Prerequisiti
Avrai bisogno almeno degli strumenti bc e sed che non sono sempre installati per impostazione predefinita.
Iniziamo
All'inizio c'è una domanda:come posso riconoscere la versione di Joomla dai file installati?
Questo dipende dalla versione installata di Joomla. Finora ho trovato tre diversi file che contengono le informazioni sulla versione:
/libraries/joomla/version.php
/libraries/cms/version/version.php
/includes/version.php
Le righe più importanti di questi file sono il numero di versione e la versione secondaria che sono contenuti nelle seguenti variabili:
var $RELEASE ='1.0';
var $DEV_LEVEL ='12';
In un passaggio successivo cerchiamo la versione più recente di Joomla sul sito ufficiale. Al momento della stesura di questo howto ci sono tre gruppi di versioni:1.5 (1.5.26), 2.5 (2.5.17) e 3.2 (3.2.1).
Trova installazioni di joomla sul tuo server
Una cosa che tutte le installazioni di Joomla hanno in comune è il nome della cartella "components", quindi cerchiamo tutte le cartelle con questo nome. Allo stesso tempo ignoriamo tutte quelle cartelle di componenti che sono contenute in una sottocartella "amministratore". Il percorso di base /var/www deve essere modificato se i siti Web sul tuo server non si trovano lì.
trova /var/www/ -type d -name 'components' ! -nome completo '**/amministratore/componenti'
Questo comando ti darà un elenco di tutte quelle cartelle. Il comando dirname è adatto per ottenere il percorso che contiene la cartella dei componenti. Questo è il percorso di base dell'installazione di Joomla.
Lo facciamo in un ciclo per tutte le cartelle dei componenti trovati:
per L in `find /var/www/ -type d -name 'components' ! -nome completo '**/amministratore/componenti'`; do
D=`dirname $L`;
fatto
Ottieni la versione maggiore e minore
Per ottenere la versione della tua installazione utilizzeremo i comandi combinati "grep" e "sed".
Per prima cosa controlliamo quale dei tre file che ho menzionato in precedenza esiste nel percorso di installazione.
F=$D/librerie/joomla/version.php;
F2=$D/librerie/cms/version/version.php;
F3=$D/includes/version.php;
se [[ -e "$F" || -e "$F2" || -e "$F3" ]]; quindi
se [[ -e "$F" ]]; quindi
F=$F;
elif [[ -e "$F2" ]]; quindi
F=$F2;
elif [[ -e "$F3" ]]; quindi
F=$F3;
fi
else
echo "Nessun file di versione joomla trovato.";
fi
Ora leggiamo la versione maggiore e minore da questo file:
VERSIONE=`grep '$VERSIONE' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"`;
SUBVERSION=`grep '$DEV_LEVEL' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"`;
Confronta versioni
Poiché i numeri di versione non sono numeri interi, non possiamo confrontarli all'interno dello script bash usando -lt ecc. Dobbiamo invece usare un programma esterno chiamato bc:
ISOK=1;
if [[ $(echo "if (${VERSION} <1.5) 1 else 0" | bc) -eq 1 ]]; then
# versione è inferiore a 1.5
ISOK=0;
elif [[ $(echo "if (${VERSION} ==1.5) 1 else 0" | bc) -eq 1 &&$(echo "se (${SUBVERSIONE} <26) 1 altro 0" | bc) -eq 1 ]]; quindi
# versione è 1.5.x ma inferiore a 1.5.26
ISOK=0;
### e così via - ulteriori controlli della versione
altro
ISOK=1;
fi
Lo script completo
Ora siamo pronti per assemblare tutte le parti in uno script pronto per l'uso e aggiungere alcuni piccoli miglioramenti. Lo script cercherà tutte le versioni di Joomla nel percorso di base specificato e stampa le informazioni sullo stato. Ovviamente non si può parlare di una versione 1.5.26 come "corrente" ma poiché è la versione più recente del ramo 1.5 e un aggiornamento al ramo 2.5 o 3.x è molto complicato in alcuni casi, questo script contrassegnerà questa versione come "OK". Puoi cambiarlo se lo desideri.
Ecco un esempio di output dello script:
[INFO] versione 1.5.26 in /var/www/xxx è ok.
[WARN] Joomla versione 1.0.12 obsoleta in /var/www/yyy
[WARN] Joomla versione 1.5.14 obsoleta in /var/www/zzz
[WARN] Joomla versione 2.5.8 obsoleta in /var/www/aaa
[WARN] Joomla versione 1.5.10 obsoleta in /var/www/bbb
E ora:lo script completo. Basta salvarlo come "joomlascan.sh" e chiamarlo tramite
bash joomlascan.sh
Se assegni un nome file come argomento aggiuntivo (come bash joomlascan.sh list.csv), ottieni un file chiamato list.csv che contiene un elenco di tutte le installazioni obsolete:
/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
Suggerimento:
Se usi ISPConfig 3, dovresti modificare BASEPATH in 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 ;
C'è un problema noto con questo script:non può riconoscere Mambo. Quindi contrassegnerà tutte le installazioni di mambo come "OK" indipendentemente dalla versione che hanno.