Benutzer-Werkzeuge

Webseiten-Werkzeuge


cookbook:logs

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:

<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:

  • 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. ;)

cookbook/logs.txt · Zuletzt geändert: 2014/09/24 00:00 (Externe Bearbeitung)