top of page

Toc-Toc, ¿quién es?: una capa de seguridad extra para SSH

  • jogofus
  • 10 jul 2024
  • 3 Min. de lectura

El lunes de la semana pasada amanecimos todos con la urgencia de actualizar todos los servidores SSH que tuvieramos en nuestras infraestructuras.


¿Por qué? Porque la noche anterior había salido a la luz regreSSHion, una vulnerabilidad que permitía ejecución remota de código en servidores openSSH, el cual ejecuta el demonio sshd.

Pero esta vulnerabilidad solo afectaba a los sistemas Linux, no a los basados en *BSD.


Aquí dejo más información acerca de la vulnerabilidad:





-Bueno, mi servidor SSH no está expuesto a internet.

+¿Y si el ataque es desde dentro?


Y tampoco podemos olvidar la famosa vulnerabilidad que generaba un backdoor a través de la libería xz.


La idea es ponérselo lo más difícil posible a los malos.


Ahora imaginemos que tenemos un VPS y nos dan acceso SSH. Este puerto está expuesto a internet y susceptible a ataques de fuerza bruta (o que exista alguna vulnerabilidad).


Knockd: llamar a la puerta antes de entrar


Lo que vamos a tratar de hacer hoy es evitar que alguien ajeno a nuestra organización pueda intentar conectarse a servicios conocidos. En este caso vamos a centrarnos en SSH, pero se puede aplicar a cualquier servicio expuesto.


Para ello, lo primero que necesitamos es instalar el paquete knockd.

sudo apt install knockd

Una vez hecho esto, vamos a conocer cuál es nuestra interfaz de red en la que vamos a estar escuchando. En mi caso es la ens18.

Deberemos editar primero el archivo /etc/default/knockd.


En la opción START_KNOCKD deberemos establecerlo en 1 para que se ejecute el servicio. En KNOCKD_OPTS deberemos poner la interfaz en la que escucharemos el golpeo de puertos.

Quedaría algo así:


Ahora vamos a establecer la secuencia de puertos que hay que "golpear" para que se abra el puerto que queremos. Modificamos el archivo /etc/knockd.conf



Este es mi archivo de configuración para este laboratorio. Como se ve, la secuencia para abrir el SSH es 7000, 8000, 9000 y al contrario para cerrarlo.


Para que esto funcione, deberemos crear una regla en iptables que, por defecto, haga un DROP de todas las direcciones al puerto 22.

sudo iptables -A INPUT -p tcp --dport 22 -j DROP

Yo siempre prefiero hacer un DROP que un REJECT, ya que con este último se envía un paquete ICMP en el que se informa de que la conexión es rechazada, con lo que estaríamos dando información de más a un posible atacante.


Por último, debemos hacer que estas reglas sean persistentes con cada reinicio. Se podría hacer un script que se ejecute al inicio, pero para mí es más fácil instalar el paquete iptables-persistent.


Una vez instalado, habilitamos e iniciamos:

sudo systemctl enable netfilter-persistent
sudo systemctl start netfilter-persistent

Todas las reglas se guardan en /etc/iptables/rules.v4 por lo que en cualquier momento podemos hacer un iptables-save > /etc/iptables/rules.v4 o iptables-restore < /etc/iptables/rules.v4



Comprobaciones y pruebas

Si comprobamos en el propio servidor, vemos que el puerto SSH está escuchando.

Pero si escaneamos el puerto desde un cliente vemos que está filtrado.


Si tratamos de conectar por SSH nos dará un timeout...

Para poder conectarnos deberemos llamar a los puertos en el orden exacto, con un máximo de 5 segundos entre llamada. Podemos hacerlo instalandonos el paquete knockd en el cliente y usando su propio comando:

knock 192.168.0.113 7000 8000 9000 -v

O, si no lo tenemos instalado y no podemos/queremos instalarlo, podemos hacer uso de nmap o netcat. En mi caso uso netcat, y hay que ejecutar un comando por cada puerto.

nc 192.168.0.113 7000
nc 192.168.0.113 8000
nc 192.168.0.113 9000

Esto es totalmente normal ya que, en realidad, no hay ningún servicio expuesto al que poder conectarnos.

Ahora sí, procedemos a conectar por SSH.

Si comprobamos las reglas de iptables, vemos que se ha añadido una nueva:


Cuando cerremos sesión, deberemos ejecutar la secuencia de cierre, establecida en el archivo de configuración de knockd.


Consideraciones finales

Esta entrada ha sido a modo ejercicio para demostrar como funciona. Para hacerlo aún más seguro se debería tener en cuenta lo siguiente:


  • Cambiar el puerto por defecto de SSH.

  • Utilizar una secuencia totalmente aleatoria de apertura y cierre de la conexión.

  • No usar puertos consecutivos.

  • Esto significa que podríamos usar, por ejemplo, la siguiente secuencia de apertura: 4115, 9999, 5487, 30050


Por último, se recomienda usar clave pública y privada junto con usuario y contraseña.



¡Y hasta aquí por hoy!

Comments


bottom of page