Quebra de senha (válida no OS 10.8 e mais recente)
Primeiro eu quero explicar o seu comando:
sudo defaults read /var/db/dslocal/nodes/Default/users/user.plist ShadowHashData|tr -dc 0-9a-f|xxd -r -p|plutil -convert xml1 - -o -
A primeira parte do comando lê a chave ShadowHashData no plist
sudo defaults read /var/db/dslocal/nodes/Default/users/user.plist ShadowHashData
Resultado (principalmente hexadecimal):
(
<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>
)
a segunda parte do comando tr -dc 0-9a-f
remove qualquer coisa, exceto 0-9a-f.
Resultado (hex):
62706c6973743030d101025f101453414c5445442d5348413531322d50424b444632d303040506070857656e74726f70795473616c745a697465726174696f6e734f1080c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b4f10200dba6246bd38266b2e827ff7e7271380757c71d653893aa361d590239830236911c160080b2229313641c4e700000000000001010000000000000009000000000000000000000000000000ea
a terceira parte o xxd -r -p
reverte para um binário (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?? ?
e a última parte plutil -convert xml1 - -o -
cria um xml bem 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 obter um arquivo real, substitua -o -
por-o ~/Desktop/tempuser.plist
A lista contém três partes principais : iterações , entropia e sal .
iterações é apenas um número inteiro, mas a entropia e o sal são codificados em base64. Para continuar trabalhando com eles, é necessário decodificar e xxd-los:
Para decodificar salt, remova todos os espaços e novas linhas da parte de dados e use
echo "salt_data" | base64 -D | xxd -p | tr -d \\n > salt
Com meus dados acima, isso é
echo "DbpiRr04Jmsugn/35ycTgHV8cdZTiTqjYdWQI5gwI2k=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/salt
com o resultado de sal (hex):
0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369
O mesmo para entropia:
echo "xfGYY5kVoQHJmvMm3/4T6PFEVr6P0jEqOad3uSF4gE4gTKT+4SqGZ4cUQO/0KI6BHYbXRsbZamDJGcNBjf67pC8yn11zwDctY21h1d/aGt1hrzbHDkrNdxJ2EHIJ5kOukqD0PpWkUnROUPtFQNm99OC3AXJdfbSI++GMGrdzfGs=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/entropy
com o resultado da entropia (hex):
c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
Se você precisar de um arquivo de texto para o hashcat quebrar a senha, precisará combinar os dados do hash encontrados em uma única sequência:
$ml$<iterations(integer)>$<salt(hex)>$<entropy(hex)>
Com o meu exemplo de dados de hash, é isso:
$ml$49504$0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369$c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
Salve isso em um arquivo chamado hash.txt e use-o no hashcat. O comando de força bruta adequado para encontrar a senha (= minha senha de teste simples que contém apenas 4 dígitos) é:
./hashcat-cli64.app -m 7100 hash.txt -a 3 ?d?d?d?d
A senha resultante após 3 minutos de quebra (em uma VM) é 1111 .
Agora, o inverso: Criando ShadowHashData (válido no OS 10.8 e mais recente)
Isso explica por que você não pode usar um simples gerador de hash SHA512 para criar seus dados de "senha". O SHA512 ainda é importante. O plano de fundo é explicado aqui: PBKDF2-Key_derivation_process .
Você precisa:
- PRF é uma função pseudo-aleatória de dois parâmetros com comprimento de saída hLen (por exemplo, um HMAC com chave)
- Senha é a senha mestre a partir da qual uma chave derivada é gerada
- O sal é uma sequência de bits, conhecida como sal criptográfico
- c é o número de iterações desejadas
- dkLen é o comprimento desejado da chave derivada
criar DK = PBKDF2 (PRF, Senha, Salt, c, dkLen)
Para criar DK ~ a chave de entropia em SALTED-SHA512-PBKDF2 (a única parte da lista intermediária que depende de sua senha), use php hash_pbkdf2 :
string hash_pbkdf2 ( string $algo , string $password , string $salt , int $iterations [, int $length = 0 [, bool $raw_output = false ]] )
No Terminal (é necessário o PHP 5.5), digite:
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 >
A string usada em $ salt é a apresentação hexadecimal com escape (\ x) do salt (hex):
0dba6246 ... -> \ x0d \ xba \ x62 \ x46 ...
Como você pode definir ou conhecer o algoritmo de hash (deve ser sha512 para Mac 10.8 e posterior), iterações (um número maior que zero e menor que 2 ^ 32-1), salt (comprimento 64 bytes hexadecimal, mas aleatório!) E comprimento (256 bytes), você pode criar um arquivo plist intermediário bem formado, revertendo todos os comandos acima.
Ao reverter seu comando (melhor: cada um dos subcomandos) desde o primeiro passo, você pode criar os dados da chave ShadowHashData na lista original usando a lista intermediária.
E para responder à sua pergunta finalmente: o algoritmo de hash usado para processar a senha do OS X (e outros dados como o salt) é o SHA512. Mas você não pode dizer que sua senha de usuário é armazenada como hash SHA512 .
Sua senha e o sal são grelhados por sha512 várias vezes, então o resultado é baseado em 64 'e invertido em xxd'. Juntamente com o sal e as iterações, ele é xxd'ed e base64'ed novamente.
Espero não ter esquecido nenhum passo.
SALTED-SHA512-PBKDF2
(OS X 10.10)!