はじめに:hash-identifierとは何か?
コンピューターの世界では、「ハッシュ」という言葉をよく耳にします。ハッシュとは、あるデータ(例えばファイルやパスワード)を元にして、特定の計算手順(ハッシュ関数)によって得られる、固定長の短いデータのことです。まるでデータの「指紋」のようなもので、元のデータが少しでも異なれば、生成されるハッシュ値も全く異なるものになるという特徴があります。
ハッシュは、データの同一性確認(ダウンロードしたファイルが壊れていないかチェックするなど)や、パスワードの安全な保管(元のパスワードを直接保存する代わりにハッシュ値を保存する)など、様々な場面で利用されています。しかし、世の中には多種多様なハッシュ関数(MD5, SHA-1, SHA-256, bcryptなど)が存在し、ハッシュ値を見ただけでは、どのハッシュ関数で生成されたものなのかを判断するのは困難です。
そこで登場するのが hash-identifier
というツールです。このツールは、与えられたハッシュ値の特徴(長さや使用されている文字の種類など)を分析し、それがどのハッシュアルゴリズムによって生成された可能性が高いかを推定してくれます。🕵️♀️
特に、セキュリティの分野、例えばペネトレーションテスト(侵入テスト)やCTF(Capture The Flag)競技などで、入手したハッシュ値がどの種類のものかを特定し、その後のパスワードクラックなどの作業につなげるために非常に役立ちます。
- 一方向性: ハッシュ値から元のデータを復元することは計算量的に極めて困難です。
- 衝突困難性: 異なるデータから同じハッシュ値が生成されること(衝突)を見つけるのが困難です。
- 固定長出力: 元のデータのサイズに関わらず、ハッシュ値は常に同じ長さになります。
hash-identifierのインストール
hash-identifier
は、セキュリティテスト用のLinuxディストリビューションであるKali Linuxには標準で含まれていることが多いです。そのため、Kali Linuxを使用している場合は、特別なインストール作業は不要な場合があります。
ターミナルを開き、以下のコマンドを実行して、ツールが利用可能か確認してみましょう。
hash-identifier
もしコマンドが見つからない(command not found)というエラーが出る場合や、他のLinuxディストリビューションやmacOS、Windows (WSLなど) で使用したい場合は、手動でインストールする必要があります。
hash-identifier
はPythonスクリプトとして提供されていることが多いです。オリジナルのバージョンは古いGoogle Codeでホストされていましたが、現在ではKali Linuxのパッケージリポジトリなどで管理されているバージョンや、有志によって改良されたバージョンが存在します。
Kali Linuxのリポジトリからスクリプトを取得する方法の一例(URLは変更される可能性があるため注意が必要です):
wget https://gitlab.com/kalilinux/packages/hash-identifier/-/raw/kali/master/hash-id.py
chmod +x hash-id.py
または、Pythonがインストールされていれば、pipを使って類似のツール(例えば `hashid`)をインストールすることも可能です。`hashid` は `hash-identifier` の後継ツールとして開発されており、より多くのハッシュタイプに対応しています。
pip install hashid
この記事では、主にKali Linuxに含まれる `hash-identifier` または `hash-id.py` スクリプトを想定して解説を進めます。
基本的な使い方
hash-identifier
の使い方は非常にシンプルです。ターミナルでコマンドを実行し、プロンプトが表示されたら、特定したいハッシュ値を入力(またはペースト)してEnterキーを押すだけです。
Kali Linuxに標準搭載されている場合:
hash-identifier
スクリプトファイルを直接実行する場合(Python 3 が必要):
python3 hash-id.py
コマンドを実行すると、以下のようなプロンプトが表示されます。
#########################################################################
# __ __ __ ______ _____ #
# /\ \/\ \ /\ \ /\ _ \ /\ __ \ #
# \ \ \_\ \ __ ____ \ \ \ __\ \ \L\ \\ \ \/\ \ #
# \ \ _ \ /'__`\ / ,__\ \ \ \ /'__`\\ \ __ \\ \ \ \ \ #
# \ \ \ \ \/\ \L\.\_/\__, `\ \ \ \/\ \L\.\\ \ \/\ \\ \ \_\ \ #
# \ \_\ \_\ \__/.\_\/\____/ \ \_\ \__/.\_\ \_\ \_\\ \_____\ #
# \/_/\/_/\/__/\/_/\/___/ \/_/\/__/\/_/\/_/\/_/ \/_____/ #
# update by Zemnmez #
# and Zion #
# Python 3 #
# #
# Identifies the different types of hashes. #
# #
#########################################################################
HASH:
ここに、特定したいハッシュ値を入力します。例えば、MD5ハッシュとしてよく知られている `098f6bcd4621d373cade4e832627b4f6` (文字列 “test” のMD5ハッシュ) を入力してみましょう。
HASH: 098f6bcd4621d373cade4e832627b4f6
Enterキーを押すと、hash-identifier
は入力されたハッシュ値の特徴を分析し、可能性のあるハッシュアルゴリズムのリストを表示します。
Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))
Least Possible Hashs:
[+] RAdmin v2.x
[+] NTLM
[+] MD4
[+] MD2
[+] MD5(HMAC)
[+] MD4(HMAC)
[+] MD2(HMAC)
[+] Haval-128
[+] RipeMD-128
[+] SNEFRU-128
[+] Tiger-128
[+] md5($pass.$salt)
[+] md5($salt.$pass)
(以下略)
出力結果は通常、「可能性が高いハッシュ (Possible Hashs)」と「可能性が低いハッシュ (Least Possible Hashs)」の2つのセクションに分かれています。
- Possible Hashs: 入力されたハッシュの形式(長さ、文字セットなど)に最もよく一致するアルゴリズムのリストです。この例では、MD5が最有力候補として挙げられています。
- Least Possible Hashs: 形式的には一致するものの、一般的ではない、あるいは他の候補ほど可能性が高くないアルゴリズムのリストです。
多くの場合、「Possible Hashs」にリストされているものが正解である可能性が高いですが、複数の候補が表示されることもよくあります。これは、異なるハッシュアルゴリズムが同じ長さや同じ文字セットの出力を持つことがあるためです。例えば、MD5とMD4はどちらも32文字の16進数文字列を生成します。
別の例として、SHA-256ハッシュ `9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08` (文字列 “test” のSHA-256ハッシュ) を入力してみましょう。
HASH: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
出力:
Possible Hashs:
[+] SHA-256
[+] Haval-256
Least Possible Hashs:
[+] SHA-256(HMAC)
[+] Haval-256(HMAC)
[+] sha256($pass.$salt)
[+] sha256($salt.$pass)
(以下略)
この場合、SHA-256 が最有力候補として表示されます。👍
オプションと機能
hash-identifier
は非常にシンプルなツールであり、多くのコマンドラインオプションは持っていません。基本的な対話モードでの使用が主となります。
ヘルプ情報を表示するには、通常 -h
や --help
オプションを使用しますが、hash-identifier
の実装によっては、これらのオプションが用意されていない場合もあります。その場合は、スクリプトのソースコードを確認するか、基本的な使い方で試すのが最も確実です。
一方、後継ツールの hashid
はいくつかの便利なオプションを提供しています。
オプション | 説明 |
---|---|
-m, --mode |
Hashcat(パスワードクラックツール)のモード番号を出力に含めます。 |
-j, --john |
John the Ripper(パスワードクラックツール)のフォーマット名を出力に含めます。 |
-e, --extended |
拡張ハッシュ情報(詳細な正規表現など)を表示します。 |
--version |
ツールのバージョン情報を表示します。 |
[HASH or FILE] |
コマンドライン引数として直接ハッシュ値やハッシュ値が含まれるファイル名を指定できます。 |
例えば、hashid
を使ってMD5ハッシュを特定し、同時にHashcatとJohn the Ripperの情報を得るには、以下のように実行します。
hashid -mj 098f6bcd4621d373cade4e832627b4f6
出力例:
Analyzing '098f6bcd4621d373cade4e832627b4f6'
[+] MD5 [Hashcat Mode: 0][JtR Format: raw-md5]
[+] Domain Cached Credentials (DCC) [Hashcat Mode: 1100][JtR Format: mscach]
-- End of Analysis --
このように、hashid
を使うと、特定したハッシュの種類に対応するクラッキングツールのパラメータも一緒に表示されるため、後続の作業がスムーズになります。✨
様々なハッシュの識別例
hash-identifier
や hashid
がどのように様々なハッシュを識別するか、いくつかの例を見てみましょう。
ハッシュタイプ | ハッシュ例 | hash-identifier/hashid の識別結果 (主な候補) |
---|---|---|
MD5 | e10adc3949ba59abbe56e057f20f883e (“123456″のMD5) |
MD5 |
SHA-1 | 7c4a8d09ca3762af61e59520943dc26494f8941b (“123456″のSHA-1) |
SHA-1, MySQL5 |
SHA-256 | 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 (“123456″のSHA-256) |
SHA-256 |
SHA-512 | ba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413 (“123456″のSHA-512) |
SHA-512 |
NTLM | 0cb6948805f797bf2a82807973b89537 (“password”のNTLM) |
NTLM (MD4も候補に出ることがある) |
MySQL (古い形式) | 5d7863514ec2c508 (“test”のMySQL323) |
MySQL323 |
bcrypt | $2a$10$N9qo8uLOickgx2ZMRZoMye.IKAXhHjpXg.JsohH12.IFsg.UiKpbG (“password”のbcrypt) |
bcrypt (hashid は識別可能, hash-identifier は識別できない可能性あり) |
MD5 Crypt | $1$Pl3m5Y95$t3Nk4zEXTCXDP4Vs4cL0p0 |
MD5 Crypt (hashid は識別可能) |
SHA-512 Crypt | $6$rounds=5000$usesomesillystri$D4IrlXfLJ9tyhsdGS1yGe.Q93gWBsc8/4k39F1v1kT9e5ZDBqfVMqjbym1LIXR993tDcJCRjA7B6a3j4r.YVS0 |
SHA-512 Crypt (hashid は識別可能) |
注意点として、
- 短いハッシュや、特徴的な記号(例:bcryptの
$2a$
や crypt系の$1$
,$5$
,$6$
など)を含まない単純な16進数のハッシュは、複数のアルゴリズムが候補として挙がりやすいです。 hash-identifier
は古いツールであり、bcryptのような比較的新しいハッシュ形式や、複雑なソルト形式を持つハッシュを正しく識別できない場合があります。hashid
の方がより多くの形式に対応しています。- HMAC(Hash-based Message Authentication Code)形式のハッシュも候補として挙がることがありますが、これらは通常のハッシュとは異なり、秘密鍵も使用されています。
Tips と注意点
- 複数の候補が出た場合: ツールが複数の可能性を示唆した場合、最も一般的なアルゴリズム(MD5, SHA-1, SHA-256など)から試してみるのが良いでしょう。また、ハッシュが取得されたコンテキスト(どのシステムやアプリケーションから来たか)がヒントになることもあります。例えば、古いWebアプリケーションならMD5、LinuxのパスワードならSHA-512 Cryptやbcryptなどが考えられます。
-
ツールの限界を知る:
hash-identifier
やhashid
は、ハッシュの「形式」に基づいて推測を行うツールです。100%の精度を保証するものではありません。特に、カスタムされたハッシュアルゴリズムや、非常に珍しいアルゴリズムは識別できない可能性があります。 -
ソルト付きハッシュ: bcryptやsha512-cryptなどのソルト(パスワードごとに付加されるランダムな値)を含むハッシュ形式の場合、ハッシュ値自体にソルトやアルゴリズムを示す情報が含まれていることがあります(例:
$6$
で始まる場合はSHA-512 Crypt)。ツールはこれらの情報も利用して識別します。 -
オンラインツールの活用: インターネット上には、
hash-identifier
と同様の機能を持つWebサイトも多数存在します。例えば、dCode.fr や TunnelsUP Hash Analyzer などがあります。これらを利用するのも一つの手ですが、機密性の高いハッシュ値を外部サイトに送信することのリスクは認識しておく必要があります。 -
後継ツール `hashid` の利用: 前述の通り、
hashid
はhash-identifier
よりも多くのハッシュタイプに対応し、パスワードクラックツールとの連携機能も強化されています。可能であればhashid
を利用することをお勧めします。 -
識別後のステップ: ハッシュの種類を特定できたら、次のステップは通常、そのハッシュをクラック(元のデータを推測)することです。これには Hashcat や John the Ripper といった専用のツールが用いられます。
hashid
の-m
や-j
オプションは、これらのツールで使用するパラメータを教えてくれるため、非常に便利です。
代替ツール
hash-identifier
の他にも、ハッシュの種類を識別するためのツールが存在します。
-
Hashid: 何度か言及しましたが、
hash-identifier
の事実上の後継であり、より高機能で対応範囲も広いです。Pythonで書かれており、pipで簡単にインストールできます。Kali Linuxにも含まれています。 - Haiti: Rubyで書かれたハッシュ識別ツール。こちらもHashcatやJohn the Ripperのモード表示に対応しています。
- HashTag: Pythonで書かれたツールで、250以上のハッシュタイプと110以上のHashcatモードに対応しているとされています。GitHubで公開されています。
- オンライン識別サイト: dCode.fr, TunnelsUP Hash Analyzer など、Webブラウザから利用できるサービスも便利ですが、機密情報の扱いに注意が必要です。
どのツールを使用するかは、好みや環境、識別したいハッシュの種類によって選択すると良いでしょう。一般的には、hashid
が現在の主流であり、多くのケースで十分な機能を提供します。
まとめ
hash-identifier
は、未知のハッシュ値がどのアルゴリズムで生成されたものかを素早く特定するための便利なツールです。特にセキュリティ診断やフォレンジック調査の初期段階で非常に役立ちます。
使い方は簡単で、コマンドを実行してハッシュ値を入力するだけです。ただし、複数の候補が表示される場合や、比較的新しいハッシュ形式には対応していない場合がある点には注意が必要です。
より高機能で対応範囲の広い後継ツール hashid
の利用も検討すると良いでしょう。これらのツールを適切に活用することで、ハッシュ解析の効率を大幅に向上させることができます。🚀
ハッシュの識別は、パスワードクラッキングやデータ解析の第一歩となる重要なプロセスです。ツールの使い方をマスターし、セキュリティスキル向上に役立ててください。💪
コメント