Blog

Seguridad de servidores – Parte III – Ocultando información

En los artículos anteriores ( Parte I, Parte II), vimos un ejemplo para enjaular Nginx y Apache. Esto nos va a permitir que, en el caso de una intrusión, se minimice la capacidad de actuación del intruso. En este artículo, os voy a hablar de un método sencillo para complicar a nuestro atacante explotar vulnerabilidades.

Una de las cosas que intentará hacer un atacante es conocer qué servidor utilizamos y con qué versión. De esta manera, buscará un exploit para ese software e intentará utilizarlo. Una buena idea que permitirá despistar a nuestro atacante, será la informar de una versión diferente a la real o, directamente, eliminarla.

En el caso de los servidores Web Apache y Nginx, por defecto nos muestra información sobre quienes son y su versión. Esto es normal, pues la configuración por defecto del software no está pensada para entornos de producción. Ambos incorporan directivas que permiten ocultarla.  Esto de ocultar información se le conoce como seguridad por oscuridad. Veamos, antes de nada, cuál es la información que nos mostrarían:

foto1
foto4

En el caso de Apache, nos muestra el tipo de sistema operativo y, además, vemos que está el módulo ssl activado, la versión tanto de Apache, como de OpenSSL. ¿Cómo ocultamos esta información? Bueno, disponenos de dos métodos:

  1. Cambiando las versiones en el código fuente. Nos permite cambiar toda la información pero, presenta el inconveniente de tener que compilar cada vez que queramos actualizar.
  2.  Mediante las directivas que nos proporcionan. Este método es el más cómodo a la hora de actualizar, pero tienen el inconveniente de mostrar un dato: El nombre del servidor.

Las directivas que tenenos que cambiar en Apache son ServerTokens y ServerSignature. La primera directiva nos permite establecer diferentes niveles a la hora de mostrar información. No hay que dudarlo, utilizaremos el modo Prod, de producción. La segunda, en Off. Así sólo mostrará el nombre servidor. En el caso de Nginx, la directiva es server_tokens, que estableceremos a Off.

La ubiciación, en el caso de Nginx, sería en el contexto http, si queremos desactivar la información en todos los servidores virtuales (en caso tener más de uno definido), o en el contexto server, para desactivarlo de manera selectiva. La mejor opción será en el contexto http. El contexto http está definido en /etc/nginx/nginx.conf.

Para el caso de Apache, la ubicación puede cambiar dependiendo de la distribución. En Arch Linux, por ejemplo, está en /etc/httpd/conf/extra/httpd-default.conf. En Debian lo encontramos en /etc/apache2/conf.d/security. Veamos ahora el resultado de cambiar estas directivas:

foto3

foto5

Ahora vamos a cambiar desde las fuentes. En este caso, para el ejemplo, utilizaré Arch Linux. Vamos a aprovechar su sistema de ports, así la actualización nos será más cómoda. Lo primero, instalamos abs:

sudo pacman -S abs
# Creamos el árbol abs, que contendrá los PKGBUILD:
sudo abs
# Copiamos el directorio /var/abs/extra/apache a nuestro home:
cp -r /var/abs/extra/apache ~
#Descargamos y verificamos el código fuente:
cd ~/apache
makepkg --verifysource

Una vez hecho esto, ya tenemos el código fuente. En caso de que el código fuente no esté descomprimido en ~/apache/src, lo descomprimimos:

cd ~/apache/src
tar -xzf  ~/apache/httpd-2.2.26.tar.bz2

Ahora, editamos el archivo ~/apache/src/httpd-2.2.26/include/ap_release.h y modificamos las siguientes líneas:

#define AP_SERVER_BASEVENDOR "Apache Software Foundation"
#define AP_SERVER_BASEPROJECT "Apache HTTP Server"
#define AP_SERVER_BASEPRODUCT "Apache"

#define AP_SERVER_MAJORVERSION_NUMBER 2
#define AP_SERVER_MINORVERSION_NUMBER 2
#define AP_SERVER_PATCHLEVEL_NUMBER   26

Por ejemplo:

#define AP_SERVER_BASEVENDOR "Ninja server"
#define AP_SERVER_BASEPROJECT "Ninja HTTP server"
#define AP_SERVER_BASEPRODUCT "Ninja"

#define AP_SERVER_MAJORVERSION_NUMBER 10
#define AP_SERVER_MINORVERSION_NUMBER 20
#define AP_SERVER_PATCHLEVEL_NUMBER   1

Comprimimos otra vez:

tar -cjf httpd-2.2.26.tar.bz2 httpd-2.2.26/*

Generamos la suma de verificación:

md5sum httpd-2.2.26.tar.bz2

Copiamos el valor obtenido y lo modificamos en el PKGBUILD. Dentro de la lista de sumas, será la primera:

md5sums=('8975d50759886354501b42b74a815c51'
'SKIP'
'f1d9d41360908ceb2374da55ae99197a'
.......
)

Ya podemos poceder a generar e instalar el paquete:

makepkg -i

Ahora, le indicamos al gestor de paquetes que no actualice apache. En el momento que haya una nueva versión, nos saltará un aviso y deberemos realizar el mismo proceso. Esto se hace editando /etc/pacman.conf y especificando el nombre del paquete en la línea:

IgnorePkg   = apache

El resultado en las cabeceras será:

foto2
Para Nginx podemos realizar un proceso similar. Los archivos a modificar son:
En src/http/ngx_http_header_filter_module.c, la línea:

static char ngx_http_server_string[] = "Server: nginx" CRLF;

Cambiamos “Server: nginx” por cualquier otro nombre, siguiendo con el ejemplo anterior:

"Server: ninja"

En src/core/nginx.c, cambiamos las constantes NGINX_VERSION y NGINX_VER:

#define NGINX_VERSION      "10.20.1"
#define NGINX_VER          "ninja/" NGINX_VERSION

Ya que tenemos esto cambiado, no será tan importante impedir que se muestre la información correspondiente al nombre y versión del servidor. Aún así, no está de más cambiar las directivas mencionadas al principio del artículo.

Espero que os haya gustado, happy hacking!

Mª José Montes – mjose@highsec.es – @MMontesDiaz

Leave a Reply

*

    No Twitter Messages