Ich zeige hier ein paar Möglichkeiten der Logdatei-Analyse mit Microsoft's LogParser 2.2 (kostenlos). Der LogParser ist hierbei in den Standardpfad installiert, XAMPP auf D:.
Hiermit ist das access.log
des Webservers gemeint. In den Beispielen benutze ich eine XAMPP-Installation als Quelle, man kann sich aber auch das access.log vom Webspace bei einem Provider runterladen und dieses auswerten. Natürlich immer vorausgesetzt, man hat Zugriff darauf.
Folgende „Spalten“ können abgefragt werden (auch über LogParser.exe -h -i:NCSA
zu ermitteln):
LogFilename (S) LogRow (I) RemoteHostName (S) RemoteLogName (S) UserName (S) DateTime (T) Request (S) StatusCode (I) BytesSent (I) Referer (S) User-Agent (S) Cookie (S)
(S) steht für String, (I) für Integer, (T) für Timestamp.
"c:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "select statuscode, count(*) as Anzahl FROM d:\xampp\apache\logs\access.log GROUP BY statuscode ORDER BY Anzahl DESC" -i:NCSA
Ergebnis (beispielhaft):
StatusCode Anzahl ---------- ------ 200 36146 500 513 301 430 404 67 302 5 403 1 Statistics: ----------- Elements processed: 37162 Elements output: 6 Execution time: 0.05 seconds
Was für die Statuscodes geht, geht auch für die User-Agents (Browser):
"c:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "select user-agent, count(*) as Anzahl FROM d:\xampp\apache\logs\access.log GROUP BY user-agent ORDER BY Anzahl DESC" -i:NCSA
Will man das nicht im Konsolenfenster, sondern z.B. als CSV, gibt man das mit dem Parameter -o an:
"c:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "select user-agent, count(*) as Anzahl FROM d:\xampp\apache\logs\access.log GROUP BY user-agent ORDER BY Anzahl DESC" -i:NCSA -o:CSV > output.csv
Man kann den Namen der Datei auch innerhalb des SELECT-Befehls angeben:
"c:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "select user-agent, count(*) as Anzahl INTO output.csv FROM d:\xampp\apache\logs\access.log GROUP BY user-agent ORDER BY Anzahl DESC" -i:NCSA -o:CSV
Hier gibt es furchtbar viele Varianten. Hacker versuchen oft, URLs zu mißbrauchen, die Parameter haben, z.B.
http://www.whatever.com/page/mypage.php?id=5
An diese werden dann diverse Zeichenketten angehängt, um beispielsweise ein Login-Fenster zu umgehen oder Informationen über die Datenbank zu erhalten. Ein potentiell suspekter String ist 'SELECT'.
"c:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "select count(*) as Anzahl, remotehostname, user-agent FROM d:\xampp\apache\logs\access.log WHERE request LIKE '%select%' GROUP BY user-agent, remotehostname ORDER BY Anzahl DESC" -i:NCSA
Anzahl RemoteHostName User-Agent ------ -------------- ---------------------------------------------- 600 127.0.0.1 python-requests/2.0.0 CPython/2.7.5 Windows/7 14 127.0.0.1 - 1 127.0.0.1 Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)
Auch ein leerer User-Agent könnte (muß aber nicht) ein Hinweis sein.
"c:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "select statuscode,remotehostname FROM d:\xampp\apache\logs\access.log WHERE user-agent is null order by statuscode asc" -i:NCSA -o:datagrid
Im Gegensatz zu den meisten anderen Formaten ist die Ausgabe als HTML etwas komplizierter. LogParser benötigt hierzu ein Template, in das es seine ermittelten Daten einfüllen kann. Wer aber BC-Templates kennt, kann auch hiermit umgehen. :)
Nehmen wir als Beispiel unsere Suche nach dem potentiell „bösen“ Querystring mit „SELECT“. Diesen möchten wir als HTML-Tabelle ausgeben und diese auch ein wenig 'hübsch machen'.
Also bauen wir uns zunächst mal unsere Vorlage:
<lpheader> <html> <head> <title>Potentiell böse Querystrings</title> <style type="text/css"> body{background-color:#fff;} table{border-collapse:collapse;} th,td{border:1px solid #000;} th{background-color:#ccc;} </style> </head> <body> <table> <thead> <tr> <th>Anzahl</th> <th>Remote Host</th> <th>Query</th> </tr> </thead> <tbody> </lpheader> <lpbody> <tr> <td>%Anzahl%</td> <td>%remotehostname%</td> <td>%request%</td> </tr> </lpbody> <lpfooter> </tbody> </table> </body> </html> </lpfooter>
Die Markups <LPHEADER>, <LPBODY> und <LPFOOTER> dienen dem LogParser dazu, die einzelnen Bereiche des Templates zu erkennen. <LPBODY> wird für jede Zeile der Ausgabe wiederholt, beinhaltet daher also auch die Platzhalter für die Werte. Die Platzhalter entsprechen hierbei den „Spaltennamen“.
Speichern wir nun diese Datei als querystrings.tpl
. Der Aufruf für den LogParser muß nun um zwei Werte erweitert werden:
Außerdem ändern wir das Ausgabeformat in -o:TPL
„c:\Program Files (x86)\Log Parser 2.2\LogParser.exe“ „select count(*) as Anzahl, remotehostname, request FROM d:\xampp\apache\logs\access.log TO output.html WHERE request LIKE '%select%' GROUP BY remotehostname,request ORDER BY Anzahl DESC“ -i:NCSA -o:TPL -tpl:querystrings.tpl
Ergebnis ist nun eine Datei output.html
mit einer Tabelle, die nach Remote Host und Querystring gruppiert und nach Anzahl sortiert die potentiellen Angriffe auflistet.
Natürlich ist hier noch etwas Feintuning am Template und ggfs. auch an der Abfrage denkbar. ;)