Heute möchte ich mich auf ein Thema konzentrieren, das zu großen Problemen durch gehackte Accounts, Spam-Mails etc. führen kann:Veraltete Joomla-Installationen auf Ihrem Server.
Dies gilt natürlich auch für andere Software. Die genannte Methode sollte für andere Software ähnlich funktionieren. Seit Joomla ist im Internet weit verbreitet, insbesondere auf Shared Hosting Systeme CMS (Content Management System) , dieses Howto behandelt bisher nur Joomla.
Voraussetzungen
Sie benötigen mindestens die Tools bc und sed, die nicht immer standardmäßig installiert sind.
Lassen Sie uns beginnen
Zunächst stellt sich eine Frage:Wie erkenne ich die Joomla-Version anhand der installierten Dateien?
Dies hängt von der installierten Version von Joomla ab. Bis jetzt habe ich drei verschiedene Dateien gefunden, die die Versionsinformationen enthalten:
/libraries/joomla/version.php
/libraries/cms/version/version.php
/includes/version.php
Die wichtigsten Zeilen dieser Dateien sind die Versionsnummer und die Nebenversion die in folgenden Variablen enthalten sind:
var $RELEASE ='1.0';
var $DEV_LEVEL ='12';
Im nächsten Schritt suchen wir auf der offiziellen Website nach der neusten Version von Joomla. Zum Zeitpunkt der Erstellung dieses Howtos gibt es drei Versionsgruppen:1.5 (1.5.26), 2.5 (2.5.17) und 3.2 (3.2.1).
Finden Sie Joomla-Installationen auf Ihrem Server
Eine Sache, die alle Joomla-Installationen gemeinsam haben, ist der Ordnername "components", also suchen wir nach allen Ordnern mit diesem Namen. Gleichzeitig ignorieren wir alle Komponentenordner, die in einem Unterordner "administrator" enthalten sind. Der Basispfad /var/www muss angepasst werden, wenn die Webseiten auf Ihrem Server nicht darin liegen.
find /var/www/ -type d -name 'components' ! -wholename '**/administrator/components'
Dieser Befehl gibt Ihnen eine Liste aller dieser Ordner. Der Befehl dirname ist geeignet, um den Pfad zu erhalten, der den Komponentenordner enthält. Dies ist der Basispfad der Joomla-Installation.
Wir tun dies in einer Schleife für alle gefundenen Komponentenordner:
for L in `find /var/www/ -type d -name 'components' ! -wholename '**/administrator/components'`; do
D=`dirname $L`;
fertig
Haupt- und Nebenversion abrufen
Um die Version Ihrer Installation zu erhalten, verwenden wir die kombinierten Befehle "grep" und "sed".
Zuerst prüfen wir, welche der drei zuvor erwähnten Dateien im Installationspfad vorhanden ist.
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" ]]; dann
F=$F;
elif [[ -e "$F2" ]]; dann
F=$F2;
elif [[ -e "$F3" ]]; then
F=$F3;
fi
else
echo "Keine Joomla-Versionsdatei gefunden.";
fi
Jetzt lesen wir die Haupt- und Nebenversion aus dieser Datei:
VERSION=`grep '$RELEASE' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"`;
SUBVERSION=`grep '$DEV_LEVEL' $F | sed -r "s/^.*=\s*'(.*)'.*$/\1/g"`;
Versionen vergleichen
Da Versionsnummern keine ganzen Zahlen sind, können wir sie innerhalb des Bash-Skripts nicht mit -lt usw. vergleichen. Stattdessen müssen wir ein externes Programm namens bc:
verwenden
ISOK=1;
if [[ $(echo "if (${VERSION} <1.5) 1 else 0" | bc) -eq 1 ]]; then
# Version ist niedriger als 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 ]]; dann
# Version ist 1.5.x, aber niedriger als 1.5.26
ISOK=0;
### und so weiter - weitere Versionsprüfungen
sonst
ISOK=1;
fi
Das vollständige Skript
Jetzt können wir alle Teile zu einem gebrauchsfertigen Skript zusammenbauen und einige kleinere Verbesserungen hinzufügen. Das Skript sucht nach allen Joomla-Versionen im angegebenen Basispfad und gibt Informationen über den Status aus. Von einer Version 1.5.26 kann man natürlich nicht sprechen als "aktuell" markiert, da es sich aber um die aktuellste Version des 1.5-Zweigs handelt und ein Update auf den 2.5- oder 3.x-Zweig teilweise sehr aufwendig ist, markiert dieses Skript diese Version als "OK". Sie können dies ändern, wenn Sie möchten.
Hier ist eine Beispielausgabe des Skripts:
[INFO] Version 1.5.26 in /var/www/xxx ist ok.
[WARNUNG] veraltete Joomla-Version 1.0.12 in /var/www/yyy
[WARN] veraltete Joomla-Version 1.5.14 in /var/www/zzz
[WARN] veraltete Joomla-Version 2.5.8 in /var/www/aaa
[WARN] veraltete Joomla-Version 1.5.10 in /var/www/bbb
Und jetzt:das komplette Drehbuch. Einfach als "joomlascan.sh" speichern und über
aufrufenbash joomlascan.sh
Wenn Sie als zusätzliches Argument einen Dateinamen angeben (z. B. bash joomlascan.sh list.csv), erhalten Sie eine Datei namens list.csv, die eine Liste aller veralteten Installationen enthält:
/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
Tipp:
Wenn Sie ISPConfig 3 verwenden, sollten Sie den BASEPATH auf BASEPATH="/var/www/clients/client*/web*" ändern.
#!/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 ;
Es gibt ein bekanntes Problem mit diesem Skript:Es kann Mambo nicht erkennen. Daher werden alle Mambo-Installationen als "OK" markiert, unabhängig davon, welche Version sie haben.