Hola. Mi duda es bastante sencilla, ¿Como puedo averiguar la función hash que utiliza mi distribución de linux para hashear contraseñas? En el fichero /etc/shadow aparece la contraseña asociada a mi usuario pero hasheada y me gustaría saber que hash está utilizando mi distribución, que es Kali Linux 2020.1.
He probado a hashear mi contraseña original (la que meto para iniciar sesión) mediante QuickHash con varias funciones de hash distintas y ninguna me devuelve el hash que aparece en el fichero /etc/shadow.
Gracias, un saludo.
Kali está basado en ubuntu asi que realmente no utiliza shadow, usa shadow2. Dale un vistazo a este artículo, explica muy bien sobre como detectar el tipo de hashing: https://www.cyberciti.biz/faq/understanding-etcshadow-file/
Citar$1$ is MD5
$2a$ is Blowfish
$2y$ is Blowfish
$5$ is SHA-256
$6$ is SHA-512
En el caso de Kali debiera utilizar SHA-512. Lo puedes sacar con:
$ sudo cat /etc/shadow- | grep usuario Saludos.
Gracias por el artículo, soluciona mi duda con respecto a saber que hash se ha utilizado. En efecto el primer hash que probé fue SHA-512, y aun así no coincidían el que obtenía de manera manual y el que aparecía en /etc/passwd. Para mostrarte un caso concreto he cambiado mi contraseña a
holahola.
Si voy al fichero /etc/passwd el campo destinado a almacenar la contraseña contiene lo siguiente
$6$.63oZj8Hf87vZAnT$yBeieSF4sVMTL6ndq2MJF1S1gLdQjs5VDacSgLJTAzi/ZEcOgp9nkNSGa0qdrTgUqY231zx.sh88QkRZ3r/VW0
lo cuál indicaría que se ha utilizado SHA-512 para hashear la contraseña
holahola y que el hash de la contraseña es
.63oZj8Hf87vZAnT$yBeieSF4sVMTL6ndq2MJF1S1gLdQjs5VDacSgLJTAzi/ZEcOgp9nkNSGa0qdrTgUqY231zx.sh88QkRZ3r/VW0
Sin embargo si meto la contraseña
holahola en QuickHash para calcular su hash SHA-512 el resultado que obtengo es
8984264870D10BD7D1456AFA517587BCB9D538F537F5ED9A89118AA02BA61E821F908DBA588C61D4F798734737CBDA3577649B528BEB9FEA600CC2DCB8A2502D
Es fácil ver que no coinciden, ni siquiera en longitud. ¿En qué me estoy equivocando?
Gracias, un saludo.
Puedes usar la función 'crypt(...)'...Según el manual (
man 3 crypt):
Citarcrypt () es la función de cifrado de contraseña. Se basa en el algoritmo estándar de cifrado de datos con variaciones destinadas (entre otras cosas) a desalentar el uso de implementaciones de hardware de una búsqueda clave.
salt significa:
Citarsalt es una cadena de dos caracteres elegida del conjunto [ a - zA - Z0 - 9. / ]. Esta cadena se utiliza para perturbar el algoritmo en 4096 formas diferentes.
En base a ello, y para facilitar las cosas, puedes usar
crypt(...) directamente en Python:
import crypt
# SHA512
type = '6'
# El «salt»
salt = '.63oZj8Hf87vZAnT'
# La cadena a hashear
word = 'holahola'
print(crypt.crypt(word, '$%s$%s$' % (type, salt)))El resultado sería:
python3 script.py
$6$.63oZj8Hf87vZAnT$yBeieSF4sVMTL6ndq2MJF1S1gLdQjs5VDacSgLJTAzi/ZEcOgp9nkNSGa0qdrTgUqY231zx.sh88QkRZ3r/VW0La razón por la que no te generaba igual es que se usaba directamente la función sha512 sin derivaciones. Para ilustrar mejor lo que digo:
import hashlib
string = b'holahola'
print(hashlib.sha512(string).hexdigest())El resultado sería:
python3 script.py
8984264870d10bd7d1456afa517587bcb9d538f537f5ed9a89118aa02ba61e821f908dba588c61d4f798734737cbda3577649b528beb9fea600cc2dcb8a2502dTe podría interesar:
*- es.wikipedia.org/wiki/Secure_Hash_Algorithm
*- docs.python.org/3/library/hashlib.html
*- docs.python.org/3/library/crypt.html~ DtxdF
Vale, comprendo entonces por qué no me cuadran ambos resultados. Sin embargo, teniendo en cuenta lo que acabas de decir, me surgen dos dudas más:
1. Has dicho que el salt está compuesto de dos caracteres, ¿Por qué luego en el ejemplo utilizas un salt = '.63oZj8Hf87vZAnT'? Ese salt tiene más de 2 caracteres.
2. ¿Cómo has sabido cuál era el salt utilizado para producir el hash correcto? Podría haber sido cualquier otro salt distinto.
Gracias, un saludo.
@MathCommander (https://underc0de.org/foro/index.php?action=profile;u=110902)No amigo, nunca dije que podrían ser dos caracteres, cité el manual de
crypt(...) según las partes de interés. Como por ejemplo esta:
Citarsalt es una cadena de dos caracteres elegida del conjunto [a- zA-Z0-9./]. Esta cadena se utiliza para perturbar el algoritmo en 4096 formas diferentes.
Lo que significa que se pueden usar caracteres en el
salt que estén en el rango de la
a a la
z (incluyendo mayúsculas) y números a partir del
1 al
9 sumando los caracteres
. (punto),
/ (barra diagonal).
Puede leerlo usando el comando:
man 3 cryptComo lo menciona nuestro compañero
@WHK (https://underc0de.org/foro/index.php?action=profile;u=20051) en los tipos de hashing en el fichero que está leyendo, puede ver que su hash es el tipo '
6' que corresponde a la función
SHA-512, sin embargo
crypt(...) hace mucho más que eso, entre ello están las derivaciones, entre otras cosas.
Mire lo que está en negrita: $
6$
.63oZj8Hf87vZAnT$
yBeieSF4sVMTL6ndq2MJF1S1gLdQjs5VDacSgLJTAzi/ZEcOgp9nkNSGa0qdrTgUqY231zx.sh88QkRZ3r/VW0Amarillo: La función que se usó
Rojo: El
saltVerde: El hash
~ DtxdF
Cierto! No me había dado cuenta de que el salt venía en la linea correspondiente del passwd. Ya si que me ha quedado claro.
Muchas gracias a todos por vuestras respuestas. Un saludo!