Cómo ocultar información en los encabezados

Primero vamos a hablar de qué es el fingerprinting en servidores web. Esta técnica consiste en identificar tanto el tipo de servidor como la versión que se está ejecutando detrás de una aplicación web, con el objetivo de encontrar posibles vulnerabilidades.

Las técnicas más usadas para obtener este tipo de información son:

  • De forma manual: realizando peticiones malformadas intencionalmente para obligar al servidor a que muestre páginas de errores o información relevante en los encabezados.
  • Con herramientas automatizadas: por ejemplo a través de nmap, netcat, telnet, nikto, etc…

A continuación podemos observar la respuesta de un servidor Apache:

				
					HTTP/1.1 200 OK
Date: Thu, 05 Sep 2021 14:41:22 GMT
Server: Apache/2.4.41 (Unix)
Last-Modified: Thu, 05 Sep 2019 13:40:42 GMT
ETag: "75-591d1d21b6167"
Accept-Ranges: bytes
Content-Length: 117
Connection: close
Content-Type: text/html

				
			

Una de Nginx:

				
					HTTP/1.1 200 OK
Server: nginx/1.17.3
Date: Thu, 04 Sep 2021 13:52:23 GMT
Content-Type: text/html
Content-Length: 117
Last-Modified: Thu, 04 Sep 2021 12:42:42 GMT
Connection: close
ETag: "5d71489a-75"
Accept-Ranges: bytes

				
			

Una de Lighttpd:

				
					HTTP/1.0 200 OK
Content-Type: text/html
Accept-Ranges: bytes
ETag: "4192788355"
Last-Modified: Thu, 04 Sep 2021 14:42:42 GMT
Content-Length: 117
Connection: close
Date: Thu, 04 Sep 201 17:57:57 GMT
Server: lighttpd/1.4.54

				
			

Como se puede observar en la respuesta de los encabezados, tenemos tanto el tipo de servidor como la versión que se está usando. Si intentamos ofuscar dicha información, la respuesta podría verse de la siguiente forma:

				
					HTTP/1.1 200 OK
Server: Website.com
Date: Thu, 05 Sep 2019 17:57:06 GMT
Content-Type: text/html; charset=utf-8
Status: 200 OK

				
			

De todas formas, el atacante podría intentar adivinar el tipo de servidor en función del orden de los campos que aparecen en el encabezado, aunque hay algunos servidores que comparten el mismo orden y los campos pueden ser modificados o eliminados por lo que no sería un método del todo fiable.

Por otro lado, también se puede identificar un servidor web enviando una petición incorrecta y observando la respuesta de error que éste da. Si estas respuestas no son modificadas por unas personalizadas, el atacante también podría identificar qué tipo de servidor y en algunos casos incluso la versión que se está ejecutando.

Para ello lo que se recomienda es:

  • Ocultar la información del servidor web en los encabezados.
  • Usar un proxy inverso reforzado para crear una capa adicional de seguridad entre el servidor web e Internet
  • Tener siempre actualizados los servidores web.

En este artículo vamos a explicar de qué forma ocultar información en los encabezados.

NGINX

En la siguiente imagen podemos ver qué tipo de página de error por defecto aparece en un servidor Nginx cuando se solicita un recurso no disponible:

Como se puede observar, estamos obteniendo tanto el tipo de servidor como la versión. Esta información también puede verse en los encabezados.

Para ocultar la versión y tipo de servidor vamos a editar la configuración de Nginx abriendo el siguiente archivo en un editor:

				
					sudo nano /etc/nginx/nginx.conf
				
			

Y añadimos la siguiente línea en el bloque http:

				
					http {
server_tokens: off;
}

				
			

A continuación verificamos que la sintaxis del archivo que acabamos de actualizar esté correcta con el siguiente comando:

				
					sudo nginx-t
				
			

Finalmente si no hay errores, procedemos a reiniciar el servidor:

				
					sudo service nginx reload #debian/ubuntu
systemctl restart nginx #redhat/centos

				
			

APACHE

En la siguiente imagen podemos observar qué tipo de página de error por defecto aparece en un servidor Apache:

Al igual que en el anterior caso, estamos viendo tanto el tipo de servidor como la versión qué está usando. Y como también mencionamos, esto podría verse en los encabezados. Para ocultar esta información haremos lo siguiente:

En Debian/Ubuntu:

				
					sudo nano /etc/apache2/apache2.conf
				
			

En CentOS/Fedora:

				
					sudo nano /etc/httpd/conf/httpd.conf
				
			

Y añadimos las siguientes líneas:

				
					ServerSignature Off
ServerTokens Prod

				
			

Si no tenemos acceso al servidor, podemos hacerlo añadiendo las 2 anteriores líneas al .htaccess. Verificamos que la sintaxis es correcta con el siguiente comando:

				
					httpd -t
				
			

Por último procedemos a reiniciar el servidor:

				
					sudo systemctl restart apache2 #SystemD
sudo service apache2 restart #SysVInit

				
			

LIGHTTPD

Para servidores Lighttpd abrimos el archivo de configuración:

				
					sudo nano /etc/lighttpd/lighttpd.conf
				
			

Y agregamos o modificamos si ya existe la siguiente línea:

				
					server.tag = " "
				
			

Guardamos cambios y verificamos que todo está bien con el siguiente comando:

				
					lighttpd -tt -f lighttpd.conf
				
			

Por último reiniciamos el servidor:

				
					/etc/init.d/lighttpd restart
				
			

CONCLUSIÓN

Hemos podido observar cómo un atacante a través de distintos métodos puede obtener información de un servidor web y cómo de una manera sencilla se puede mitigar esto y al menos ponérselo más difícil a los malos. Cualquier detalle es importante cuando se trata de realizar un ataque, por lo que cuanto menos información tengamos expuesta, mejor.

Compartir este artículo

¡Me gusta este artículo!

1

Artículos relacionados

    Deja un comentario

    ¡Gracias por dejar tu comentario!

    Entradas recientes