Bẻ khóa mật khẩu (hợp lệ trong OS 10.8 trở lên)
Đầu tiên tôi muốn giải thích lệnh của bạn:
sudo defaults read /var/db/dslocal/nodes/Default/users/user.plist ShadowHashData|tr -dc 0-9a-f|xxd -r -p|plutil -convert xml1 - -o -
Phần đầu tiên của lệnh đọc khóa ShadowHashData trong phần chính
sudo defaults read /var/db/dslocal/nodes/Default/users/user.plist ShadowHashData
Kết quả (chủ yếu là hex):
(
<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>
)
phần thứ hai của lệnh tr -dc 0-9a-f
loại bỏ bất cứ thứ gì ngoại trừ 0-9a-f.
Kết quả (hex):
62706c6973743030d101025f101453414c5445442d5348413531322d50424b444632d303040506070857656e74726f70795473616c745a697465726174696f6e734f1080c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b4f10200dba6246bd38266b2e827ff7e7271380757c71d653893aa361d590239830236911c160080b2229313641c4e700000000000001010000000000000009000000000000000000000000000000ea
phần thứ ba hoàn nguyên xxd -r -p
nó thành một nhị phân (hình thành mal):
?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?? ?
và phần cuối cùng plutil -convert xml1 - -o -
tạo ra một chuỗi xml được định dạng tốt:
<?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>
Để có được một tập tin thực sự thay thế -o -
bởi-o ~/Desktop/tempuser.plist
Plist chứa ba phần chính : lặp , entropy và muối .
Lặp lại chỉ là một số nguyên, nhưng entropy và muối được mã hóa base64. Để tiếp tục làm việc với họ, bạn phải giải mã và xxd cho họ:
Để giải mã muối, loại bỏ tất cả các khoảng trắng và dòng mới khỏi phần dữ liệu và sử dụng
echo "salt_data" | base64 -D | xxd -p | tr -d \\n > salt
Với dữ liệu của tôi ở trên đó
echo "DbpiRr04Jmsugn/35ycTgHV8cdZTiTqjYdWQI5gwI2k=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/salt
với kết quả muối (hex):
0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369
Tương tự cho entropy:
echo "xfGYY5kVoQHJmvMm3/4T6PFEVr6P0jEqOad3uSF4gE4gTKT+4SqGZ4cUQO/0KI6BHYbXRsbZamDJGcNBjf67pC8yn11zwDctY21h1d/aGt1hrzbHDkrNdxJ2EHIJ5kOukqD0PpWkUnROUPtFQNm99OC3AXJdfbSI++GMGrdzfGs=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/entropy
với kết quả entropy (hex):
c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
Nếu bạn cần một tệp văn bản cho hashcat để bẻ khóa mật khẩu, bạn phải kết hợp dữ liệu băm bạn đã tìm thấy thành một chuỗi:
$ml$<iterations(integer)>$<salt(hex)>$<entropy(hex)>
Với dữ liệu băm ví dụ của tôi đó là:
$ml$49504$0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369$c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b
Lưu tệp này vào một tệp có tên hash.txt và sử dụng nó trong hashcat. Lệnh brute force thích hợp để tìm mật khẩu (= mật khẩu kiểm tra đơn giản của tôi chỉ chứa 4 chữ số) là:
./hashcat-cli64.app -m 7100 hash.txt -a 3 ?d?d?d?d
Mật khẩu kết quả sau 3 phút bẻ khóa (trong VM) là 1111 .
Bây giờ thì ngược lại: Tạo ShadowHashData (hợp lệ trong OS 10.8 trở lên)
Điều này làm sáng tỏ lý do tại sao bạn không thể sử dụng trình tạo hàm băm SHA512 đơn giản để tạo dữ liệu "mật khẩu" của mình. SHA512 vẫn quan trọng mặc dù. Bối cảnh được giải thích ở đây: PBKDF2-Key_derivation_ process .
Bạn cần:
- PRF là hàm giả ngẫu nhiên gồm hai tham số có độ dài đầu ra hLen (ví dụ: HMAC có khóa)
- Mật khẩu là mật khẩu chính được tạo từ khóa dẫn xuất
- Muối là một chuỗi các bit, được gọi là muối mật mã
- c là số lần lặp mong muốn
- dkLen là độ dài mong muốn của khóa dẫn xuất
để tạo DK = PBKDF2 (PRF, Mật khẩu, Muối, c, dkLen)
Để tạo DK ~ khóa entropy trong SALTED-SHA512-PBKDF2 (phần duy nhất trong phần trung gian phụ thuộc vào mật khẩu của bạn), hãy sử dụng php hash_pbkdf2 :
string hash_pbkdf2 ( string $algo , string $password , string $salt , int $iterations [, int $length = 0 [, bool $raw_output = false ]] )
Trong Terminal (PHP ⩾ 5.5 là cần thiết), nhập:
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 >
Chuỗi được sử dụng trong $ salt là phần trình bày hex (\ x) của muối (hex):
0dba6246 ... -> \ x0d \ xba \ x62 \ x46 ...
Vì bạn có thể xác định hoặc biết thuật toán băm (phải là sha512 cho Mac 10.8 trở lên), các lần lặp (một số lớn hơn 0 và nhỏ hơn 2 ^ 32-1), muối (chiều dài 64 byte hex nhưng ngẫu nhiên!) Và chiều dài (256 byte) bạn có thể tạo một tệp plist trung gian được tạo tốt, bằng cách đảo ngược tất cả các lệnh ở trên.
Bằng cách đảo ngược lệnh của bạn (tốt hơn: mỗi lệnh con) từ bước đầu tiên, bạn có thể tạo dữ liệu của khóa ShadowHashData trong bản gốc bằng cách sử dụng bảng trung gian.
Và cuối cùng để trả lời câu hỏi của bạn: thuật toán băm được sử dụng để xử lý mật khẩu OS X (và các dữ liệu khác như muối) là SHA512. Nhưng bạn không thể nói mật khẩu người dùng của bạn được lưu dưới dạng băm SHA512 .
Mật khẩu của bạn và muối được nướng bởi sha512 nhiều lần, sau đó kết quả là base64'ed và đảo ngược xxd'ed. Cùng với muối và các lần lặp lại, nó xxd'ed và base64'ed một lần nữa.
Tôi hy vọng tôi đã không quên bất kỳ bước nào.
SALTED-SHA512-PBKDF2
(OS X 10.10)!