パスワードクラッキング(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
結果(主に16進数):
(
<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>
)
コマンドの2番目の部分は、tr -dc 0-9a-f
0-9a-f以外のすべてを削除します。
結果(16進数):
62706c6973743030d101025f101453414c5445442d5348413531322d50424b444632d303040506070857656e74726f70795473616c745a697465726174696f6e734f1080c5f198639915a101c99af326dffe13e8f14456be8fd2312a39a777b92178804e204ca4fee12a8667871440eff4288e811d86d746c6d96a60c919c3418dfebba42f329f5d73c0372d636d61d5dfda1add61af36c70e4acd771276107209e643ae92a0f43e95a452744e50fb4540d9bdf4e0b701725d7db488fbe18c1ab7737c6b4f10200dba6246bd38266b2e827ff7e7271380757c71d653893aa361d590239830236911c160080b2229313641c4e700000000000001010000000000000009000000000000000000000000000000ea
3番目の部分は、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の 3つの主要部分が含まれています。
繰り返しは整数ですが、エントロピーとソルトはbase64でエンコードされます。それらを引き続き使用するには、デコードしてxxdする必要があります。
saltをデコードするには、データ部分からすべてのスペースと新しい行を削除して使用します
echo "salt_data" | base64 -D | xxd -p | tr -d \\n > salt
上記の私のデータで
echo "DbpiRr04Jmsugn/35ycTgHV8cdZTiTqjYdWQI5gwI2k=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/salt
salt(hex)の結果:
0dba6246bd38266b2e827ff7e7271380757c71d653893aa361d5902398302369
エントロピーについても同じ:
echo "xfGYY5kVoQHJmvMm3/4T6PFEVr6P0jEqOad3uSF4gE4gTKT+4SqGZ4cUQO/0KI6BHYbXRsbZamDJGcNBjf67pC8yn11zwDctY21h1d/aGt1hrzbHDkrNdxJ2EHIJ5kOukqD0PpWkUnROUPtFQNm99OC3AXJdfbSI++GMGrdzfGs=" | base64 -D | xxd -p | tr -d \\n > ~/Desktop/entropy
entropy(hex)の結果:
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
(VMで)3分間クラッキングした後のパスワードは1111です。
今度は逆:ShadowHashDataの作成 (OS 10.8以降で有効)
これにより、単純なSHA512ハッシュジェネレーターを使用して「パスワード」データを作成できない理由がわかります。ただし、SHA512は依然として重要です。背景については、PBKDF2-Key_derivation_processで説明しています。
必要なもの:
- PRFは、出力長がhLenの2つのパラメーターの擬似ランダム関数です(たとえば、キー付きHMAC)
- パスワードは、派生キーが生成されるマスターパスワードです
- ソルトは、暗号化ソルトとして知られるビットのシーケンスです
- cは、必要な反復回数です
- dkLenは、派生キーの望ましい長さです
DK = PBKDF2(PRF、Password、Salt、c、dkLen)を作成するには
SALTED-SHA512-PBKDF2(パスワードに依存する中間plistの唯一の部分)でDK〜エントロピーキーを作成するには、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)のエスケープされた16進(\ x)表示です:
0dba6246 ...-> \ x0d \ xba \ x62 \ x46 ...
ハッシュアルゴリズム(Mac 10.8以降ではsha512である必要があります)、反復(ゼロより大きく2 ^ 32-1より小さい数)、ソルト(長さ64バイト16進数ですがランダム!)、および長さ(256バイト)では、上記のすべてのコマンドを逆にすることにより、整形式の中間plistファイルを作成できます。
最初のステップからコマンド(より良い:各サブコマンド)を逆にすることにより、中間plistを使用して元のplistにキーShadowHashDataのデータを作成できます。
最後にあなたの質問に答えるために:OS Xパスワード(およびsaltなどの他のデータ)の処理に使用されるハッシュアルゴリズムはSHA512です。ただし、ユーザーのパスワードがSHA512ハッシュとして保存されているとは言えません。
パスワードとソルトはsha512によって何回も焼き付けられ、その結果はbase64 'と逆xxd'になります。ソルトとイテレーションと一緒に、再びxxd 'とbase64'されます。
一歩も忘れないでください。
SALTED-SHA512-PBKDF2
(OS X 10.10)と書かれているからです!