Donnerstag, 29. September 2011


Topthema

Donnerstag, 6. Dezember 2007 | Topthema

About Security #134: XSS-Angriffe (4): JavaScript Portscan

(Link zum Artikel: http://www.entwickler.de/entwicklerde/kolumnen/039921)
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share

Das in About Security #133 beschriebene JavaScript Ping l�sst sich zu einem JavaScript Portscan erweitern, mit dem dann im lokalen Netz nach Webservern gesucht werden kann. Zuerst muss dazu festgestellt werden, ob eine HTTP-Verbindung zustande gekommen ist oder nicht. Dazu wird ein iFrame in Verbindung mit einem onLoad()-Event und einem Timer verwendet. Das src-Attribut des iFrames wird gesetzt und der Timer gestartet. L�uft auf dem gefundenen Host ein Webserver, wird der onLoad()-Event ausgel�st. Ist kein Webserver erreichbar, wird der Timer Event ausgel�st.

Nachdem so erst Hosts und danach Webserver ermittelt werden k�nnen, stellt sich die Frage, welcher Webserver oder welche Webanwendung genau gefunden wurde. F�r das so genannte Fingerprinting wird wieder ein Image-Objekt mit einem OnLoad()-Event verwendet. Damit wird nach f�r Webservern/Webanwendungen typischen Bildern gesucht, wobei nur noch zwei m�gliche Ergebnisse vorkommen k�nnen: Ein angefordertes Bild wird geladen oder es wird nicht geladen. Konnte das Bild geladen werden, werden seine Dimensionen mit den bekannten Werten verglichen. Stimmen sie �berein, wird davon ausgegangen, dass der Webserver erfolgreich identifiziert wurde. Stimmen sie nicht �berein oder konnte das Bild nicht geladen werden, wird mit dem n�chsten Bild weitergemacht. Statt nach Bildern kann auch z.B. nach typischen CSS- oder JavaScript-Dateien gesucht werden. Typische Bilder sind z.B. f�r Microsofts IIS das 36x48 Pixel gro�e Bild /pageerror.gif oder f�r Apache-Webserver das 20x22 Pixel gro�e Bild /icons/c.gif. F�r die Erkennung der webbasierten Konfigurationsoberfl�chen von Netzwerkger�ten wie z.B. Routern k�nnen meist spezifische Bilder der jeweiligen Hersteller verwendet werden ("Wo XYZ draufsteht, ist auch ein XYZ-Icon drin").

N E U ! Security aktuell
T�glich aktuelle Security-Infos!

Das Prinzip ist also verbl�ffend einfach. Trotzdem wurde das Verfahren erst 2006 von den SPI Labs vorgestellt: 'Detecting, Analyzing, and Exploiting Intranet Applications using JavaScript'. Der Text und das dazu geh�rende Beispiel sind leider nicht mehr online verf�gbar, jedoch gibt es inzwischen andere JavaScript Portscanner im Web, z.B. bei GNUCITIZEN. An dessen Sourcecode lehnt sich das folgende Beispiel an. Eine verbesserte Version dieses Portscanners ist Bestandteil der AttackAPI von GNUCITIZEN.

PortScanner = {};

PortScanner.scanPort = function (callback, host, port, timeout) {
var timeout = (timeout == null)?100:timeout;
var img = new Image();

img.onerror = function () {
if (!img) return;
img = undefined;
callback(host, port, 'open');
};

img.onload = img.onerror;
img.src = 'http://' + host + ':' + port;

setTimeout(function () {
if (!img) return;
img = undefined;
callback(host, port, 'closed');
}, timeout);
};

Die Funktion scanPort() ist f�r den eigentlichen Portscan zust�ndig. Wie bereits beschrieben, wird ein neues Image-Objekt mit onLoad()- und onError()-Event sowie einem Timer erzeugt, dessen src-Attribut auf den zu pr�fenden Host und Port gesetzt wird. Au�er Host, Port und gew�nschtem Wert f�r den Timer wird eine Callback-Funktion f�r die Ausgabe des Ergebnisses �bergeben. Bei Bedarf k�nnte auch nach einem bestimmten Bild gesucht werden, dann m�sste allerdings der onLoad()-Event passend erweitert werden.

M�chte man mehrere Ports eines Hosts mit einem Aufruf pr�fen, ist eine weitere Funktion notwendig:

PortScanner.scanHost = function (callback, host, ports, timeout)
{
for (index = 0; index < ports.length; index++)
PortScanner.scanPort(callback, host, ports[index], timeout);
};
About Security: Die komplette Serie

scanHost() wird u.a. mit einem Array mit den zu pr�fenden Ports aufgerufen. Das Array kann beim Aufruf durch split(',') aus einer z.B. �ber ein Formular �bergebenen Liste durch Kommata getrennter Ports erzeugt werden.

Soll nicht nur ein einzelner Host, sondern ein IP-Adressbereich gescannt werden, muss scanHost() lediglich f�r jede zu pr�fende IP-Adresse aufgerufen werden. Werden die IP-Adressen als String in der Form a.b.c.d �bergeben, muss daraus zuerst ein Array mit Integer-Werten erzeugt werden. Dies kann eine Funktion nach folgendem Muster �bernehmen:

function erzeugeIPArray(ipString) 
{
var stringArray = ipString.split('.');
// String in Array mit Strings aufteilen
var intArray = new Array();
// Array f�r Integer-Werte bereitstellen
var i;
for(i =0; i < stringArray.length; i++)
{
intArray[i] = parseInt(stringArray[i]);
// String in Integer-Wert umwandeln
}
return intArray;
}

Die IP-Adressen k�nnen nicht durch einfaches Heraufz�hlen durchgegangen werden. Stattdessen �bernimmt folgende Funktion das Berechnen der n�chsten IP-Adresse:

function erhoeheIP(dieIP) 
{
var i;
var c;
for(i = 3; i>=0; i--)
{
if(dieIP[i] < 255 �� i == 0)
{
dieIP[i]++;
return dieIP;
}
else {
// Der Wert im aktuellen Segment i kann nicht erh�ht werden,
// da dass zu einem �berlauf f�hren w�rde
// Daher muss im Segment davor weitergemacht werden
dieIP[i] = 0;
dieIP[i-1]++;
}
}
}

In der n�chsten Folge wird dieses Beispiel weiter fortgef�hrt.

Wenn Sie Fragen oder Themenvorschl�ge haben, k�nnen Sie diese gerne an die angegebene E-Mail-Adresse senden oder im Security-Forum einbringen!

Carsten Eilers

About Security � �bersicht zum aktuellen Thema "Sichere Webanwendungen � Cross-Site Scripting"

Kommentare

Folgende Links könnten Sie auch interessieren