はじめに
ハッシュは不可逆なので、楽にハッシュから元の文字列を導く方法は基本的にはない。
元の文字列を特定するには、主に以下の方法がある。
- 総当たり攻撃(ブルートフォース攻撃)
- 辞書攻撃
- レインボーテーブル
総当たり攻撃と辞書攻撃は特定の文字列群を次々にハッシュ化していき、対象ハッシュと比べ、同じハッシュ値になったらその文字列が元の文字列であることがわかるという手法である。
レインボーテーブルは、あらかじめ大量の文字列群をハッシュ化したデータベースを作成し、対象ハッシュとデータベース内のハッシュ値を比べ、同じハッシュ値があれば対になっている文字列が元の文字列であることがわかるという手法である。
有名なレインボーテーブルサービスには「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
https://www.openwall.com/john/ -
Hashcat
https://hashcat.net/hashcat/
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件のコメント