domingo, 25 de octubre de 2015

[C#] basicKnock Server - Port Knocking for Windows

Hola compañer@s, llevo mucho sin entrar por aquí, pero bueno eso ahora no importa, os traigo una pequeña herramienta (servicio) que estoy desarrollando:

¿Qué és?
basicKnock es un pequeño servicio para Windows programador en C#, basado en las librerías SharpPcap, PacketDotNet e INetFwMgr
Su función pretende simular el port knocking que normalmente se implementa en las distribuciones Linux.

¿Por qué?
Como he dicho antes el port knocking se suele implementar en las distribuciones Linux, aunque también existen soluciones para Windows, aunque difíciles de encontrar, mal documentadas o de dudosa función. Así que me dije, haz uno, como sea pero haz uno, ni que sea que se le parezca un poco.
Llevo aproximadamente 4 días dedicándole unos ratos (los justos) de mi tiempo libre, aunque no mentiré hace un tiempo que lo intenté y no me vi con el tiempo suficiente, ahora está bastante crudo pero bueno… su función la hace.

Qué quizás te preguntes que por qué lo cuelgo aquí, sencillo para pedir opinión, compartir el código fuente (ahora mismo está muy sucio, sin comentar y aun quiero crear algunas clases para que quede el código más ordenado y entendible) para que podáis aprovecharlo, mejorarlo, criticarlo, aconsejarme, preguntarme lo que sea.


¿Cómo?
No voy a explicar ni mucho menos el código, aun me faltan unas horas de dedicación para llegar a ese punto (y se verá reflejado en el código), pero de forma rápida, gracias a la librería SharpPcap y PacketDotNet se establece la interfaz indicada por el usuario en modo promiscuo y escaneando los paquetes tcp de un tcpdump ejecutado, si este coincide con las reglas de configuración indicadas abusaremos de la librería INetFwMgr para añadir una dirección ip en el ámbito de la regla del firewall configurada (lo vemos en la guía de uso).


Guía de uso
Requiere .NET Framework 4.5 (Windows vista pa’lante)
Primero la instalación, necesitarás ser administrador y la ruta de instalación no se puede cambiar es “%programfiles%\fe80Grau” o “%programfiles% (x86) \fe80Grau” si lo instalas en un Windows de 64 bits




Siguiente, siguiente, pide administrador y termina:




En el escritorio ahora tendremos un acceso directo, basicKnock Config. Antes de ejecutarlo vamos a crear la regla en el firewall; por ejemplo yo voy a configurar mi knock para restringir el acceso al puerto del Escritorio Remoto (3389)
Abrimos la configuración avanzada del Firewall:
Nos aseguramos que la configuración del firewall en los perfiles (tanto dominio, privado y público) tenemos las conexiones entrantes en bloquear por defecto, 


Desactivamos todas las reglas de Escritorio remoto en “reglas de entrada”:


Y creamos una nueva regla entrante; el tipo de regla puerto, se aplica la regla TCP, con el puerto local específico 3389. 


En acción dejaremos la opción Permitir la conexión, en Perfil dejamos los tres perfiles activados, y de nombre le pondremos RDPKnock.
Una vez creada la editaremos (botón derecho Propiedades)


Y en ámbito especificaremos que la dirección IP remota es 127.0.0.1


De esta forma, ahora mismo nadie tiene acceso a ese puerto salvo tú.
Aplicamos y ya podemos cerrar la configuración del firewall, aseguraros de tenerlo activo xD

Volvemos al escritorio y ahora si ejecutamos el basicKnock config (requiere administrador):




Desde aquí configuraremos y controlaremos el servicio, 

IP local, pones tú IP local xDD
Regla Firewall, indicaremos el nombre de la regla que hemos creado antes: RDPKnock
Puerto permiso, indica el puerto (o puertos separados por comas, respetará el orden) TCP al cual tendrás que enviarle al menos un paquete para que te conceda permiso en el Firewall, añadiendo la IP de origen en el ámbito de direcciones IP remotas.
Puerto bloqueo, indica el puerto TCP al cual tendrás que enviarle al menos un paquete para que te elimine de la lista del ámbito de direcciones IP remotas.
Tarjeta de red, indica el id de la tarjeta de red. Para saber el id, guarda la configuración, inicia o reinicia el servicio y clica en ver registro, se abrirá el visor de eventos de Windows, a partir del tercer registro de basicKnock (empezando por abajo, se listan los dispositivos de red):


En mi caso el id 0 está bien ya que es el que uso para la conexión local.

En ver tráfico de red, podremos ver cuando entra el knock


Y si hemos hecho todo bien, en el ámbito de la regla creada hemos de ver la ip 192.168.1.33 como permitida


Ahora este dispositivo puede entrar al Escritorio Remoto ya que le hemos otorgado permiso para acceder al puerto 3389.

Y esto es todo de momento, quiero añadir los siguientes puntos:

En ver tráfico de red, solo detectará, pausará y marca en verde la consola en el primer puerto especificado permitido, si se han especificado varios puertos separados por comas.

Mientras el servicio está ejecutándose se comprueba que el proceso basickKnockPR.exe que es el que interactúa con las librerías, si el proceso muere o es muerto se autoejecutará de nuevo. Al parar el servicio el proceso muere.

Es un servicio por lo tanto el proceso basicKnock Config no hace falta tenerlo abierto, tampoco el ver tráfico de red.

Al reiniciar el servicio se limpia la lista de direcciones IP permitidas en el ámbito dejando solo 127.0.0.1

Ya aviso que no se le acerca a un servicio knock que pueda configurarse fácilmente en linux, ya que no puedes elegir entre paquetes TCP y UDP, ni filtrar por flags privatizando solo el ACK por ejemplo.

Recuerda cerrar la conexión enviando una petición al puerto de bloqueo.


**Necesario tener instalado WinPcap en el equipo : http://www.winpcap.org/install/default.htm


Aquí la descarga del instalador
Aquí tenéis acceso al github