Злом пароля (дійсний в ОС 10.8 та новіших версіях)
Спочатку я хочу пояснити вашу команду:
sudo defaults read /var/db/dslocal/nodes/Default/users/user.plist ShadowHashData|tr -dc 0-9a-f|xxd -r -p|plutil -convert xml1 - -o -
Перша частина команди читає ключ ShadowHashData у плісті
sudo defaults read /var/db/dslocal/nodes/Default/users/user.plist ShadowHashData
Результат (переважно шестигранний):
(
<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>
)
друга частина команди tr -dc 0-9a-f
видаляє все, крім 0-9a-f.
Результат (шістнадцятковий):
62706c6973743030d101025f101453414c5445442d5348413531322d50424b444632d303040506070857656e74726f70795473616c745a697465726174696f6e734f1080c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b4f10200dba6246bd38266b2e827ff7e7271380757c71d653893aa361d590239830236911c160080b2229313641c4e700000000000001010000000000000009000000000000000000000000000000ea
третя частина xxd -r -p
повертає його до (неправильно сформованого) двійкового:
?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?? ?
остання частина plutil -convert xml1 - -o -
створює добре сформований xml-пліст:
<?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>
Щоб отримати реальний файл, замініть -o -
його-o ~/Desktop/tempuser.plist
Пліст містить три ключові частини: ітерації , ентропія та сіль .
ітерації - це ціле число, але ентропія та сіль - це закодовані base64. Щоб продовжувати працювати з ними, вам потрібно розшифрувати та xxd:
Щоб розшифрувати сіль, видаліть усі пробіли та нові рядки з частини даних та використовуйте
echo "salt_data" | base64 -D | xxd -p | tr -d \\n > salt
З моїми даними вище це
echo "DbpiRr04Jmsugn/35ycTgHV8cdZTiTqjYdWQI5gwI2k=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/salt
з сольовим (шестигранним) результатом:
0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369
Те саме для ентропії:
echo "xfGYY5kVoQHJmvMm3/4T6PFEVr6P0jEqOad3uSF4gE4gTKT+4SqGZ4cUQO/0KI6BHYbXRsbZamDJGcNBjf67pC8yn11zwDctY21h1d/aGt1hrzbHDkrNdxJ2EHIJ5kOukqD0PpWkUnROUPtFQNm99OC3AXJdfbSI++GMGrdzfGs=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/entropy
з результатом ентропії (шістнадцятковий):
c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
Якщо вам потрібен текстовий файл для hashcat, щоб зламати пароль, ви повинні об'єднати знайдені хеш-дані в одну рядок:
$ml$<iterations(integer)>$<salt(hex)>$<entropy(hex)>
З мого прикладу хеш-даних, це:
$ml$49504$0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369$c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
Збережіть це у файлі під назвою hash.txt і використовуйте його в hashcat. Власна команда грубої сили для пошуку пароля (= мій простий тестовий пароль, що містить лише 4 цифри):
./hashcat-cli64.app -m 7100 hash.txt -a 3 ?d?d?d?d
Отриманий пароль після 3-х хвилинного злому (в VM) становить 1111 .
Тепер зворотне: Створення ShadowHashData (дійсне в ОС 10.8 і новіших)
Це з'ясовує, чому ви не можете використовувати простий хеш-генератор SHA512 для створення своїх "парольних" даних. SHA512 все ще важливий. Фон пояснюється тут: PBKDF2-Key_derivation_process .
Тобі потрібно:
- PRF - це псевдовипадкова функція двох параметрів з вихідною довжиною hLen (наприклад, введений HMAC)
- Пароль - головний пароль, з якого генерується похідний ключ
- Сіль - це послідовність бітів, відома як криптографічна сіль
- c - кількість бажаних ітерацій
- dkLen - бажана довжина похідного ключа
створити DK = PBKDF2 (PRF, Пароль, сіль, c, dkLen)
Щоб створити DK ~ ключ ентропії в SALTED-SHA512-PBKDF2 (єдина частина проміжного списку, яка покладається на ваш пароль), використовуйте php hash_pbkdf2 :
string hash_pbkdf2 ( string $algo , string $password , string $salt , int $iterations [, int $length = 0 [, bool $raw_output = false ]] )
У терміналі (потрібен PHP ⩾ 5.5) введіть:
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 >
Рядок, що використовується в $ солі, - це втечене шістнадцяткове (\ x) представлення солі (hex):
0dba6246 ... -> \ x0d \ xba \ x62 \ x46 ...
Оскільки ви можете визначити або знати алгоритм хешування (він повинен бути sha512 для Mac 10.8 і пізніших версій), ітерацій (число більше нуля і менше 2 ^ 32-1), солі (довжина 64 байт у шістнадцятковій кількості, але випадково!) Та довжина (256 байт), ви можете створити добре сформований проміжний файл-пліст, перевернувши всі команди вище.
Повернувши свою команду (краще: кожна з підкоманд) з першого кроку, ви можете створити дані ключа ShadowHashData в оригінальному списку, використовуючи проміжний список.
І щоб відповісти на ваше питання нарешті: алгоритм хешу, який використовується для обробки пароля OS X (та інших даних, таких як сіль), є SHA512. Але ви не можете сказати, що ваш пароль користувача зберігається як хеш SHA512 .
Ваш пароль і сіль на грилі sha512 багато разів, тоді результат є base64'ed і зворотний xxd'ed. Разом із сіллю та ітераціями знову xxd'ed та base64'ed.
Сподіваюся, я не забув жодного кроку.
SALTED-SHA512-PBKDF2
(OS X 10.10)!