No se puede obtener la base correcta para descifrar Crypt3 SHA-512 en Linux con Python

5

Estoy leyendo un libro y me da un simple script de Python para descifrar las contraseñas de /etc/shadow que se cifraron con la función crypt() . Luego lo desafía a que modifique el programa Python para que funcione con el nuevo algoritmo Crypt3 SHA-512 utilizado en los Linux modernos.

Me estoy quedando atascado en la salida del mismo hash que está almacenado en /etc/shadow . Tengo un usuario test1 con una contraseña de password y /etc/shadow tiene este aspecto:

cat /etc/shadow | grep test1
test1:$6$sRgBNCzw$A3IHWJz./hdhPa1FHuN.Kn.P/2InPqGjZxxGnNUxY2I2b0t4xpogCKWkq9.Ra.XDaFSpNOb5UYhwjQMzBWrtp.:16792:0:99999:7:::

La forma más simple de mi script se ve así:

import hashlib
dk = hashlib.pbkdf2_hmac('sha512',b'password',b'sRgBNCzw',5000)

La inspección de dk se ve así:

>>> dk
'.YQ\xf0\xf1\x1f\x08\x0e\x9c\xa9-E\x90\x89\xebZ\xb1\x04ao:\x00;\x9a\xcb?\xaa\x04H\x14\xb6&\x9c\x0e}#\xbd\xf5\xe6\xa5\xd6\xda|xu\x1e\xa1\xd1\x95D\x94\x15\x19 \xccEX\\xf0g\x97|\\xee'

Supongo que es el mejor esfuerzo de Python para representar un blob binario como texto. Sin embargo, necesito comparar esto con el valor de hash de la función Crypt3 que es:

A3IHWJz./hdhPa1FHuN.Kn.P/2InPqGjZxxGnNUxY2I2b0t4xpogCKWkq9.Ra.XDaFSpNOb5UYhwjQMzBWrtp.

Ahora, solo mirando el valor de hash en el archivo de sombra, puedo ver que se parece a base64, así que uso esto:

binascii.b2a_base64(binascii.hexlify(dk))

Y obtén esto:

'MmU1OTUxZjBmMTFmMDgwZTljYTkyZDQ1OTA4OWViNWFiMTA0NjE2ZjNhMDAzYjlhY2IzZmFhMDQ0ODE0YjYyNjljMGU3ZDIzYmRmNWU2YTVkNmRhN2M3ODc1MWVhMWQxOTU0NDk0MTUxOTIwY2M0NTU4NWNmMDY3OTc3YzVjZWU=\n'

Lecturas adicionales me han enseñado que la función Crypt3 utiliza una versión ligeramente modificada de base64 que elimina el relleno y '='.

¿Puede alguien ayudarme con cómo puedo hacer que mi hash coincida con el hash en /etc/shadow usando Python?

    
pregunta 0x7c0 23.12.2015 - 22:49
fuente

1 respuesta

4

Basado en información en esta pregunta , Pude reproducir un hash con éxito.

Después de configurar mi contraseña en password , ejecuté estos comandos

$ sudo grep neil /etc/shadow
neil:$6$GpNiWKnm$aToSshPrg45wXFuP/Hmkkpf8/GUYg0d/C4eU/BH7iG2QwM.C59NIVr/izGUGXzf7HjqQNmpFXhxtIxGtXNrmj0:16793:0:99999:7:::
$ python -c 'import crypt; print crypt.crypt("password", "$6$GpNiWKnm$")'
$6$GpNiWKnm$aToSshPrg45wXFuP/Hmkkpf8/GUYg0d/C4eU/BH7iG2QwM.C59NIVr/izGUGXzf7HjqQNmpFXhxtIxGtXNrmj0
$ python --version
Python 2.7.10

Cabe señalar que el algoritmo hash que está en uso puede determinarse por el valor entre el primer par de signos de dólar. En este caso, $6$ significa que es sha-512 ( reference ) .

    
respondido por el Neil Smithline 24.12.2015 - 07:20
fuente

Lea otras preguntas en las etiquetas