Table of Contents
Résumé
La prise d'empreintes d'un serveur Web est une tâche critique pour le testeur. La connaissance de la version et le type d'un serveur web permet aux testeurs de déterminer les vulnérabilités connues et les exploits qu'il convient d'utiliser pendant le test.
Description
Il existe différents fournisseurs et des versions de serveurs Web sur le marché aujourd'hui. Connaître le type de serveur Web que vous testez aide significativement dans le processus de test. Cette information peut être obtenue en envoyant des commandes spécifiques au serveur Web et en analysant la réponse, étant donné que chaque version logiciel de serveur Web peut réagir différemment à ces commandes. En sachant comment chaque type de serveur Web répond à ces commandes spécifiques et en enregistrant cette information dans une base de données d'empreintes des serveurs web, un testeur peut envoyer ces commandes sur le serveur Web, analyser la réponse, et la comparer à la base de données de signatures connues. Notez que cela nécessite habituellement plusieurs commandes différentes pour identifier avec précision le serveur web, car des versions différentes peuvent réagir de manière similaire à la même commande. Rarement, toutefois, les versions différentes réagissent de la même façon à toutes les commandes HTTP. Donc, en envoyant plusieurs commandes différentes, vous augmentez la précision de votre estimation.
Test boîte noire
Analyse de l'en-tête de réponse HTTP
La forme la plus simple et la plus fondamentale de l'identification d'un serveur Web est de regarder le champ Serveur dans l'en-tête de réponse HTTP. Pour nos exemple nous utilisons netcat.
$ nc 202.41.76.251 80 HEAD / HTTP/1.0 HTTP/1.1 200 OK Date: Mon, 16 Jun 2003 02:53:29 GMT Server: Apache/1.3.3 (Unix) (Red Hat/Linux) Last-Modified: Wed, 07 Oct 1998 11:18:14 GMT ETag: "1813-49b-361b4df6" Accept-Ranges: bytes Content-Length: 1179 Connection: close Content-Type: text/html
Dans le champ Serveur, nous notons que le serveur est susceptible d'être un Apache, version 1.3.3, en tournant sur un système d'exploitation Linux.
Quatre exemples d'entête de réponse HTTP sont présentés ci-dessous.
À partir d'un serveur Apache 1.3.23:
HTTP/1.1 200 OK Date: Sun, 15 Jun 2003 17:10: 49 GMT Server: Apache/1.3.23 Last-Modified: Thu, 27 Feb 2003 03:48: 19 GMT ETag: 32417-c4-3e5d8a83 Accept-Ranges: bytes Content-Length: 196 Connection: close Content-Type: text/HTML
A partir d'un serveur Microsoft IIS 5.0:
HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Expires: Yours, 17 Jun 2003 01:41: 33 GMT Date: Mon, 16 Jun 2003 01:41: 33 GMT Content-Type: text/HTML Accept-Ranges: bytes Last-Modified: Wed, 28 May 2003 15:32: 21 GMT ETag: b0aac0542e25c31: 89d Content-Length: 7369
A partir d'un serveur Netscape Enterprise Server 4.1:
HTTP/1.1 200 OK Server: Netscape-Enterprise/4.1 Date: Mon, 16 Jun 2003 06:19: 04 GMT Content-type: text/HTML Last-modified: Wed, 31 Jul 2002 15:37: 56 GMT Content-length: 57 Accept-ranges: bytes Connection: close
À partir d'un serveur Sun ONE 6.1:
HTTP/1.1 200 OK Server: Sun-ONE-Web-Server/6.1 Date: Tue, 16 Jan 2007 14:53:45 GMT Content-length: 1186 Content-type: text/html Date: Tue, 16 Jan 2007 14:50:31 GMT Last-Modified: Wed, 10 Jan 2007 09:58:26 GMT Accept-Ranges: bytes Connection: close
Cependant, cette méthode d'essai n'est pas très fiable. Il existe plusieurs techniques qui permettent à un site Web de masquer ou modifier la chaîne présentée dans la bannière du serveur. Par exemple nous aurions pu obtenir la réponse suivante:
403 HTTP/1.1 Forbidden Date: Mon, 16 Jun 2003 02:41: 27 GMT Server: Unknown-Webserver/1.0 Connection: close Content-Type: text/HTML; charset=iso-8859-1
Dans ce cas, le champ Serveur de cette réponse est masqué: on ne peut pas savoir quel type de serveur Web est en cours d'exécution.
Analyse du comportement du protocole :
Techniques plus raffinées qui prend en considération les différentes caractéristiques des plusieurs serveurs web disponibles sur le marché. Nous allons énumérer quelques méthodes qui nous permettent de déduire le type de serveur Web en cours d'utilisation.
La première méthode consiste à observer l'ordre de plusieurs en-têtes. Chaque serveur Web a un ordre interne de l'en-tête. Considérons les réponses suivantes à titre d'exemple:
Réponse de Apache 1.3.23
$ nc apache.example.com 80 HEAD / HTTP/1.0 HTTP/1.1 200 OK Date: Sun, 15 Jun 2003 17:10: 49 GMT Server: Apache/1.3.23 Last-Modified: Thu, 27 Feb 2003 03:48: 19 GMT ETag: 32417-c4-3e5d8a83 Accept-Ranges: bytes Content-Length: 196 Connection: close Content-Type: text/HTML
Réponse de IIS 5.0
$ nc iis.example.com 80 HEAD / HTTP/1.0 HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Content-Location: http://iis.example.com/Default.htm Date: Fri, 01 Jan 1999 20:13: 52 GMT Content-Type: text/HTML Accept-Ranges: bytes Last-Modified: Fri, 01 Jan 1999 20:13: 52 GMT ETag: W/e0d362a4c335be1: ae1 Content-Length: 133
Réponse de Netscape Enterprise 4.1
$ nc netscape.example.com 80 HEAD / HTTP/1.0 HTTP/1.1 200 OK Server: Netscape-Enterprise/4.1 Date: Mon, 16 Jun 2003 06:01: 40 GMT Content-type: text/HTML Last-modified: Wed, 31 Jul 2002 15:37: 56 GMT Content-length: 57 Accept-ranges: bytes Connection: close
Réponse de SunONE 6,1
$ nc sunone.example.com 80 HEAD / HTTP/1.0 HTTP/1.1 200 OK Server: Sun-ONE-Web-Server/6.1 Date: Tue, 16 Jan 2007 15:23:37 GMT Content-length: 0 Content-type: text/html Date: Tue, 16 Jan 2007 15:20:26 GMT Last-Modified: Wed, 10 Jan 2007 09:58:26 GMT Connection: close
On peut remarquer que l'ordre du champ Date et du champ Serveur diffère entre Apache, Netscape Enterprise et IIS.
Test de demandes mal formées
Un autre test très utile consiste à envoyer des requêtes mal formées ou des demandes de pages inexistantes sur le serveur.
Examinez les réponses HTTP suivants.
Réponse de Apache 1.3.23
$ nc apache.example.com 80 GET / HTTP/3.0 HTTP/1.1 400 Bad Request Date: Sun, 15 Jun 2003 17:12: 37 GMT Server: Apache/1.3.23 Connection: close Transfer: chunked Content-Type: text/HTML; charset=iso-8859-1
Réponse de IIS 5.0
$ nc iis.example.com 80 GET / HTTP/3.0 HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Content-Location: http://iis.example.com/Default.htm Date: Fri, 01 Jan 1999 20:14: 02 GMT Content-Type: text/HTML Accept-Ranges: bytes Last-Modified: Fri, 01 Jan 1999 20:14: 02 GMT ETag: W/e0d362a4c335be1: ae1 Content-Length: 133
Réponse de Netscape Enterprise 4.1
$ nc netscape.example.com 80 GET / HTTP/3.0 HTTP/1.1 505 HTTP Version Not Supported Server: Netscape-Enterprise/4.1 Date: Mon, 16 Jun 2003 06:04: 04 GMT Content-length: 140 Content-type: text/HTML Connection: close
Réponse de SunONE 6,1
$ nc sunone.example.com 80 GET / HTTP/3.0 HTTP/1.1 400 Bad request Server: Sun-ONE-Web-Server/6.1 Date: Tue, 16 Jan 2007 15:25:00 GMT Content-length: 0 Content-type: text/html Connection: close
Tests de protocoles inexistants
Nous remarquons que chaque serveur répond d'une manière différente. La réponse diffère également dans la version du serveur. Des observations similaires peuvent être faites en utilisant un protocole inexistant.
Examinez les réponses suivantes:
Réponse de Apache 1.3.23
$ nc apache.example.com 80 GET / JUNK/1.0 HTTP/1.1 200 OK Date: Sun, 15 Jun 2003 17:17: 47 GMT Server: Apache/1.3.23 Last-Modified: Thu, 27 Feb 2003 03:48: 19 GMT ETag: 32417-c4-3e5d8a83 Accept-Ranges: bytes Content-Length: 196 Connection: close Content-Type: text/HTML
Réponse de IIS 5.0
$ nc iis.example.com 80 GET / JUNK/1.0 HTTP/1.1 400 Bad Request Server: Microsoft-IIS/5.0 Date: Fri, 01 Jan 1999 20:14: 34 GMT Content-Type: text/HTML Content-Length: 87
Réponse de Netscape Enterprise 4.1
$ nc netscape.example.com 80 GET / JUNK/1.0 <HTML><HEAD><TITLE>Bad request</TITLE></HEAD> <BODY><H1>Bad request</H1> Your browser sent to query this server could not understand. </BODY></HTML>
Réponse de SunONE 6,1
$ nc sunone.example.com 80 GET / JUNK/1.0 <HTML><HEAD><TITLE>Bad request</TITLE></HEAD> <BODY><H1>Bad request</H1> Your browser sent a query this server could not understand. </BODY></HTML>
Test Automatisé
Les tests à effectuer afin de bien prendre les empreintes d'un serveur web peuvent être nombreux. Heureusement, il existe des outils qui permettent d'automatiser ces tests. “Httprint” est l'un de ces outils. httprint a un dictionnaire signature qui permet de reconnaître le type et la version du serveur Web en cours d'utilisation. Un exemple d'exécution httprint est indiqué ci-dessous:
Test en ligne
Un exemple d'outil en ligne qui offre souvent un grand nombre d'informations sur le serveur Web cible, est Netcraft. Avec cet outil, nous pouvons récupérer des informations sur le système d'exploitation, le serveur Web utilisé, le serveur Uptime, le netblock Propriétaire, l'histoire du changement lié au serveur Web et à l'OS
Un exemple est montré ci-dessous:
Test Boîte grise
Références
Livres blancs
- Saumil Shah: “An Introduction to HTTP fingerprinting” - http://net-square.com/httprint/httprint_paper.html
- Anant Shrivastava : “Web Application Finger Printing” - http://anantshri.info/articles/web_app_finger_printing.html
Outils
- httprint - http://net-square.com/httprint/index.shtml
- httprecon - http://www.computec.ch/projekte/httprecon/
- Netcraft - http://www.netcraft.com
