CÓMO: Cómo construir su propio firewall "casero"

(Para Alessandro Fiori)
07/10/19

Una forma práctica de guardar y mantener sus datos seguros.
En este período en el que se ponen a prueba las finanzas de las empresas y las administraciones públicas, es fácil encontrar directores que piensen en la seguridad como un costo y no como una necesidad real de su propia infraestructura.
Por lo tanto, es fácil imaginar un escenario bastante preocupante en el que la estructura no está realmente a la altura.

Servidores inadecuados, software no actualizado, sin posibilidad de cambiar las plataformas, etc.
En realidad, ciertos contextos no son raros y, por lo tanto, es necesario prepararse para actuar incluso ante la escasez de recursos.

En general, la implementación de una solución de software en hardware no dedicado, como la solución que analizaremos a continuación, puede ser especialmente útil en los siguientes casos:

- Falta de fondos
- Necesidad de adoptar una solución "intermedia" sin costos adicionales en caso de emergencia extrema
- Necesito defender máquinas pequeñas (como computadoras portátiles) y no poder adoptar soluciones "clásicas", debido a condiciones excepcionales.
- Necesita reconfigurar una red aislada, por ejemplo, un laboratorio, sin tener que comprar hardware adicional, manteniendo la flexibilidad de la red misma.

Estos son solo algunos ejemplos, pero las posibilidades son muchas.

Dependiendo del caso, si desea adoptar la solución basada en Windows, no tendrá una caída considerable en el rendimiento.
La situación cambia si desea adoptar OPNSense.

OPNSense aconseja si nunca se han realizado pruebas en las aplicaciones y sistemas a defender, mientras que Windows en el caso en que el límite de sus aplicaciones es bien conocido y cómo asegurar el código.

¿Es posible, con un poco de paciencia, ahorrar en Firewall de hardware y UTM (aunque muy recomendable) para ir y proteger una "situación desesperada"?

Los cortafuegos de hardware son equipos diseñados específicamente para alojar un sistema operativo (el "corazón" de cada computadora), generalmente en una versión "reforzada".
Por Sistema Operativo (SO) "reforzado" (OS) se entiende un Sistema al que se han aplicado parches y correcciones de errores específicos, o correcciones y modificaciones específicas, que permiten que el sistema resista contra numerosos tipos de ataques.

UTM (Unified Threat Management) son máquinas que pueden manejar numerosos tipos de ataques de manera centralizada.
El usuario puede, por ejemplo, establecer reglas para el Firewall y el filtro antispam directamente desde una única interfaz, generalmente accesible a través del navegador.

Obviamente en una "situación desesperada" no tenemos nada de esto en el nivel de "hardware", por lo que tendremos que trabajar duro para encontrar una solución a un problema bastante difícil.

Lo que nos puede ayudar es la "virtualización"

La virtualización es una técnica específica que le permite "abstraer", o poner a disposición en modo virtual, componentes de hardware.
Para explicar mejor el concepto, imaginemos que tenemos un procesador (el componente que ejecuta físicamente las operaciones) de los "núcleos" 20 (las diversas unidades que realizan los cálculos en el procesador).
A través de la virtualización podemos "separar", por ejemplo, los núcleos 10 y dedicarlos a otro sistema operativo.
El mismo concepto de "dedicar" o "abstraer" una porción de hardware a otro software se puede aplicar con RAM, tarjetas de red, etc.
Esto le permite tener un sistema operativo "host" (el sistema operativo principal) y múltiples sistemas "invitados" (sistemas virtualizados) en la misma máquina, operando simultáneamente.
El componente que permite esta "abstracción" se llama "hipervisor".

En el mercado puede encontrar muchos sistemas de virtualización, que en algunos casos tienen costos de licencia prohibitivos para nuestra "situación desesperada".
En nuestro caso, la elección del sistema de virtualización recae en el software VirtualBox, desarrollado por Oracle.
VirtualBox es un software de código abierto, es decir, su código es abierto, que cualquiera puede leer y editar.

Pero, ¿por qué puede ayudarnos la virtualización?

Para responder a esto, debemos pensar en el "concepto" de UTM.
Conceptualmente, un sistema de seguridad puede simplificarse como una "caja negra" con dos cables, uno para entrada y otro para salida.
El cable de entrada se conecta directamente a Internet, y de allí provienen paquetes (o datos y conexiones) de los cuales no conocemos la naturaleza, ya sean maliciosos o legítimos.
En el recuadro negro se realiza la verificación y se descartan los paquetes maliciosos, mientras que los legítimos se pasan a través del cable de salida a la máquina que contiene el servicio real (un sitio web, por ejemplo).

Por lo tanto, es esencial tener en cuenta tres aspectos fundamentales:

- La "caja negra" debe estar "delante" de la máquina para protegerla
- La "caja negra" debe estar conectada a internet
- La "caja negra" debe filtrar los paquetes entrantes

Este tipo de configuración parece ser perfecto para nuestro caso, que es una máquina virtual, que se convierte en nuestra "caja negra".

El hecho de que VirtualBox sea de código abierto nos ayuda a no encontrar costos inesperados, y para ayudarnos a no tener "malas sorpresas", no instalaremos el paquete VirtualBox "Extension Pack".

Las soluciones propuestas aquí son en realidad dos, con ventajas y desventajas relativas:
- Solución basada en Windows 7 (sí, exactamente en Windows 7)
- Solución basada en OPNSense

La solución basada en Windows 7 tiene la ventaja de tener un consumo mínimo de recursos y una velocidad de conexión igual a la de la máquina "host" conectada directamente a la red.
La desventaja de tener Windows 7 es que, por defecto, no tiene un sistema de prevención de intrusiones (un sistema que detecta y bloquea automáticamente los paquetes maliciosos).

La solución basada en OPNSense tiene la ventaja de tener muchas herramientas de control y se puede configurar fácilmente como un Sistema de prevención de intrusiones (IPS).
La desventaja de OPNSense son sus propias herramientas, lo que significa que el impacto en los recursos de hardware es mayor, y dado que IPS debe controlar el flujo de datos, el impacto en la velocidad de conexión también será significativo.

OPNSense fue elegido con respecto a pfSense (un sistema similar a OPNSense) para su sistema de análisis.
PfSense utiliza un componente llamado "Snort", que analiza los paquetes en tránsito y es bastante pesado, especialmente si está instalado en una máquina virtual.
OPNSense utiliza Suricata u otro sistema de análisis de paquetes que explota el subprocesamiento múltiple, o una técnica que permite que el procesador realice múltiples procesos simultáneamente.
Hasta la fecha, Suricata es un sistema NIDPS, o Sistema de detección y prevención de intrusiones en la red (exactamente lo que necesitamos, ya que se las arregla para prevenir amenazas y no solo para identificarlas), mientras que Snort es un NIDS o un Sistema de detección de intrusiones en la red.
Esta combinación es preferible, especialmente en una máquina virtual donde se debe prestar especial atención al impacto que estos sistemas pueden tener en el rendimiento general.

El sistema a defender es Metasploitable, que es una máquina virtual creada específicamente para ser vulnerable.

En este caso, imaginemos que Metasploitable es el sistema a proteger:

Por lo tanto, analizamos cómo instalar e implementar estas dos soluciones.
El escenario inicial ve nuestro sistema sin defensas.

Analicémoslo usando Kali Linux, una distribución especialmente diseñada para ayudar a los Probadores de Penetración, que son personas que perforan los sistemas para el trabajo, para encontrar vulnerabilidades y sanarlos.
Primero, hagamos un escaneo rápido con nmap (una herramienta muy efectiva que le permite descubrir puertos abiertos y otra información relacionada con el sistema de destino):

Como puede ver, la situación de nuestro sistema es desastrosa.
Las numerosas puertas abiertas exponen los servicios de la máquina, muchos de ellos vulnerables.
Intentemos lanzar un ataque en la máquina, para esta prueba, ya que es solo una prueba, usaré "db_autopwn", un comando de Metasploit que simplifica el lanzamiento de exploits al objetivo.
El comando "db_autopwn" está en desuso (es decir, no se recomienda), y para esta prueba se utilizó un módulo externo que vuelve a implementar el comando en la última versión de Metasploit.

Como puede ver, Metasploit logró abrir dos sesiones en la máquina:

Para la primera solución tenemos Windows 7, instalado en una máquina virtual.
Abramos VirtualBox y configuremos dos tarjetas de red, como esta:

Necesitamos dos tarjetas de red, conectadas en modo puente, a la tarjeta de red actualmente conectada a Internet.
Por lo tanto, creamos la situación de "caja negra", al menos a nivel de hardware.

Veamos cómo configurar la máquina, a nivel de software

Primero, necesitamos configurar en la primera tarjeta de red, la conexión real, es decir, la dirección IP y la puerta de enlace de la red (por lo tanto, debemos asegurarnos de que la primera tarjeta de red funcione y esté conectada a Internet).

Obviamente, esta configuración es solo un ejemplo, y en este caso Windows no está realmente conectado a Internet.
Una vez que se ha configurado la dirección IP para la primera tarjeta, siempre en la misma tarjeta necesitamos habilitar la conexión compartida a Internet

Ahora, si quisiéramos exponer los servicios (por ejemplo, el sitio web) en Internet, haga clic en "configuración" y configure "Servidor web (HTTP)"

¿Por qué esta configuración?

Al activar el uso compartido de la conexión a Internet, se establece una subred ficticia "192.168.137.x" en la segunda tarjeta de red.
Nuestra máquina a proteger, en este caso, está configurada con la dirección IP "192.168.137.143", por lo tanto, esta dirección debe configurarse en la máscara "Configuración del servicio" como se muestra en la figura anterior.
Ahora confirmamos todo haciendo clic en "Aceptar" en las diferentes máscaras.
Una vez confirmado, abrimos "secpol.msc"
En el icono "Criterios de seguridad IP", al hacer clic con el botón derecho del mouse, es posible crear una nueva política de seguridad IP.

En el asistente, le damos un nombre a nuestra configuración y siempre avanzamos, hasta que se crea el filtro.
En este punto nos encontramos frente a una nueva pantalla, por lo que hacemos clic en "Agregar", siempre avanzamos a la pantalla "Listas de filtros IP".
Aquí hacemos clic en "Agregar"

Necesitamos crear la primera regla, lo que significa que debemos bloquear cualquier conexión en cualquier puerto.
Para hacer esto, hacemos clic en "Agregar" y siempre avanzamos, de esta manera hemos creado una regla que funciona en cualquier conexión, para cualquier protocolo.
Seleccionamos la regla recién creada y seguimos adelante.

En la siguiente pantalla (Operaciones de filtro), hacemos clic en "Agregar", le damos el nombre de "Bloquear" y hacemos clic en "Bloquear".

Una vez que se crea la operación de filtro, selecciónela y proceda a confirmar la creación de la regla completa.
Ahora acabamos de bloquear todos los puertos para todas las conexiones de la máquina, ya que en nuestro caso queremos que el sitio web esté disponible en el puerto 80, tenemos que crear otra regla que autorice el paso de datos en el puerto 80.

En la creación del filtro IP, tan pronto como llegamos a la página "Protocolos" especificamos "TCP" y en los puertos, en el segundo campo de texto hacemos clic en la opción "este puerto" y especificamos el puerto 80.

Durante las operaciones de filtro, esta vez tenemos que especificar "Autorizar".

Una vez que se complete la configuración, haga clic derecho en el filtro creado y luego en "Asignar"

En este punto, podemos ejecutar nuestras pruebas nuevamente:

El sitio esta funcionando

Las puertas también están cubiertas por la "caja negra" que hemos insertado entre Internet y nuestra máquina.

Luego atacamos nuestra máquina nuevamente para probar si la configuración ha cambiado algo:

Como podemos ver, Metasploit no pudo abrir sesiones.

¿Por qué tenemos este cambio abrupto en el comportamiento, a pesar de que no hemos modificado / actualizado el sistema?

La razón es inherente al tipo de configuración que hemos configurado.
Este tipo de configuración implica el uso de la conexión compartida para crear una subred, a través de la cual se conecta a nuestra máquina.

Si solo hubiéramos utilizado el uso compartido de la conexión, Metasploit todavía habría logrado abrir una sesión, ya que si bien el reenvío de puertos se configuró en 80 (para que el sitio web esté disponible desde el exterior), no habría evitado las "conexiones inversas ", O una conexión a un puerto abierto por un cliente interno de la red para permitir la conexión de un servidor remoto.

Cuando atacamos una máquina, lo que permite la comunicación del objetivo a nuestra máquina es la "carga útil", que es un software que se conecta a nuestra máquina, lo que permite ejecutar comandos e interactuar con el objetivo, actuando como un "puente" entre nosotros y el objetivo.

Como los puertos "clásicos" ya son utilizados por los servicios normales del objetivo, la carga útil no puede usar estos puertos para comunicarse.
En consecuencia, la carga activa una conexión en un puerto aleatorio y generalmente más alto que el 10000 que, al conectarse a nuestra computadora, permite establecer la comunicación entre nosotros y el objetivo.

Para resolver este problema, derivado del hecho de que generalmente las conexiones salientes no están bloqueadas por firewalls, utilizamos el filtro descrito anteriormente para evitar conexiones no deseadas.
De esta manera, incluso si el sistema no se actualiza o existe una vulnerabilidad explotable, el atacante no puede explotar los exploits disponibles porque las cargas útiles no pueden comunicarse.

Obviamente, esta solución no impide la explotación de la inyección SQL u otras vulnerabilidades que no necesitan una carga útil para poder comunicarse con nuestra máquina.
De hecho, recuerdo que el análisis de paquetes no está disponible con esta solución.

Para permitir el análisis de paquetes, inevitablemente tendremos que confiar en el software "Prevención de intrusiones".
Para esta situación, se identificó OPNSense, que, como se describió anteriormente, utiliza Suricata como un sistema de análisis de paquetes y Netmap para disminuir la carga de la CPU y optimizar las tarjetas de red.

Me gustaría llamar la atención sobre el hecho de que no hay cambios en el esquema "lógico" que hemos creado, ni en la infraestructura virtualizada.
Solo cambia el sistema operativo de la "caja negra", para permitir el análisis de paquetes en tiempo real.

Para permitir que OPNSense funcione de la mejor manera, dediquemos a la máquina virtual 2 GB RAM (a diferencia de la primera solución, donde incluso un solo GB era suficiente).

Aquí hay un ejemplo de configuración para OPNSense:

Cuando inicia la máquina, aparece la pantalla de inicio de sesión:

La máquina que necesitamos proteger, por lo tanto, en nuestro caso tendrá la dirección IP "192.168.2.2" y la puerta de enlace "192.168.2.1" como la dirección IP.
Podemos ingresar a la configuración de OPNSense, conectando un dispositivo a la LAN y, utilizando un navegador normal, señalando el enlace "https://192.168.2.1"

Se abrirá el siguiente panel:

Una vez que inicie sesión, estamos frente al panel principal de OPNSense:

Vayamos a "Servicios" → "Detección de intrusos" → "Administración" y verifique todas las opciones:

Haga clic en "aplicar" y vaya a "descargar":

Hacemos clic en la marca de verificación para seleccionar todo, luego hacemos clic en "Habilitar seleccionados", luego volvemos a seleccionar todo y hacemos clic en "Habilitar (soltar filtro)".

Finalmente, en la parte inferior de la página, haga clic en "Descargar y actualizar reglas".

Por lo tanto, verificamos que todas las reglas se actualicen correctamente y, por lo tanto, hemos configurado el análisis de paquetes.
Para cubrir todos los tipos de casos, configuramos el "proxy de almacenamiento en caché".

El almacenamiento en caché de proxy es un componente, ya presente en OPNSense, que permite a Suricata ampliar la capacidad de detección de intrusos.
Esto se debe a que para protocolos cifrados, como HTTPS, Suricata no podría descifrar los datos en tránsito en tiempo real.
Para evitar este problema, el almacenamiento en caché de proxy le permite actuar como un puente entre la red externa y el sitio web visitado.
Como puente, los paquetes son descifrados por el proxy, que solo luego los retransmite al servicio real.
Obviamente, esta operación también ocurre de manera especular.
Esto permite que los paquetes sean controlados por Suricata.

El software que permite todo esto se llama "Calamar".
Para habilitar el calamar en OPNSense, vaya a "Servicios" → "Proxy web" → "Administración", marque "Habilitar proxy":

Luego vamos a "Proxy de reenvío" y habilitamos las tres marcas de verificación como en la figura.

Aunque estas soluciones representan una alternativa válida para aquellas realidades que no pueden proporcionar la compra de herramientas basadas en hardware, todavía recomiendo el uso de la solución de hardware.

En conclusión, si realmente queremos dormir profundamente, siempre recomiendo instalar las últimas actualizaciones para los sistemas operativos utilizados, escribir código y probar las diversas vulnerabilidades utilizando herramientas automáticas y no automatizadas, y finalmente recomendar cambiar la mentalidad hacia la seguridad: la seguridad no es un producto, nunca lo ha sido y nunca lo será, pero es un proceso y, como tal, debe seguirse, estandarizarse, aplicarse y controlarse.

Para saber más:
https://www.offensive-security.com/metasploit-unleashed/requirements/
https://en.wikipedia.org/wiki/Internet_Connection_Sharing
https://wiki.opnsense.org/
https://it.wikipedia.org/wiki/Squid
https://it.wikipedia.org/wiki/IPsec
https://it.wikipedia.org/wiki/Virtualizzazione
https://www.virtualbox.org/wiki/Documentation

Foto: Cuerpo de Marines de EE. UU.