はじめに

ハッシュは不可逆なので、楽にハッシュから元の文字列を導く方法は基本的にはない。
元の文字列を特定するには、主に以下の方法がある。

  • 総当たり攻撃(ブルートフォース攻撃)
  • 辞書攻撃
  • レインボーテーブル

総当たり攻撃と辞書攻撃は特定の文字列群を次々にハッシュ化していき、対象ハッシュと比べ、同じハッシュ値になったらその文字列が元の文字列であることがわかるという手法である。

レインボーテーブルは、あらかじめ大量の文字列群をハッシュ化したデータベースを作成し、対象ハッシュとデータベース内のハッシュ値を比べ、同じハッシュ値があれば対になっている文字列が元の文字列であることがわかるという手法である。

有名なレインボーテーブルサービスには「CrackStation」などがある。

ハッシュの種類特定

ハッシュの種類が何かを調べるには、「hash-identifier」が有効である。

% hash-identifier 
   #########################################################################
   #     __  __                     __           ______    _____           #
   #    /\ \/\ \                   /\ \         /\__  _\  /\  _ `\         #
   #    \ \ \_\ \     __      ____ \ \ \___     \/_/\ \/  \ \ \/\ \        #
   #     \ \  _  \  /'__`\   / ,__\ \ \  _ `\      \ \ \   \ \ \ \ \       #
   #      \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \      \_\ \__ \ \ \_\ \      #
   #       \ \_\ \_\ \___ \_\/\____/  \ \_\ \_\     /\_____\ \ \____/      #
   #        \/_/\/_/\/__/\/_/\/___/    \/_/\/_/     \/_____/  \/___/  v1.2 #
   #                                                             By Zion3R #
   #                                                    www.Blackploit.com #
   #                                                   Root@Blackploit.com #
   #########################################################################
--------------------------------------------------
 HASH: 382e0360e4eb7b70034fbaa69bec5786

Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))

また、「hashid」というツールもある。

主なハッシュ解析ツール(辞書・総当たり)

John the Ripper

主なオプション

  • --wordlist:
    ワードリストモード、使用する辞書ファイルを指定する

  • --single:
    シングルモード

  • --incremental
    インクリメンタルモード

  • --rules:
    ルールの指定

  • --stdout
    使用する文字列の表示

使用例

% cat hash.txt 
382e0360e4eb7b70034fbaa69bec5786

一番シンプルな使用方法。

john hash.txt

これでも解析してくれるが、johnが自動で判別したハッシュの種類と異なると解析ができないため、「--format」オプションでハッシュの種類を指定する。
また、「--wordlist」オプションでワードリストの指定も可能。
(指定しない場合、「/usr/share/john/password.lst」が使用される)

john --format=md5crypt --wordlist=password.lst hash.txt 

unshadow

「/etc/passwd」と「/etc/shadow」を使用してLinuxユーザのパスワードハッシュ解析をする場合、unshadowコマンドを使用して内容を結合する。

unshadow passwd shadow > unshadowed.txt

unshadowした一例

testuser:$6$P2SvLCLyxWi0/nqg$0Hl3oPmDvvA9ReiwBNHYIz56Dr5BokxUJLvFrABZrzLR8OQzsAUh3Km/yuGpMA1dUZUFJ78kyBynkpwtlYOeL/:1002:1002::/home/testuser:/bin/sh

$に囲まれている数字の意味は以下。

1→md5
5→sha-256
6→sha-512

$で囲まれている「P2SvLCLyxWi0/nqg」はsalt。

結合したファイルに対して解析を行う。

john --format=sha512crypt unshadowed.txt

John the Ripperのモード

Johnは、以下オプションの指定をすることで3種類のモードを選択することができる。
(指定しない場合は、シングルモード→ワードリストモード→インクリメンタルモードの順に自動で実行される)

  • --single: シングルモード
  • --wordlist: ワードリストモード
  • --incremental: インクリメンタルモード

シングルモード

singleルールを元にユーザ名からパスワードを生成しそれを辞書として使用する。
ルールについては後述

ワードリストモード

ワードリストを指定し、そこに記載されている文字列を全て試行する。

インクリメンタルモード

考えられる全ての文字列を試行する。
パスワードが短い場合は有効だが、長い場合は一生終わらない。

ルールオプション

Johnでは、パスワードをあるルールに従って生成する機能がある。

例えば、以下のワードファイルがあるとする。

% cat wordlist.txt 
password

これに「ShiftToggle」ルールを指定して辞書を作成した場合以下になる。
(「--stdout」オプションで総当たりを試みるワードリストを出力する)

% john --wordlist=wordlist.txt --rules=ShiftToggle --stdout
Using default input encoding: UTF-8
password
Password
pAssword
PAssword
paSsword
pASsword
PaSsword
PASsword
pasSword

...

ルールを指定して解析する場合は、以下のようなコマンドになる。

% john --format=sha512crypt --wordlist=wordlist.txt --rules=Single unshadowed.txt
Using default input encoding: UTF-8
Loaded 3 password hashes with 3 different salts (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 3 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password         (ftp)
P4ssw0rd         (testuser)
2g 0:00:00:00 DONE (2021-06-08 18:04) 4.166g/s 1810p/s 3410c/s 3410C/s password1989..password1900
Use the "--show" option to display all of the cracked passwords reliably
Session completed

ルールの内容は以下ファイルに記載がある。

/usr/share/john/john.conf

解析済みハッシュの確認

johnは解析済みのハッシュに対して再度実行しても結果を返してくれない。
「--show」オプションを使用することで、解析済みの値を表示してくれる。

% john --show unshadowed.txt 
ftp:password:133:141:ftp daemon,,,:/srv/ftp:/usr/sbin/nologin
testuser:P4ssw0rd:1002:1002::/home/testuser:/bin/sh

また、解析結果は以下ファイルに格納されている。

$HOME/.john/john.pot

Hashcat

John the Ripperが対応していないような種類のハッシュも幅広く対応している。

基本的な使い方

hashcat -a [Attack-mode] -m [Hash-type] ...

Attack Modes

# Mode
0 Straight 辞書攻撃の場合に使用
1 Combination
3 Brute-force 総当たりの場合に使用
6 Hybrid Wordlist + Mask
7 Hybrid Mask + Wordlist

辞書攻撃例

hashcat -a 0 -m 0 example400.hash example.dict

-m 0: md5

総当たり攻撃例

4文字の英(大文字小文字)数記号で総当たりする。

hashcat -a 3 -m 0 example0.hash ?a?a?a?a
Built-in Charsets
? Charset
l abcdefghijklmnopqrstuvwxyz
u ABCDEFGHIJKLMNOPQRSTUVWXYZ
d 0123456789
h 0123456789abcdef
H 0123456789ABCDEF
s !"#$%&'()*+,-./:;<=>?@[]^_`{ }~
a ?l?u?d?s
b 0x00 - 0xff
キャラセットの指定方法

1文字目を記号、2文字目から4文字目を数字の場合。

?s?d?d?d

また、キャラセットをユーザ定義することもできる。

-1 "?l?d" "?1?1?1?1"

上記の場合、「?1」を記載すると小文字と数字を指定することになる。

4から8文字の英(小文字)数で総当たりする。

hashcat hash.txt -a 3 -m 0 --increment --increment-min=4 --increment-max=8 -1 "?l?d" "?1?1?1?1?1?1?1?1"

-1オプション: キャラセットをユーザ定義する。
「-1 "?l?d"」の場合は英(小文字)数。

コマンド例

Attack-Mode Hash-Type Example command
Wordlist \$P$ hashcat -a 0 -m 400 example400.hash example.dict
Wordlist + Rules MD5 hashcat -a 0 -m 0 example0.hash example.dict -r rules/best64.rule
Brute-Force MD5 hashcat -a 3 -m 0 example0.hash ?a?a?a?a?a?a
Combinator MD5 hashcat -a 1 -m 0 example0.hash example.dict example.dict

0件のコメント

コメントを残す

アバタープレースホルダー

メールアドレスが公開されることはありません。 が付いている欄は必須項目です