Logfile Analyse – Den Bots auf der Spur

1. Verräterische SpurenLogfile-Analyse

Bots sind Computerprogramme, die sich wiederholende Aufgaben automatisch abarbeiten. Suchmaschinen setzen beispielsweise Webcrawler (Searchbots) ein, um Webseiten zu analysieren und den Inhalt zu indexieren. Sie halten sich dabei meist an die festgelegten Grenzen innerhalb der robots.txt im Stammverzeichnis einer Domain.

Webcrawler von großen Suchmaschinen, wie Google oder Bing, sind auf den meisten Webseiten willkommene Besucher – doch daneben existiert eine hohe Dunkelziffer an weiteren Bots. Diese „ungebetenen Gäste“ verfolgen andere Ziele, wie beispielsweise das Sammeln von E-Mail-Adressen für Werbezwecke bzw. Spam-Mails. Wiederum andere Bots versuchen Webinhalte unautorisiert zu kopieren oder suchen systematisch nach Sicherheitslücken in Servern / Software mit dem Ziel die Webseite zu kompromittieren.

In den Logfiles der Webserver (Apache, nginx, lighttpd, usw.) hinterlassen Bots regelmäßig ihre Spuren und doch findet eine Auswertung der Informationen meist nicht statt. Dabei kann eine regelmäßige Analyse helfen, unerwünschte Besucher zu identifizieren und Probleme mit der Webseite zu erkennen.

2. Logfile Analyse

Viele Tools ermöglichen die Auswertung von Webserver-Logdateien. Zu den bekanntesten zählen The Webalizer und AWStats. Bei den meisten Webhosting Angeboten oder Servern ist eines der Tools bereits vorinstalliert und dient dem Anwender zur Analyse seiner Besucher. Grafisch ansprechender sind neue Lösungen wie Matomo oder Google Analytics.

Eines haben all diese Tools gemeinsam: Sie kratzen lediglich an der Oberfläche von Logfiles. Wer den Bots auf die Spur kommen möchte muss etwas tiefer graben. Dafür eignet sich eine Kombination aus Terminalbefehlen, bestehend aus den Tools grep, awk und sed – Voraussetzung ist der Komplettzugriff auf den Server.

2.1 Combined Log Format

Webserver wie Apache oder nginx protokollieren Zugriffe auf Webseiten im Combined Log Format. Ein Auszug mit zwei Einträgen sieht folgendermaßen aus:

183.121.143.32 - - [08/Aug/2013:08:04:22 +0200] 
"GET /images/logo.jpg HTTP/1.1" 200 512 "http://www.wikipedia.org/" 
"Mozilla/5.0 (Windows NT 6.2; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0"

183.121.143.32 - - [08/Aug/2013:08:05:03 +0200] 
"GET /images/bild.png HTTP/1.1" 200 805 
"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Aufsplitten lässt sich dies in folgende Bedeutungen:

  • [1] 183.121.143.32 – IP-Adresse des Besuchers.
  • [2 ]“-“ – Identität des Clients. Wird standardmäßig nicht ermittelt.
  • [3] „-“ – Wer die Anfrage gestellt hat.
  • [4] [08/Aug/2013/:08:04:22 +0200] – Zeitstempel wann der Zugriff stattgefunden hat.
  • [5] GET /images/logo.jpg HTTP/1.1 – Was der Client angefordert hat, inklusive des Übertragungsprotokolls.
  • [6] 200 – Statuscode den der Server zum Client zurückschickt.
  • [6] 512 – Größe der gesendeten Datenmenge in Byte.
  • [8] https://www.wikipedia.org/ – Von welcher Internetseite der Zugriff erfolgt.
  • [9] Mozilla/5.0 (Windows NT 6.2; […] – Mit welchem Browser und Betriebssystem der Zugriff erfolgt.

Im weiteren Verlauf des Beitrags werden Konsolenbefehle vorgestellt, mit denen sich die gigantischen Logfiles anschaulich darstellen lassen. Bei den Beispielen handelt es sich um Auszüge eines nginx Webservers, dessen Logfiles unter »/var/log/nginx/access.log« liegen.

3. User-Agent Analyse

Im Normalfall übertragen Browser bei der HTTP-Anfrage auf eine Webseite ihren User-Agent. Darin enthalten sind Informationen zur aktuellen Browser-Version und des verwendeten Betriebssystems. Generell ist die Übertragung des User-Agents optional und kann vor der Übertragung auch beliebig manipuliert werden. Ganz einfach funktioniert das mit dem User Agent Switcher für Firefox oder User-Agent Switcher für Chrome.

3.1 Darstellung der Häufigkeit

Mit einem einfachen Befehl lassen sich alle User-Agents sortiert nach der Häufigkeit darstellen:

awk -F\" '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -n

Die Aussagekraft ist natürlich begrenzt, da sich der User-Agent manipulieren bzw. auch unterdrücken lässt. Eine Auswertung ist dennoch interessant, um diverse Bots und deren User-Agent kennenzulernen. Eine Liste mit bekannten User-Agents von Suchmaschinen ist hier verlinkt.

Ein Auszug vom 07.08.2013 zeigt die häufige Verwendung von Firefox in der Version 22:
User-Agents

3.2 GoogleBot Auswertung

Welche Inhalte hat der GoogleBot gecrawlt bzw. besucht:

awk -F\" '($6 ~ /Googlebot/){print $2}' /var/log/nginx/access.log.1 | awk '{print $2}'

GoogleBot

3.3 Leere User-Agents

In den Logfiles sind häufig leere User-Agents „-“ zu finden. Das kann mehrere Gründe haben. Oftmals steckt dahinter ein Bot, der so seine Identität verschleiert. Aber auch Anwender manipulieren ihren User-Agent und schicken bei HTTP-Anfragen einfach einen leeren Wert.

Ausgabe aller Domain-Namen bzw. IP-Adressen mit leerem User-Agent nach Häufigkeit:

awk -F\" '($6 ~ /^-?$/)' /var/log/nginx/access.log | awk '{print $1}' | logresolve | uniq -c | sort -n

Blank-User

4. Scraper und Harvester

Scraper oder Harvester sind Bots, die den Inhalt einer Webseite, Blog oder Feed kopieren. Generell werden damit zwei Ziele verfolgt:

  • Anfertigen einer 1:1 Kopie von erfolgreichen Webseiten, deren Unterseiten gute SEO Werte in Suchmaschinen aufweisen. Anschließend wird der Inhalt unter einem anderen Domain-Namen gehostet und durch Werbeeinblendungen Geld verdient.
  • Indirekt wird der Original-Seite damit ein Image-Schaden zugefügt. Suchmaschinen reagieren auf kopierte Inhalte oftmals mit einer Abwertung der Original-Seite, bis der „Content-Dieb“ eindeutig festgestellt werden kann.

Auch von meinen Beiträgen wurden schon einige „vervielfältigt“. So ist zum Beispiel mein Beitrag Whatsapp unsicher – Authentifizierungs-Lücke auch hier zu finden.

4.1 Anzeige der Top-Traffic Verbraucher

Mit diesem Befehl lässt sich herausfinden, welche IP-Adressen (Top50) besonders viel Verkehr verursachen:

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -n | tail -50

Top Traffic
Anzeige der Top 50 inklusive Auflösung der IP-Adresse in den Domain-Namen mit dem Befehl logresolve.

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -n | tail -50 | awk '{print $2,$2,$1}' | logresolve | awk '{printf "%6d %s (%s)\n",$3,$1,$2}'

LogresolveDarstellung aller aufgerufenen Seiten der IP-Adresse »95.208.68.109«:

grep 95.208.68.109  /var/log/nginx/access.log.1 | more

Damit lässt sich anschaulich darstellen, wann und welche Art von Zugriffen auf die Webseite stattgefunden hat. Auf Folgendes gilt es dabei zu achten:

  • Wann und wie oft Seiten aufgerufen wurden. Ist ein Muster erkennbar?
  • Welche Seiten aufgerufen wurden. Sind Zusammenhänge mit den Beiträgen erkennbar oder werden wahllos Seiten aufgerufen?
  • Welche Server Status Codes gibt der Server zurück?
  • Welchen User-Agent benutzt die IP-Adresse? Wechselt der User-Agent ständig?

4.2 Scraper und Harvester finden

Auf der Webseite Project Honey Pot werden Statistiken von Harvestern veröffentlicht. In der Liste „Top Harvester User Agents of all time“ mischt der User-Agent »Java/*« ganz oben mit.

Gezielt nach diesem User-Agent suchen und die dazugehörige IP-Adresse anzeigen:

awk -F\" '($6 ~ /^Java/)' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -n

Java-Agent

4.3 Hotlinker finden

Hotlinking dient dem Einbinden von Medien (Bilder, Videos, etc.) in eine Webseite, die auf einem anderen Host gespeichert sind. Oftmals wird die Technik dazu verwendet, um den Datenverkehr auf der eigenen Webseite zu entlasten. Auch von Content-Dieben wird diese Technik gerne angewendet. Mit folgendem Befehl kann dargestellt werden, welche Fremdquellen auf *.jpg oder *.png Bilder zugreifen:

awk -F\" '($2 ~ /\.(jpg|png)/ && $4 !~ /^http:\/\/www\.webseite\.de/){print $4}' /var/log/nginx/access.log | sort | uniq -c | sort -n

Hotlinking
Quellen die nicht direkt zugeordnet werden können sind einen Besuch wert!

5. Probleme auf der Seite identifizieren

Mit den Terminalbefehlen lassen sich nicht nur unerwünschte Bots identifizieren, sondern auch Probleme mit der Seite ausfindig machen. Häufig vorkommende HTTP-Statuscodes:

  • 200 – Alles in Ordnung. Die Anfrage wurde erfolgreich bearbeitet und das Ergebnis der Anfrage wird übertragen.
  • 206 – Der angeforderte Teil des Inhalts wurde erfolgreich übertragen.
  • 301 – Der Inhalt steht ab sofort unter einer anderen Adresse (Redirect) zur Verfügung.
  • 302 – Der Inhalt steht ab sofort auf einer neuen Adressen zur Verfügung. Allerdings bleibt auch die alte Adresse weiterhin gültig.
  • 304 – Der Inhalt der angefragten Seite hat sich seit der letzten Abfrage durch den Client nicht verändert und wird nicht übertragen.
  • 401 – Die Authentifizierung gegenüber einer Passwortabfrage war ungültig.
  • 403 – Der Zugriff auf den Inhalt ist verboten und kann mangels Berechtigung nicht erfolgen.
  • 404 – Der angeforderte Inhalt wurde nicht gefunden.

5.1 Ausgabe aller Server Meldungen

Ausgabe aller Statuscodes sortiert nach Häufigkeit:

awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -n

Status-Codes
Auch der Zugriff auf bereits komprimierte Logfiles ist dank gzip kein Problem:

gzip -dc /var/log/nginx/access.log.7.gz | awk '{print $9}' | sort | uniq -c | sort -n

Du kannst den Blog aktiv unterstützen!

Unabhängig. Kritisch. Informativ. Praxisnah. Verständlich.

Die Arbeit von kuketz-blog.de wird vollständig durch Spenden unserer Leserschaft finanziert. Sei Teil unserer Community und unterstütze unsere Arbeit mit einer Spende.

Mitmachen ➡

5.2 Fehler lokalisieren

Alle Seiten ausgeben, die einen 404-Status Code erzeugt haben:

awk '($9 ~ /404/)' /var/log/nginx/access.log | awk '{print $9,$7}' | uniq -c | sort -n

Ausgabe welche IP-Adressen auf die 404-Seite zugegriffen haben:

awk -F\" '($2 ~ "^GET /link/zu/errorseite"){print $1,$4,$6}' /var/log/nginx/access.log

Alle Seiten ausgeben, die keinen 200-Status Code erzeugt haben:

awk '($9 !~ /200/)' /var/log/nginx/access.log | awk '{print $9,$7}' | uniq -c | sort -n

6. Fazit

Mit den Terminalbefehlen lassen sich Bots und Probleme mit einfachen Mitteln identifizieren. Doch was kann man effektiv gegen Bots tun? Im Artikel Spam-Bot Protection – WordPress absichern Teil6 habe ich darauf schon teilweise die Antwort gegeben. Auch gegen Scraper, Harvester und Hotlinker lassen sich effektive Maßnahmen ergreifen, die ich in einem weiteren Artikel vorstellen werde.

Es wird niemals gelingen alle bösartigen Bots zu blockieren, weil es einfach zu viele Variationen, Verhalten und Möglichkeiten gibt. Um diese blockieren zu können, muss man sie zunächst identifizieren können. Genau das könnt ihr mit den oben dargestellten Befehlen und etwas ausprobieren erreichen.

Wenn ihr weitere, nützliche Befehle kennt dann nutzt die Kommentarfunktion oder schreibt mir eine Nachricht.

Bildquellen:

Examines files: „#47914261“, https://de.fotolia.com/id/47914261

Über den Autor | Kuketz

Mike Kuketz

In meiner freiberuflichen Tätigkeit als Pentester / Sicherheitsforscher (Kuketz IT-Security) schlüpfe ich in die Rolle eines »Hackers« und suche nach Schwachstellen in IT-Systemen, Webanwendungen und Apps (Android, iOS). Des Weiteren bin ich Lehrbeauftragter für IT-Sicherheit an der Dualen Hochschule Karlsruhe, sensibilisiere Menschen in Workshops und Schulungen für Sicherheit und Datenschutz und bin unter anderem auch als Autor für die Computerzeitschrift c’t tätig.

Der Kuketz-Blog bzw. meine Person ist regelmäßig in den Medien (heise online, Spiegel Online, Süddeutsche Zeitung etc.) präsent.

Mehr Erfahren ➡

SpendeUnterstützen

Die Arbeit von kuketz-blog.de wird zu 100% durch Spenden unserer Leserinnen und Leser finanziert. Werde Teil dieser Community und unterstütze auch du unsere Arbeit mit deiner Spende.

Folge dem Blog

Wenn du über aktuelle Beiträge informiert werden möchtest, hast du verschiedene Möglichkeiten, dem Blog zu folgen:

Bleib aktuell ➡


Diskussion

3 Ergänzungen zu “Logfile Analyse – Den Bots auf der Spur”

  1. Comment Avatar Carsten sagt:

    Schöner Artikel, verständlich erklärt und zusammengefasst.

    Wer keine Möglichkeit hat, über eine Konsole auf die Logdateien seiner Seiten zuzugreifen, lädt sich die Logs einfach per FTP herunter – ist zwar nicht live, so erhält man aber auch einen guten Überblick über den Verkehr auf seinen Seiten. error_logs lassen sich da auch gleich mit auswerten.

  2. Comment Avatar Torsten sagt:

    Wenn Du den geklauten Beitrag bei WordPress.com melden möchtest, dann kannst Du das hier tun: https://en.wordpress.com/abuse/
    Bzw. für Copyright-Verletzungen dann hier: https://automattic.com/dmca-notice/

  3. Comment Avatar Torsten sagt:

    @Carsten: Danke für den Link, nach so etwas habe ich gesucht!

    Off-Topic: Ich habe gerade die Kommentarbenachrichtigung für den zweiten Kommentar bekommen, obwohl ich den Bestätigungslink in der Mail gar nicht angeklickt habe. Das dürfte den Sinn dieser Double Opt-In Nachfrage ad absurdum führen …

HilfeWenn du konkrete Fragen hast oder Hilfe benötigst, sind das offizielle Forum oder der Chat geeignete Anlaufstellen, um dein Anliegen zu diskutieren. Per E-Mail beantworte ich grundsätzlich keine (Support-)Anfragen – dazu fehlt mir einfach die Zeit. Kuketz-Forum

Abschließender Hinweis

Blog-Beiträge erheben nicht den Anspruch auf ständige Aktualität und Richtigkeit wie Lexikoneinträge (z.B. Wikipedia), sondern beziehen sich wie Zeitungsartikel auf den Informationsstand zum Zeitpunkt des Redaktionsschlusses.

Kritik, Anregungen oder Korrekturvorschläge zu den Beiträgen nehme ich gerne per E-Mail entgegen.