密码破解(在OS 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 -
该命令的第一部分读取plist中的键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 plist:
<?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
plist包含三个关键部分:迭代,熵和salt。
迭代只是一个整数,但是熵和盐是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 (在OS 10.8和更高版本中有效)
这说明了为什么不能使用简单的SHA512哈希生成器来创建“密码”数据。SHA512仍然很重要。此处说明了背景:PBKDF2-Key_derivation_process。
你需要:
- PRF是具有输出长度hLen的两个参数的伪随机函数(例如,键控HMAC)
- 密码是从中生成派生密钥的主密码
- 盐是位序列,称为密码盐
- c是所需的迭代次数
- dkLen是派生密钥的所需长度
创建DK = PBKDF2(PRF,密码,Salt,c,dkLen)
要在SALTED-SHA512-PBKDF2中创建DK〜熵密钥(中间plist中唯一依赖您的密码的部分),请使用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 >
$ salt中使用的字符串是salt(hex)的转义十六进制(\ x)表示形式:
0dba6246 ...-> \ x0d \ xba \ x62 \ x46 ...
由于您可以定义或了解哈希算法(对于Mac 10.8和更高版本,必须为sha512),迭代(大于零且小于2 ^ 32-1的数字),盐(长度为64字节的十六进制,但随机!)和长度(256字节),您可以通过反转上述所有命令来创建格式正确的中间plist文件。
通过从第一步开始就反转命令(最好是每个子命令),您可以使用中间plist在原始plist中创建键ShadowHashData的数据。
最后回答您的问题:用于处理OS X密码(和其他数据,如salt)的哈希算法为SHA512。但是您不能说您的用户密码存储为SHA512哈希。
您的密码和盐被sha512烤了很多遍,然后结果是base64位和xxd位。连同salt和迭代一起,再次进行xxd和base64处理。
希望我不要忘记任何一步。
SALTED-SHA512-PBKDF2
(OS X 10.10)!