Für einen Webseitenbetreiber ist es wichtig zu wissen, ob seine Webanwendung Sicherheitsmängel aufweist und sollte deswegen diese oft darauf überprüfen. Jedoch ist es nicht immer möglich eine 100% Sicherheit zu gewährleisten und wenn ein Fehler eines großen CMSses wie Wordpress noch nicht publik ist oder er eine Schwachstelle übersehen hat, kann es zu einem Angriff durch Hacker kommen.
Diese verschaffen sich dann Zugriff auf die Anwendung und hinterlassen sowenig Spuren wie möglich, sodass der Webmaster optisch keine Änderung bemerkt. Technisch bietet ihm der access_log, in dem jegliche Zugriffe protokolliert werden, eine Anlaufstelle, denn dort werden dann auch die Zugriffe der Angreifer protokolliert.
Auf Uberspace hat der Nutzer nur lesenden Zugriff auf diese Logdateien, sodass der Angreifer seine Spuren nicht komplett verwischen kann, und das hilft ungemein.
Ich habe ein kleines Shellscript geschrieben, welches die access_log auf die bekanntesten Angriffsmuster (SQL Injection, Cross Site Scripting, Local File Inclusion) prüft und die Ergebnisse in einer Datei abspeichert.
Source:
#!/bin/bash
###Logscanner by Sebastian Neef
###www.gehaxelt.in
###Version 1.0
##Variables
RESULTFILE='scan.log'
##END Variables
##Check if parameter is set
if [ $1 ]
then
SCANFILE=$1
else
SCANFILE='logs/access_log' #Uberspace access_log path from ~
echo "Assuming that the path of access_log is logs/access_log."
echo "You can change the path over the first parameter"
fi
##END Check
##Check if file exists
if [ ! -f $SCANFILE ]
then
echo "File does not exist"
exit 1
fi
##END Check
##Preparing logfile
echo "##########" >> $RESULTFILE
echo "Starting new scan at "$(date +%d-%m-%Y-%R) >> $RESULTFILE
echo "Scanning $SCANFILE" >> $RESULTFILE
echo "##########" >> $RESULTFILE
##Preparing logfile
##Scan for SQL Injections
echo "Scanning for SQL Injections" >> $RESULTFILE
cat $SCANFILE | cut -d' ' -f-7 | grep -i -E 'table_name|substring|union|column_name|from' >> $RESULTFILE
##END Scan
##Scan for Cross Site Scripting (XSS)
echo "Scanning for Cross Site Scripting (XSS)" >> $RESULTFILE
cat $SCANFILE | cut -d' ' -f-7 | grep -i -E '\<script\>|alert|src\=|String\.FromCharCode|document\.write' >> $RESULTFILE
##END Scan
##Scan for Local File Inclusion (LFI)
echo "Scanning for Local File Inclusion (LFI)" >> $RESULTFILE
cat $SCANFILE | cut -d' ' -f-7 | grep -i -E '\.\.\/|\/etc\/passwd|\/etc\/group|php\:\/\/filter|%00' >> $RESULTFILE
##END Scan
##Finish
echo "Finished scan" >> $RESULTFILE
##END Finish
Was macht das Script?
Das Script zunächst davon aus, das es im Homeverzeichnis des Übernauten liegt und dort ausgeführt wird, sodass das der Pfad zur Logdatei logs/access_log lautet. Sollte das nicht so sein, so kann man den Pfad zur Logdatei über den ersten Parameter übergeben.
Danach prüft es, ob die angegebene Datei existiert, damit die weiteren Prüfungen durchgeführt werden können. Ist dies der Fall so wird die Ergebnisdatei mit dem Namen “scan.log” angelegt und dort dann der Scan-Header eingetragen.
Der Hauptteil folgt darauf, bei dem das Script nach den o.g. Angriffsmustern per Keywords in den aufgerufenen URLs der access_log sucht und die Ausgaben in der Ergebnisdatei gespeichert werden, sodass der Webmaster am Ende einer Prüfung sich nur die letzten Zeilen dieser Datei anschauen muss, um festzustellen, ob Unregelmäßigkeiten vorhanden sind.
Automatisierung
Man kann das Script nach einem Download per
cd ~
wget 'https://gehaxelt.in/blog/wp-content/uploads/2012/04/logscanner.sh_.txt' -O logscanner.sh
heruntergeladen werden und danach genügt ein
sh logscanner.sh
um das Script zu starten.
Möchte man nun das Script automatisieren, so nutzt man am Besten die Cronjobs. Möchte man sich dazu einen neuen einrichten, so führt man folgenden Befehl aus:
crontab -e
und fügt dort die folgende Zeile an.
0 07 * * * sh /home/gehaxelt/logscanner.sh
Ich wähle hier die Uhrzeit 7 Uhr, da dort die Serverauslastung diese Scanvorgänge locker wegpackt und die nächtlichen Hacking-Sessions der Angreifer bestimmt vorüber sind ;)
Mit einem Strg+X und einem Abnicken mit Y ist der neue Cronjob.
Was nun?
Ich hoffe für euch, das dieses Script bei euch keine Ausgabe erzeugt, ansonsten seid ihr Opfer eines Angriffes geworden. Ihr solltet euch trotzdem täglich die Ergebnisdatei einmal anschauen, um zu prüfen, ob irgendwas dazugekommen ist.
Update
Sven-Erik Neve war so nett, hat das Script ein wenig angepasst und mir erlaubt, dies hier vorzustellen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
Vielen Dank Sven(-Erik) !
Gruß
gehaxelt