Fingerprinting Web con ETags

En esta pequeña entrada me gustaría comentaros un detalle interesante, que dentro de la fase de information gathering (N. del E. véase el informe sobre este tema que Josemi y Borja Merino publicaron hace unos días) a alguno le puede llegar a ser de utilidad. El otro día estaba haciendo una revisión de una aplicación Web y dentro de la fase de “Testing for web Application Fingerprint” (OWASP-IG-004) me encontré que el servidor Web en cuestión me devolvía en la cabecera HTTP Server el texto “Apache”.

HTTP/1.1 200 OK
Date: Wed, 23 Nov 2011 15:50:43 GMT
Server: Apache
Content-Language: es-ES
Content-Type: text/html;charset=UTF-8
Content-Length: 57942

En primera instancia, asumí como un campeón que era un servidor Web Apache. No obstante, utilizando la herramienta HTTPrint que deduce el resultado a partir de otras técnicas más avanzadas, obtuve que NO era un Apache, por lo que empecé a dudar y me dije: ¿habrán cambiado el banner para confundir? mmm…

Acto seguido me puse a mirar lo que decía Netcraft, pero también me decía que era una Apache… ¿y si lo dice porque ve el banner y no hace ningún tipo de comprobación más? Entonces pensé: voy a aprovecharme de que Shodan guarda un histórico de la respuesta del servidor a ver si hubieran cambiado el banner hace poco y al principio lo tenían con versión o era otro servidor Web. Efectivamente, Shodan tenía diferentes respuestas del servidor y por lo que pude ver era un Apache y además la versión para plataformas Windows, respuesta que relacioné con el resultado del Netcraft que también decía que era un Windows.

Vale. Pero… la aplicación es nueva y el histórico de Shodan es bastante antiguo; ¿habrán cambiado de servidor web, máquina, sistema operativo y ya no se corresponde? Como véis no me quedaba tranquilo. La aplicación trataba bien los errores y aparte del banner no daba pistas evidentes que me sirviesen para aclarar si se trataba realmente de un servidor Web Apache. Lanzo la herramienta nmap con la opción “-sV” y ésta también me dice que se trata de un Apache, habiendo también hecho match la respuesta con alguno de los patrones de nmap-service-probes. Sí, parece un Apache, pero… ¿y si no es un Apache?

Después de todo esto, en una de las peticiones devueltas por el servidor en Burp, caí en la cabecera Etag, que como en otra entrada del blog ya vimos cada servidor Web la crea de una manera diferente y podemos considerarlo una característica muy útil para determinar con qué servidor Web estamos trabajando. Observé el formato y coincidía con un servidor Web Apache. Es decir, lo que me habían dicho todos menos HTTPrint :-)

Con esto último mi estado paranoico de que los administradores del servidor Web estuvieran manipulando las respuestas se calmó, ya que ví poco probable la modificación de la cabecera Etag. Las dudas me las sembraron HTTPrint y el hecho de no ver ningún tipo de mensaje que pudiera confirmarme que lo que realmente me decía el banner era correcto.

Espero que esta entrada sirva para ahorraros todas las indagaciones que tuve que hacer yo y podáis comprobar de manera rápida (si la cabecera está activa) qué servidor Web hay detrás. Desconozco si alguna herramienta utiliza esta cabecera como un elemento más para deducir que se trata de un servidor web concreto, pero al menos HTTPprint por lo que he podido ver no lo hace. Si alguien sabe alguna herramienta que lo haga, le agradecería que la comentara. De todos modos no me extrañaría que ya se esté utilizando, ya que en Wikipedia se indica la cabecera como fingerprint del servidor Web:

An ETag is an opaque identifier assigned by a web server to a specific version of a resource found at a URL. If the resource content at that URL ever changes, a new and different ETag is assigned. Used in this manner ETags are similar to fingerprints, and they can be quickly compared to determine if two versions of a resource are the same or are different. Comparing ETags only makes sense with respect to one URL—ETags for resources obtained from different URLs may or may not be equal and no meaning can be inferred from their comparison.

A mi me resultó curioso y pensé en escribir este post, que espero que a más de uno le ahorre unos minutos ;)

Comments

  1. Recordatorio para mi:

    Header unset ETag
    FileETag None

    :)

  2. Pues me ha parecido muy intrigante hasta el resultado final…buen post, si señor =)

  3. Bicho, buen recordatorio, y muy buen apunte, este detalle hubiera enriquecido la entrada.

    FBenet =) me alegra que te haya intrigado.