domingo, 26 de febrero de 2012

fwknop: Single Packet Authorization and Port Knocking

Fwknop es una herramienta que permite agregar un nivel mas de seguridad en nuestra red.
Si lo que queremos es ser invisibles hacia fuera y asegurarnos que nadie pueda entrar en nuestros servicios por lo general configuramos el netfilter para que descarte cualquier paquete entrante a nuestra WAN.
Pero en este caso además de poder hacer eso vamos a incluso poder tener servicios accesibles como ssh que estarán escuchando en un puerto cerrado por netfilter y para eso esta herramienta nos vendrá a la mano.

Esta herramienta se encargara de ejecutar una vieja técnica llamada portknoking enviando un solo paquete autenticado (SPA) con AES (cifrado de bloques Rijndael de clave simétrica de hasta 128 bits) o mediante GPG y si la autenticación es exitosa el puerto nos quedara abierto por un intervalo de 10 segundos.

La diferencia básica entre AES y GPG es que AES al ser un algoritmo de cifrado simétrico con claves mas chicas permite el mismo nivel de seguridad que GPG(Asimétrico).

Ahora vamos a describir como se compone un paquete SPA

- 16 bytes de datos aleatorios
- usuario local
- timestamp local
- fwknop versión
- modo (acceso o comando)
- acceso deseado o comando a ejecutar
- MD5 sum

Los primeros 16 bytes de datos al azar se emplean para asegurarse de que cada paquete sea único permitiendo al servidor mantener un cache de mensajes SPA recibidos para frustrar los ataques de replay.
Luego se incluye el usuario local por razones de privilegios del lado del servidor.
El modo le indicara al servidor si lo que debe hacer es ejecutar un comando o permitir el acceso a un puerto.
Luego cada campo se separa por : y el mensaje entero se codifica con base64.
Por ultimo se emplea uno de los dos algoritmos de cifrado o AES o GPG.
Ahora vamos a probar la herramienta:

Primero instalamos fwknop

Servidor(como root):

apt-get install fwknop-server

Cliente(como root):

apt-get install fwknop-client

Configuramos el servidor de fwknop archivo: /etc/fwknop/access.conf:

SOURCE: ANY;
OPEN_PORTS: tcp/22;
KEY: <encrypt_key>
FW_ACCESS_TIMEOUT: 10;
REQUIRE_USERNAME: dclavijo;
DATA_COLLECT_MODE: ULOG_PCAP;

En modo servidor fwknop puede adquirir los paquetes de una interfaz en modo promiscuo usando libpcap.

Ahora en el cliente verificamos que no podemos establecer la conexión

[cliente]$ nc -v 192.168.1.1 22

Hasta ahora bien parece que netcat se cuelga porque no puede completar la conexión simplemente porque el netfilter del servidor descarto el paquete SYN antes de que pudiese acceder al stack tcpip.

Ahora para poder acceder a nuestro puerto mandamos el paquete SPA

daedalus@neuromancer:~/code/fwknop-2.0/client$ ./fwknop -A tcp/22 -s -D 192.168.1.1 -v
Enter encryption password:

FKO Field Values:
=================

Random Value: 9854906951929078
Username: daedalus
Timestamp: 1330307367
FKO Version: 1.9.12
Message Type: 1
Message String: 0.0.0.0,tcp/22
Nat Access:
Server Auth:
Client Timeout: 0
Digest Type: 3

Encoded Data: 9854906951929078:ZGFlZGFsdXM:1330307367:1.9.12:1:MC4wLjAuMCx0Y3AvMjI

SPA Data Digest: Oo2OlFRdw3SjO2xKlsFuSxy62zVPuMYRNg41xvQAy+Y

Final Packed/Encrypted/Encoded Data:

9xZYQdwWlSOaUPue68lN0hn+7T8zSzKU9b/PtGbdVhmci4e4jXELn/EzoyFvtXMWKBihMFEkE+SiUQ+mS6zcwLod+r7n/DbEGWQbBx/Q51f9GszQ+KHlH49iy/KupGC9BGvBG+1J4C3JtzJBd1aAS+mcWX4Y8rCyQ

Generating SPA packet:
protocol: udp
port: 62201
IP/host: 192.168.1.1
send_spa_packet: bytes sent: 161

Ahora tranquilamente podemos conectarnos al servidor:

[cliente]$ nc -v 192.168.1.1 22
192.168.1.1 22 (ssh) open
SSH-2.0-OpenSSH_5.5p1 Debian-6

Ahora la instancia del proceso de Fwknop que esta corriendo en el servidor configuro el netfilter para que desde nuestra ip los paquetes hacia el puerto 22 no sean descartados.
Incluso después de 10 segundos fwknop expirara la sesión volviendo al estado por defecto pero esto no implica que perdamos la conexión ya establecida sino que futuras conexiones serán descartadas.

Incluso fwknop es invulnerable a los ataques de replay, supongamos que un atacante fue capaz de escuchar el mensaje SPA que se envió desde el cliente al servidor al puerto UDP 62201.

[atacante]# tcpdump -i wlan0 -c 1 -s 0 -l -nn -X udp port 62201
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
23:49:29.049157 IP 192.168.2.179.51065 > 192.168.1.1.62201: UDP, length 161
0x0000: 4500 00bd efc6 4000 4011 c564 c0a8 02b3 E.....@.@..d....
0x0010: c0a8 0101 c779 f2f9 00a9 cb79 3978 5a59 .....y.....y9xZY
0x0020: 5164 7757 6c53 4f61 5550 7565 3638 6c4e QdwWlSOaUPue68lN
0x0030: 3068 6e2b 3754 387a 537a 4b55 3962 2f50 0hn+7T8zSzKU9b/P
0x0040: 7447 6264 5668 6d63 6934 6534 6a58 454c tGbdVhmci4e4jXEL
0x0050: 6e2f 457a 6f79 4676 7458 4d57 4b42 6968 n/EzoyFvtXMWKBih
0x0060: 4d46 456b 452b 5369 5551 2b6d 5336 7a63 MFEkE+SiUQ+mS6zc
0x0070: 774c 6f64 2b72 376e 2f44 6245 4757 5162 wLod+r7n/DbEGWQb
0x0080: 4278 2f51 3531 6639 4773 7a51 2b4b 486c Bx/Q51f9GszQ+KHl
0x0090: 4834 3969 792f 4b75 7047 4339 4247 7642 H49iy/KupGC9BGvB
0x00a0: 472b 314a 3443 334a 747a 4a42 6431 6141 G+1J4C3JtzJBd1aA
0x00b0: 532b 6d63 5758 3459 3872 4379 51 S+mcWX4Y8rCyQ
1 packets captured
1 packets received by filter
0 packets dropped by kernel

Ahora el atacante mediante la herramienta netcat puede reenviarnos el paquete SPA

[attacker]$ echo "9xZYQdwWlSOaUPue68lN0hn+7T8zSzKU9b/PtGbdVhmci4e4jXELn/EzoyFvtXMWKBihMFEkE+SiUQ+mS6zcwLod+r7n/DbEGWQbBx/Q51f9GszQ+KHlH49iy/KupGC9BGvBG+1J4C3JtzJBd1aAS+mcWX4Y8rCyQ" |nc -u 192.168.1.1 62201

Y simplemente en el syslog podemos ver que se recibió un mensaje pero no se realizo ninguna acción.

Feb 26 23:30:11 server fwknop: attempted message replay from: 192.168.1.179

Bookmark and Share

1 comentarios:

martin dijo...

Muy bueno el artículo

Publicar un comentario en la entrada