Sto leggendo un libro e mi dà un semplice script Python per decifrare /etc/shadow
di password che sono state crittografate con la funzione crypt()
. Quindi ti sfida a modificare il programma Python per lavorare con il più recente algoritmo Crypt3 SHA-512 usato nei moderni sistemi Linux.
Mi sto bloccando sull'output dello stesso hash che è memorizzato in /etc/shadow
. Ho un utente test1
con una password di password
e /etc/shadow
assomiglia a questo:
cat /etc/shadow | grep test1
test1:$6$sRgBNCzw$A3IHWJz./hdhPa1FHuN.Kn.P/2InPqGjZxxGnNUxY2I2b0t4xpogCKWkq9.Ra.XDaFSpNOb5UYhwjQMzBWrtp.:16792:0:99999:7:::
La forma più semplice del mio script assomiglia a questo:
import hashlib
dk = hashlib.pbkdf2_hmac('sha512',b'password',b'sRgBNCzw',5000)
Ispezionare dk
assomiglia a questo:
>>> 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'
Quale credo sia il miglior sforzo di Python per rappresentare un blob binario come testo. Tuttavia, ho bisogno di confrontare questo con il valore hash della funzione Crypt3 che è:
A3IHWJz./hdhPa1FHuN.Kn.P/2InPqGjZxxGnNUxY2I2b0t4xpogCKWkq9.Ra.XDaFSpNOb5UYhwjQMzBWrtp.
Ora osservando il valore dell'hash nel file shadow posso vedere che sembra base64 quindi lo uso:
binascii.b2a_base64(binascii.hexlify(dk))
E ottieni questo:
'MmU1OTUxZjBmMTFmMDgwZTljYTkyZDQ1OTA4OWViNWFiMTA0NjE2ZjNhMDAzYjlhY2IzZmFhMDQ0ODE0YjYyNjljMGU3ZDIzYmRmNWU2YTVkNmRhN2M3ODc1MWVhMWQxOTU0NDk0MTUxOTIwY2M0NTU4NWNmMDY3OTc3YzVjZWU=\n'
Ulteriori letture mi hanno insegnato che la funzione Crypt3 utilizza una versione leggermente modificata di base64 che elimina il padding e '='.
Qualcuno può aiutare con il modo in cui posso ottenere che il mio hash corrisponda all'hash in /etc/shadow
usando Python?