Descifrado de contraseñas (válido en OS 10.8 y posteriores)
Primero quiero explicar su mando:
sudo defaults read /var/db/dslocal/nodes/Default/users/user.plist ShadowHashData|tr -dc 0-9a-f|xxd -r -p|plutil -convert xml1 - -o -
La primera parte del comando lee la clave ShadowHashData en el plist
sudo defaults read /var/db/dslocal/nodes/Default/users/user.plist ShadowHashData
Resultado (mayoritariamente hexagonal):
(
<62706c69 73743030 d101025f 10145341 4c544544 2d534841 3531322d 50424b44 4632d303 04050607 0857656e 74726f70 79547361 6c745a69 74657261 74696f6e 734f1080 c5f19863 9915a101 c99af326 dffe13e8 f14456be 8fd2312a 39a777b9 2178804e 204ca4fe e12a8667 871440ef f4288e81 1d86d746 c6d96a60 c919c341 8dfebba4 2f329f5d 73c0372d 636d61d5 dfda1add 61af36c7 0e4acd77 12761072 09e643ae 92a0f43e 95a45274 4e50fb45 40d9bdf4 e0b70172 5d7db488 fbe18c1a b7737c6b 4f10200d ba6246bd 38266b2e 827ff7e7 27138075 7c71d653 893aa361 d5902398 30236911 c160080b 22293136 41c4e700 00000000 00010100 00000000 00000900 00000000 00000000 00000000 0000ea>
)
la segunda parte del comando tr -dc 0-9a-f
elimina todo excepto el 0-9a-f.
Resultado (hex):
62706c6973743030d101025f101453414c5445442d5348413531322d50424b444632d303040506070857656e74726f70795473616c745a697465726174696f6e734f1080c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b4f10200dba6246bd38266b2e827ff7e7271380757c71d653893aa361d590239830236911c160080b2229313641c4e700000000000001010000000000000009000000000000000000000000000000ea
la tercera parte xxd -r -p
lo revierte a un binario (mal formado):
?bF?8&k.???'?u|q?S?:?aՐ#?0#i?`WentropyTsaltZiterationsO???c??ɚ?&????DV???1*9?w?!x?N L???*?g?@??(????F??j`??A????/2?]s?7-cma????a?6?J?wvr ?C????>??RtNP?E@ٽ??r]}?????s|kO ")16A?? ?
y la última parte plutil -convert xml1 - -o -
crea un plist xml bien formado:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SALTED-SHA512-PBKDF2</key>
<dict>
<key>entropy</key>
<data>
xfGYY5kVoQHJmvMm3/4T6PFEVr6P0jEqOad3uSF4gE4gTKT+4SqGZ4cUQO/0
KI6BHYbXRsbZamDJGcNBjf67pC8yn11zwDctY21h1d/aGt1hrzbHDkrNdxJ2
EHIJ5kOukqD0PpWkUnROUPtFQNm99OC3AXJdfbSI++GMGrdzfGs=
</data>
<key>iterations</key>
<integer>49504</integer>
<key>salt</key>
<data>
DbpiRr04Jmsugn/35ycTgHV8cdZTiTqjYdWQI5gwI2k=
</data>
</dict>
</dict>
</plist>
Para obtener un archivo real reemplaza -o -
por -o ~/Desktop/tempuser.plist
El plist contiene tres clave partes: iteraciones , entropía y sal .
iteraciones es sólo un número entero, pero entropía y sal están codificados en base64. Para seguir trabajando con ellos hay que descodificarlos y xxdarlos:
Para descodificar sal eliminar todos los espacios y líneas nuevas de la parte de datos y utilizar
echo "salt_data" | base64 -D | xxd -p | tr -d \\n > salt
Con mis datos anteriores eso es
echo "DbpiRr04Jmsugn/35ycTgHV8cdZTiTqjYdWQI5gwI2k=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/salt
con el resultado de salt(hex):
0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369
Lo mismo para la entropía:
echo "xfGYY5kVoQHJmvMm3/4T6PFEVr6P0jEqOad3uSF4gE4gTKT+4SqGZ4cUQO/0KI6BHYbXRsbZamDJGcNBjf67pC8yn11zwDctY21h1d/aGt1hrzbHDkrNdxJ2EHIJ5kOukqD0PpWkUnROUPtFQNm99OC3AXJdfbSI++GMGrdzfGs=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/entropy
con el resultado de entropía(hex):
c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
Si necesita un archivo de texto para hashcat para descifrar la contraseña tienes que combinar los datos hash que has encontrado en una sola cadena:
$ml$<iterations(integer)>$<salt(hex)>$<entropy(hex)>
Con mi ejemplo de datos hash que es:
$ml$49504$0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369$c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
Guarda esto en un archivo llamado hash.txt y úsalo en hashcat. El comando de fuerza bruta adecuado para encontrar la contraseña (=mi contraseña de prueba simple que sólo contiene 4 dígitos) es:
./hashcat-cli64.app -m 7100 hash.txt -a 3 ?d?d?d?d
La contraseña resultante después de 3 minutos de cracking (en una VM) es 1111 .
Ahora al revés: Creación de ShadowHashData (válido en OS 10.8 y posteriores)
Esto aclara por qué no se puede utilizar un simple generador de hash SHA512 para crear los datos de la "contraseña". Sin embargo, SHA512 sigue siendo importante. Los antecedentes se explican aquí: PBKDF2-Proceso_de_derivación_de_claves .
Lo necesitas:
- PRF es una función pseudoaleatoria de dos parámetros con longitud de salida hLen (por ejemplo, un HMAC con clave)
- La contraseña es la contraseña maestra a partir de la cual se genera una clave derivada
- La sal es una secuencia de bits, conocida como sal criptográfica
- c es el número de iteraciones deseado
- dkLen es la longitud deseada de la clave derivada
crear DK = PBKDF2(PRF, Contraseña, Sal, c, dkLen)
Para crear DK ~ el entropía en SALTED-SHA512-PBKDF2 (la única parte del plist intermedio que depende de su contraseña) utilice php hash_pbkdf2 :
string hash_pbkdf2 ( string $algo , string $password , string $salt , int $iterations [, int $length = 0 [, bool $raw_output = false ]] )
En el Terminal (se necesita PHP ⩾ 5.5) introduzca:
php -a
Interactive shell
php > $password = "1111";
php > $iterations = 49504;
php > $length = 256;
php > $salt = "\x0d\xba\x62\x46\xbd\x38\x26\x6b\x2e\x82\x7f\xf7\xe7\x27\x13\x80\x75\x7c\x71\xd6\x53\x89\x3a\xa3\x61\xd5\x90\x23\x98\x30\x23\x69";
php > $hash = hash_pbkdf2("sha512", $password, $salt, $iterations, $length);
php > echo $hash;
c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
php >
La cadena utilizada en $salt es el hexágono escapado ( \x ) presentación de la sal(hex):
0dba6246... -> \x0d\xba\x62\x46...
Ya que puede definir o conocer el algoritmo hash (tiene que ser sha512 para Mac 10.8 y posterior), iteraciones (un número mayor que cero y menor que 2^32-1), sal (longitud de 64 bytes hexadecimales pero aleatorios) y longitud (256 bytes) puede crear un archivo plist intermedio bien formado, invirtiendo todos los comandos anteriores.
Invirtiendo su comando (mejor: cada uno de los subcomandos) desde el primer paso puede crear los datos de la clave ShadowHashData en el plist original utilizando el plist intermedio.
Y para responder finalmente a tu pregunta: el algoritmo hash utilizado para procesar la contraseña de OS X (y otros datos como la sal) es SHA512. Pero no puedes decir que tu contraseña de usuario se almacena como Hash SHA512 .
Tu contraseña y la sal se asan por sha512 muchas veces, luego el resultado es base64'ed y reverse xxd'ed. Junto con el sal y el iteraciones es xxd'ed y base64'ed de nuevo.
Espero no haber olvidado ningún paso.
3 votos
¿Qué tipo de contraseña de OS X intentas descifrar? ¿OS X 10.7/10.8? Porque mi archivo dice
SALTED-SHA512-PBKDF2
(OS X 10.10).0 votos
@klanomath OS X El Capitan; y eso es lo que dice, no estaba seguro si PBKDF2 eran datos sensibles. ¿Es SALTED-SHA512-PBKDF2 el tipo, y si es así, hay alguna función/biblioteca de c++ que pueda generar este tipo? (Preferiblemente una función/biblioteca rápida)
0 votos
Pensaba que los hash de las contraseñas de OS X se almacenaban en
/var/db/shadow/hash
?1 votos
@tjt263 no en Yosemite+