martes, 4 de febrero de 2020

Cómo configurar las cabeceras de seguridad en servicios web y no morir en el intento.


Autor: @db3rn4l

Este es mi primer artículo en solitario en HoneySec, espero que os guste y sobretodo que os sirva.
Últimamente, mi compañero Raúl Renales y yo, nos hemos encontrado con vulnerabilidades asociadas a la
ausencia de configuración de las cabeceras de seguridad en los servicios web, concretamente Apache2, httpd e IIS.

El motivo principal de realizar este artículo es que hay una gran cantidad de portales web que se encuentran en
esta situación. 
Realmente configurar los servicios para obtener dichas cabeceras es muy sencillo, pero encontrar información, en la que se indique claramente cómo se realizan estas configuraciones, es un dolor.
Si lanzamos escaneos mediante herramientas automatizadas como por ejemplo OWASP ZAP, podemos obtener
notificaciones de detección de vulnerabilidades como por ejemplo las que se muestran en las siguientes
imágenes:
Pero antes de continuar debemos entender qué son las cabeceras de seguridad en servicios web.

¿Qué son las cabeceras de seguridad?

 Cuando un usuario accede a una página web desde su navegador, realiza una petición http o https a un servidor
que almacena la página web solicitada, a continuación el servidor web responde a dicha petición, ofreciendo el
contenido de la página web junto con una serie de cabeceras para que el navegador web del cliente pueda
interpretar ese contenido de forma correcta.
Estas cabeceras ofrecidas, son usadas por servidor y navegador para el envío de la información.

¿Cuáles son las cabeceras de seguridad más importantes? 

Las cabeceras más importantes en los sistemas web son: 
X-XSS-Protection: Esta cabecera protege a los clientes de ser atacados mediante un XSS reflejado.
X-Frame-Options: Esta cabecera se establece para proteger a los clientes web contra ataques de clickjacking. Este ataque, se
puede replicar de una manera sencilla por parte de los delincuentes, que crean sus propias páginas web
incluyendo un iframe llamando a una página web lícita, de esta forma:
<iframe src="https://bancodelavíctima.es"></iframe>.
Mediante esta cabecera, se prohíbe que nadie pueda cargar el sitio protegido en ningún otro lugar.
X-Content-Type-Options: Este encabezado, añadiéndole el parámetro “nosniff”, impide que navegadores como Internet Explorer y
Chrome no carguen las hojas de estilos, ni los JavaScripts que no tengan un Myme-Type adecuado. 
Strict-Transport-Security: O como más se le conoce HSTS. Estableciendo esta cabecera, se le indica al navegador del usuario que se
conecte al sitio web utilizando https en vez de http. El servidor forzará a los usuarios a usar https, incluso si
se especifica la conexión hacia http.
Content-Security-Policy: Esta cabecera permite definir una lista blanca de fuentes de contenido usadas por la plataforma web. Esta
cabecera es una buena contramedida para evitar ataques XSS, restringiendo que un navegador pueda cargar en
el sitio web elementos externos como JavaScript, CSS, etc. 
Referrer-Policy: Mediante esta cabecera, se protege la navegación del usuario y se preserva su privacidad. Si se establece esta
cabecera, se evita que otras páginas web puedan saber desde dónde han accedido los visitantes. 
Feature-Policy: Configurando este encabezado se puede definir qué funciones del navegador se permiten o se deniegan desde
el propio dominio o desde cualquier otro contenido, como por ejemplo en el caso de establecer un
<iframe></iframe>.
Access-Control-Allow-Origin: El encabezado Access-Control-Allow-Origin se incluye en la respuesta de un sitio web a una solicitud que se
origina en otro sitio web, e identifica el origen permitido de la solicitud. Un navegador web compara
Access-Control-Allow-Origin con el origen del sitio web solicitante y permite el acceso a la respuesta si coinciden
Un servidor devuelve este encabezado cuando un sitio web solicita un recurso entre dominios, con un
encabezado Origin agregado por el navegador.
Vamos a ejemplificarlo: 
Primero un sitio web que tiene como origen pagina1.honeysec.info provoca la siguiente solicitud de dominio
cruzado:

GET /data HTTP/1.1
Host: pagina2.honeysec.info
Origen: https://pagina1.honeysec.info

El servidor en pagina2.honeysec.info devuelve la siguiente respuesta:

HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: https://pagina1.honeysec.info

El navegador permitirá que el código que se ejecuta en pagina1.honeysec.info acceda a la respuesta porque los
orígenes coinciden.
Estableciendo esta cabecera, se permite únicamente el acceso a los orígenes conocidos, establecidos en una
lista, o se deniega completamente.

ServerSignature Off & ServerTokens Prod 

Estas cabeceras sirven para evitar mostrar el sistema operativo que está funcionando en el servidor, la versión y
los módulos que se encuentran instalados en apache. 

¿Cómo se pueden detectar las cabeceras?

Para comprobar las cabeceras de seguridad configuradas podemos acceder a múltiples aplicaciones online
como por ejemplo: https://securityheaders.com/ o mediante la consola de desarrolladores del navegador
Chrome. Si pulsamos F12 > nos dirigimos a Network > ALL > Pulsamos en la página web deseada > Headers,
veremos todas las cabeceras que ofrece la página web:
 

¿Cómo configurar las cabeceras en Windows IIS?

Para configurar las cabeceras en IIS, nos dirigiremos al panel de control de Internet Information Server >
pincharemos en el nombre de la máquina > HTTP Response Headers.
Accederemos a una ventana en blanco en donde sólo tendremos que pinchar con el botón secundario para que
nos aparezca una nueva ventana en la que incluir la cabecera.
Antes de configurar las cabeceras, nos dirigimos a https://securityheaders.com/ y comprobamos qué cabeceras
tenemos instaladas y cuál es la nota que nos da la aplicación web:

X-XSS-Protection: 

Para incluir esta cabecera únicamente escribiremos dentro de la ventana los valores que aparecen en la
siguiente imagen.


X-Frame-Options: 

X-Content-Type-Options: 

Strict-Transport-Security: 

Content-Security-Policy: 

Referrer-Policy: 

Feature-Policy: 

Access-Control-Allow-Origin: 

ServerSignature Off & ServerTokens Prod 

Para conseguir evitar que nuestro IIS envíe información adicional sobre la versión de IIS o de Sistema operativo,
no bastará con añadir las cabeceras ServerSignature y ServerTokens, deberemos realizar algunos ajustes en
nuestro IIS:
Primero deberemos instalarnos el módulo url-rewrite que encontraremos en la siguiente dirección:
https://www.iis.net/downloads/microsoft/url-rewrite
Accedemos al módulo URL Rewrite y pinchamos en View Server Variables

Pinchamos con el botón secundario en el cuadro blanco y a continuación en Add

Volvemos a la ventana de las reglas pinchando en Back to Rules y pinchamos en Add Rule(s) en la ventana que
nos aparece deberemos dirigirnos a Blank rule.
Dentro de la regla, la editaremos de esta manera:
Si queremos además, podemos despistar a posibles atacantes cambiando la respuesta para que en vez de en
blanco, responda con la respuesta que nosotros queramos, como por ejemplo en este caso Red-Hat.
Ahora si volvemos a comprobar el estado de las cabeceras en https://securityheaders.com/ veremos cómo
hemos aumentado la nota.
Si nos dirigimos al análisis de las cabeceras podremos comprobar dos cosas, una es la respuesta del server en la
que ahora aparece “red-hat” y la otra es la cabecera Strict-Transport-Security que aparece marcada en rojo,
esto es debido a que la plataforma web no tiene ningún certificado ssl instalado y por eso falla.
En un futuro artículo explicaremos cómo instalar certificados SSL, tanto en Apache2 como en IIS.

¿Cómo configurar las cabeceras en Ubuntu – Debian?

Configurar las cabeceras de seguridad en sistemas Linux de la rama de Ubuntu/Debian es relativamente sencillo,
la única dificultad es que hay que activar un módulo de seguridad en apache2 para que podamos configurar las
cabeceras de forma correcta.
Lo primero que haremos será ejecutar el comando a2enmod headers y reiniciar el servicio mediante systemctl
restart apache2 para que los cambios surtan efecto.
Ahora nos dirigiremos a /etc/apache2/mods-enabled/ y crearemos con nuestro editor de texto favorito el archivo
headers.conf.
Rellenamos el archivo headers.conf con las siguientes líneas:
<IfModule mod_headers.c>
Header unset X-Powered-By  
Header always unset X-Powered-By
Header always append X-Frame-Options: SAMEORIGIN
Header add Strict-Transport-Security: "max-age=631138519; includeSubDomains"
Header set X-XSS-Protection: "1; mode=block"
Header set X-Content-Type-Options: "nosniff"
Header always set X-Content-Security-Policy "default-src 'self'; img-src 'self$
Header set Content-Security-Policy "default-src 'self'"
Header set Referrer-Policy "same-origin"
Header set Feature-Policy "vibrate 'self' cabeceras2.honeysec.info"
Header set Content-Security-Policy "upgrade-insecure-requests"
</IfModule>
Por último deberemos editar el archivo /etc/apache2/apache2.conf y al final del archivo escribiremos: 
ServerSignature Off
ServerTokens Prod
Volvemos a reiniciar el servicio mediante el comando: sytemctl restart apache2 para que se apliquen los cambios
y nos dirigirnos a: https://securityheaders.com/ para comprobar la puntuación de nuestra web.

¿Cómo configurar las cabeceras en CentOS – Fedora?

Configurar las cabeceras de seguridad en sistemas Linux de la rama de CentOS y Fedora es muy sencillo, basta
con usar nuestro editor de texto favorito, acceder al archivo de configuración /etc/httpd/conf/httpd.conf y
añadir las cabeceras deseadas. Un ejemplo que podéis establecer puede ser el siguiente:
<IfModule mod_headers.c>
  <Directory />
    Header always set X-XSS-Protection "1; mode=block"
    Header always set x-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    Header always set Content-Security-Policy "default-src 'self'; font-src *;img-src * data:; script-src *; style-src *;"
    Header always set Referrer-Policy "strict-origin"
    Header always set Feature-Policy "vibrate 'self' cabeceras1.honeysec.info"
    Header set Access-Control-Allow-Origin 'origin-list'
    ServerSignature Off  
    ServerTokens Prod   
  </Directory>
</IfModule>
Por último deberemos editar el archivo /etc/httpd/httpd.conf y al final del archivo escribiremos: 
ServerSignature Off
ServerTokens Prod
Bastaría con reiniciar el servicio mediante el comando: sytemctl restart httpd y dirigirnos a:
https://securityheaders.com/ para comprobar la puntuación de nuestra web.

Sin más me despido, espero que os sirva para endurecer vuestros servidores web y que aumente el nivel de
seguridad en todos los sistemas TI.
Un saludo. 

No hay comentarios:

Publicar un comentario