Password cracking (valido in OS 10.8 e versioni successive)
Per prima cosa voglio spiegare il tuo 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 -
La prima parte del comando legge la chiave ShadowHashData nel plist
sudo defaults read /var/db/dslocal/nodes/Default/users/user.plist ShadowHashData
Risultato (principalmente esadecimale):
(
<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 seconda parte del comando tr -dc 0-9a-f
rimuove qualsiasi cosa tranne 0-9a-f.
Risultato (esadecimale):
62706c6973743030d101025f101453414c5445442d5348413531322d50424b444632d303040506070857656e74726f70795473616c745a697465726174696f6e734f1080c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b4f10200dba6246bd38266b2e827ff7e7271380757c71d653893aa361d590239830236911c160080b2229313641c4e700000000000001010000000000000009000000000000000000000000000000ea
la terza parte lo xxd -r -p
converte in un binario (mal formato):
?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 l'ultima parte plutil -convert xml1 - -o -
crea un plist xml ben formato:
<?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>
Per ottenere un file reale sostituirlo -o -
con-o ~/Desktop/tempuser.plist
Il plist contiene tre parti chiave : iterazioni , entropia e sale .
le iterazioni sono solo un numero intero, ma entropia e salt sono codificati in base64. Per continuare a lavorare con loro devi decodificarli e xxd:
Per decodificare il sale, rimuovere tutti gli spazi e le nuove linee dalla parte dati e utilizzarli
echo "salt_data" | base64 -D | xxd -p | tr -d \\n > salt
Con i miei dati sopra questo è
echo "DbpiRr04Jmsugn/35ycTgHV8cdZTiTqjYdWQI5gwI2k=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/salt
con il risultato sale (esadecimale):
0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369
Lo stesso per l'entropia:
echo "xfGYY5kVoQHJmvMm3/4T6PFEVr6P0jEqOad3uSF4gE4gTKT+4SqGZ4cUQO/0KI6BHYbXRsbZamDJGcNBjf67pC8yn11zwDctY21h1d/aGt1hrzbHDkrNdxJ2EHIJ5kOukqD0PpWkUnROUPtFQNm99OC3AXJdfbSI++GMGrdzfGs=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/entropy
con il risultato entropia (esadecimale):
c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
Se hai bisogno di un file di testo per hashcat per decifrare la password devi combinare i dati hash che hai trovato in una singola stringa:
$ml$<iterations(integer)>$<salt(hex)>$<entropy(hex)>
Con i miei dati hash di esempio che sono:
$ml$49504$0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369$c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
Salvalo in un file chiamato hash.txt e usalo in hashcat. Il comando di forza bruta appropriato per trovare la password (= la mia semplice password di prova contenente solo 4 cifre) è:
./hashcat-cli64.app -m 7100 hash.txt -a 3 ?d?d?d?d
La password risultante dopo 3 minuti di cracking (in una VM) è 1111 .
Ora il contrario: creazione di ShadowHashData (valido in OS 10.8 e versioni successive)
Ciò spiega perché non è possibile utilizzare un semplice generatore di hash SHA512 per creare i dati della "password". SHA512 è comunque importante. Lo sfondo è spiegato qui: PBKDF2-Key_derivation_process .
Hai bisogno:
- PRF è una funzione pseudocasuale di due parametri con lunghezza di uscita hLen (ad es. Un HMAC con chiave)
- Password è la password principale da cui viene generata una chiave derivata
- Il sale è una sequenza di bit, noto come sale crittografico
- c è il numero di iterazioni desiderate
- dkLen è la lunghezza desiderata della chiave derivata
creare DK = PBKDF2 (PRF, Password, Salt, c, dkLen)
Per creare DK ~ la chiave entropia in SALTED-SHA512-PBKDF2 (l'unica parte nel plist intermedio che si basa sulla tua password) usa php hash_pbkdf2 :
string hash_pbkdf2 ( string $algo , string $password , string $salt , int $iterations [, int $length = 0 [, bool $raw_output = false ]] )
Nel Terminale (è necessario PHP ⩾ 5.5) inserire:
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 stringa utilizzata in $ salt è la presentazione esadecimale con escape (\ x) di salt (esadecimale):
0dba6246 ... -> \ x0d \ xba \ x62 \ x46 ...
Dato che puoi definire o conoscere l'algoritmo hash (deve essere sha512 per Mac 10.8 e versioni successive), iterazioni (un numero maggiore di zero e inferiore a 2 ^ 32-1), salt (lunghezza 64 byte esadecimali ma casuale!) E lunghezza (256 byte) è possibile creare un file plist intermedio ben formato, invertendo tutti i comandi sopra.
Invertendo il comando (meglio: ciascuno dei sottocomandi) dal primo passo è possibile creare i dati della chiave ShadowHashData nel plist originale usando il plist intermedio.
E per rispondere finalmente alla tua domanda: l'algoritmo hash utilizzato per elaborare la password di OS X (e altri dati come il salt) è SHA512. Ma non puoi dire che la tua password utente sia memorizzata come hash SHA512 .
La tua password e il sale sono grigliati da sha512 molte volte, quindi il risultato è base64 e inverso xxd. Insieme al sale e alle iterazioni, viene xxd e base64 di nuovo.
Spero di non aver dimenticato nessun passo.
SALTED-SHA512-PBKDF2
(OS X 10.10)!