Browser Fingerprinting mit Ajax

Browser Fingerprinting mit Ajax

Marc Ruef
von Marc Ruef
Lesezeit: 7 Minuten

Die Identifikation eines Webbrowsers ist bei browserspezifischen Angriffen professioneller Natur unerlässlich. Traditioneller Weise wird dabei die als User-Agent mitgeschickte Header-Zeile des Clients ausgelesen. Da sich diese jedoch manipulieren lässt (z.B. bei Mozilla Firefox durch das Addon User Agent Switcher), wird auch hier ein akkurates Application Fingerprinting unerlässlich.

Das browserrecon project versucht dies passiv und serverseitig anhand der Anfragestruktur des Browsers umzusetzen. Und mit dem GET Queue Fingerprinting haben wir eine weitere experimentelle Methode dieser Art entwickelt, die die Reihenfolge der Download-Anfragen zu berücksichtigen versucht.

Jedoch ist es nicht immer möglich oder gewollt, die Erkennung durch ein dynamisches Skript auf dem Webserver umzusetzen. Zum Beispiel dann, wenn das Exploiting im Rahmen einer simplen Cross Site Scripting-Attacke durchgesetzt werden will. Um die Identifikation des Browser auf dieser Ebene und damit clientseitig umzusetzen, kann versucht werden die Eigenarten der Javascript-Implementierung – in unserem Fall wollen wir uns auf Ajax konzentrieren – zu erkennen.

Pedro Laguna von I64 Labs entwickelte eine einfache Implementierung, die den Browser durch xmlHttpRequest versucht auf die Seite about:blank zugreifen zu lassen:

x.open("GET", "about:blank", false);

Durch das Abfangen des Fehlers wird es nun möglich, durch die unterschiedlichen Error-Codes den jeweiligen Browsertyp zu erkennen:

In this case we use an AJAX object to get the about:blank page. This launch an exception in every browser and checking the error code and treatment we can determine the version of the browser.

Nachfolgende Tabelle zeigt auf, welche Eigenschaften das Error-Objekt bei den jeweiligen Browsern mitbringt. Die Property description existiert beispielsweise nur beim Internet Explorer ab Version 5.0 und lineNumber wird nur bei den Browsern von Mozilla und Netscape ausgegeben.

Property Explorer Mozilla Netscape Opera Safari
constructor 5.0+ 1.0+ 6.0+ 7.0+ 1.0+
description 5.0+
fileName 1.0+ 6.0+
lineNumber 1.0+ 6.0+
message 5.5+ 1.0+ 6.0+ 7.0+ 1.0+
number 5.0+
prototype 5.5+ 1.0+ 6.0+ 7.0+ 1.0+
stack 5.0+ 1.0+ 6.0+

Werden Eigenschaften von mehreren Browser-Familien genutzt, kann versucht werden anhand der Struktur der Rückgabewerte die einzelnen Browser und deren Versionen zu unterscheiden. Beispielsweise gibt Mozilla Firefox 3 für die Eigenschaft name die Zeichenkette NS_ERROR_DOM_BAD_URI zurück, wohingegen der Internet Explorer 8 die Zeichenkette TypeError verwendet. Durch Pattern-Matching und/oder reguläre Ausdrücke lassen sich derlei Unterschiede erkennen.

Browser Ajax Fingerprints

Wir stellen einen Proof-of-Concept bereit, der eine solche Auswertung zu automatisieren in der Lage ist. Dieser stellt eine Optimierung und Erweiterung der ursprünglichen Implementierung von Pedro Laguna dar. Die jeweiligen Fingerprints stehen zudem als Excel-Sheet zum Download bereit.

Über den Autor

Marc Ruef

Marc Ruef ist seit Ende der 1990er Jahre im Cybersecurity-Bereich aktiv. Er hat vor allem im deutschsprachigen Raum aufgrund der Vielzahl durch ihn veröffentlichten Fachpublikationen und Bücher – dazu gehört besonders Die Kunst des Penetration Testing – Bekanntheit erlangt. Er ist Dozent an verschiedenen Hochschulen, darunter ETH, HWZ, HSLU und IKF. (ORCID 0000-0002-1328-6357)

Links

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

×
Cyber Threat Intelligence

Cyber Threat Intelligence

Marc Ruef

3D Printing

3D Printing

Marc Ruef

Contact Tracing App DP3T

Contact Tracing App DP3T

Marc Ruef

Sie wollen mehr?

Weitere Artikel im Archiv

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

Sie wollen mehr?

Weitere Artikel im Archiv