====== Logdateien mit LogParser auswerten ======
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:.
===== access.log auswerten =====
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.
==== Status-Codes zählen ====
"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
==== User-Agents auswerten ====
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
==== Hacker-Angriffe entdecken ====
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
==== Ausgabe als HTML ====
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:
Potentiell böse Querystrings
Anzahl |
Remote Host |
Query |
%Anzahl% |
%remotehostname% |
%request% |
Die Markups , und dienen dem LogParser dazu, die einzelnen Bereiche des Templates zu erkennen. 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:
* Den Namen der HTML-Datei (sonst wird alles auf der Kommandozeile ausgegeben)
* Den Namen des Templates
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. ;)
===== Links =====
http://technet.microsoft.com/en-us/library/ee692937.aspx\\
http://mlichtenberg.wordpress.com/2011/02/03/log-parser-rocks-more-than-50-examples/