Dnes se chci zaměřit na téma, které může vést k velkým problémům s hacknutými účty, spamovými e-maily atd.:Zastaralé instalace Joomly na vašem serveru.
To samozřejmě platí i pro jiný software. Zmíněná metoda by měla fungovat podobným způsobem i u jiného softwaru. Od Joomla je široce rozšířen po celém internetu, zejména na sdíleném hostingu systémy CMS (Content Management System) , tento návod bude zatím pokrývat pouze Joomlu.
Předpoklady
Budete potřebovat alespoň nástroje bc a sed, které nejsou vždy standardně nainstalovány.
Začněme
Nejprve je tu jedna otázka:jak poznám verzi joomla z nainstalovaných souborů?
To závisí na nainstalované verzi Joomly. Doposud jsem našel tři různé soubory, které obsahují informace o verzi:
/libraries/joomla/version.php
/libraries/cms/version/version.php
/includes/version.php
Nejdůležitější řádky těchto souborů jsou číslo verze a vedlejší verze které jsou obsaženy v následujících proměnných:
var $RELEASE ='1.0';
var $DEV_LEVEL ='12';
V dalším kroku hledáme nejnovější verzi Joomly na oficiálních stránkách. V době psaní tohoto návodu existují tři skupiny verzí:1.5 (1.5.26), 2.5 (2.5.17) a 3.2 (3.2.1).
Vyhledání instalací joomly na vašem serveru
Jedna věc, kterou mají všechny instalace joomly společné, je název složky "components", takže hledáme všechny složky s tímto názvem. Zároveň ignorujeme všechny složky komponent, které jsou obsaženy v podsložce "administrátor". Základní cesta /var/www musí být upravena, pokud tam neleží webové stránky na vašem serveru.
najdi /var/www/ -type d -name 'komponenty' ! -celé jméno '**/administrator/components'
Tento příkaz vám poskytne seznam všech těchto složek. Příkaz dirname je vhodný pro získání cesty, která obsahuje složku komponent. Toto je základní cesta instalace Joomla.
Provádíme to ve smyčce pro všechny složky nalezených součástí:
pro L v `find /var/www/ -type d -name 'components' ! -celé jméno '**/administrátor/komponenty'`; do
D=`dirname $L`;
hotovo
Získat hlavní a vedlejší verzi
K získání verze vaší instalace použijeme kombinované příkazy "grep" a "sed".
Nejprve zkontrolujeme, který ze tří souborů, které jsem zmínil dříve, existuje v instalační cestě.
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" ]]; potom
F=$F3;
fi
else
echo "Nebyl nalezen žádný soubor verze joomla.";
fi
Nyní čteme hlavní a vedlejší verzi z tohoto souboru:
VERZE=`grep '$RELEASE' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"`;
SUBVERSION=`grep '$DEV_LEVEL' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"`;
Porovnat verze
Protože čísla verzí nejsou celá čísla, nemůžeme je porovnávat v bash skriptu pomocí -lt atd. Místo toho musíme použít externí program nazvaný bc:
ISOK=1;
if [[ $(echo "if (${VERZE} <1.5) 1 jinak 0" | bc) -eq 1 ]]; potom
# verze je nižší než 1,5
ISOK=0;
elif [[ $(echo "if (${VERSION} ==1,5) 1 jinak 0" | bc) -ekv 1 &&$(echo "if (${SUBVERSION} <26) 1 jinak 0" | bc) -eq 1 ]]; pak
# verze je 1.5.x, ale nižší než 1.5.26
ISOK=0;
### a tak dále – další kontroly verzí
jinak
ISOK=1;
fi
Úplný skript
Nyní jsme připraveni sestavit všechny části do připraveného skriptu a přidat některá drobná vylepšení. Skript vyhledá všechny verze joomly v dané základní cestě a vypíše informace o stavu. Samozřejmě nelze mluvit o verzi 1.5.26 jako "aktuální", ale jelikož se jedná o nejaktuálnější verzi větve 1.5 a aktualizace na větev 2.5 nebo 3.x je v některých případech velmi komplikovaná, tento skript tuto verzi označí jako "OK". Pokud chcete, můžete to změnit.
Zde je ukázkový výstup skriptu:
[INFO] verze 1.5.26 v /var/www/xxx je v pořádku.
[WARN] zastaralá verze Joomly 1.0.12 v /var/www/yyy
[VAROVÁNÍ] zastaralá verze Joomly 1.5.14 ve /var/www/zzz
[WARN] zastaralá verze Joomly 2.5.8 v /var/www/aaa
[WARN] zastaralá verze Joomly 1.5.10 v /var/www/bbb
A teď:kompletní scénář. Stačí jej uložit jako „joomlascan.sh“ a zavolat přes
bash joomlascan.sh
Pokud zadáte název souboru jako další argument (jako bash joomlascan.sh list.csv), získáte soubor s názvem list.csv, který obsahuje seznam všech zastaralých instalací:
/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
Tip:
Pokud používáte ISPConfig 3, měli byste změnit BASEPATH na 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 ;
S tímto skriptem je známý jeden problém:nedokáže rozpoznat Mambo. Takže označí všechny instalace mambo jako "OK" bez ohledu na to, jakou verzi mají.