John the Ripper (JtR) は、非常に強力で広く使われているパスワードクラッキングツールです。システム監査やセキュリティ評価において、弱いパスワードを発見するために不可欠な存在となっています。JtRは多様なハッシュ形式に対応しており、その中にはLDAP (Lightweight Directory Access Protocol) サーバーからエクスポートされるLDIF (LDAP Data Interchange Format) ファイルに含まれるパスワードハッシュも含まれます。
LDIFファイルは、LDAPディレクトリのデータをテキスト形式で表現するための標準フォーマットです。ユーザーアカウント情報、グループ情報、設定などが含まれ、その中にはユーザーのパスワードハッシュも記録されていることがあります。これらのハッシュをJohn the Ripperで解析可能な形式に変換するのが、ldif2john
というツールです。
このブログ記事では、John the Ripperスイートに含まれる ldif2john
ユーティリティの使い方を詳しく解説します。LDIFファイルからパスワードハッシュを抽出し、John the Ripperを使ってパスワードの強度を評価する手順を学びましょう。🕵️♂️
ldif2johnとは?
ldif2john
は、John the Ripper スイートの一部として提供されるPerlスクリプト (場合によってはPythonスクリプト) です。その主な目的は、LDIFファイル内に存在するパスワードハッシュ情報を読み取り、John the Ripperが理解できる形式(しばしば「John形式」や「JtR形式」と呼ばれる)に変換することです。
LDIFファイルには、さまざまな形式でパスワードが格納されている可能性があります。
- 平文 (plaintext): これは非常に稀で、セキュリティ上推奨されません。
- ハッシュ化された形式:
- SSHA (Salted SHA-1)
- SHA (SHA-1)
- SMD5 (Salted MD5)
- MD5
- Crypt (Unixスタイルのcrypt(3)ハッシュ)
- その他、LDAPサーバーの設定に依存する形式
ldif2john
は、これらの一般的なハッシュ形式を自動的に検出し、ユーザー名(通常は uid
や cn
属性)と関連付けて、John the Ripperが直接処理できるフォーマットで出力します。
ldif2john
は変換ツールであり、パスワードクラッキング自体は行いません。クラッキング処理は、変換後のハッシュファイルを使って John the Ripper 本体が行います。
ldif2johnの入手と場所
ldif2john
は通常、John the Ripper をインストールすると自動的に含まれます。John the Ripper のインストール方法によって、ldif2john
の配置場所は異なります。
-
パッケージマネージャー経由でのインストール (例: apt, yum, brew):
多くの場合、
/usr/share/john/
や/usr/lib/john/
、あるいは/usr/bin/
ディレクトリ内に他の*2john
スクリプトと一緒に配置されます。# Debian/Ubuntu系の場合の例 ls /usr/share/john/*2john* # RPM系の場合の例 ls /usr/libexec/john/*2john*
-
ソースコードからコンパイルした場合:
John the Ripper のソースコードディレクトリ内の
run
ディレクトリに配置されることが一般的です。# John the Ripperのソースディレクトリに移動 cd /path/to/john-bleeding-jumbo/run/ ls *2john*
もし見つからない場合は、find
コマンドや locate
コマンドでシステム全体を検索してみてください。
# findコマンドを使用 (少し時間がかかる場合があります)
sudo find / -name ldif2john*
# locateコマンドを使用 (事前に updatedb が必要)
sudo updatedb
locate ldif2john
多くの場合、ldif2john
はPerlスクリプト (ldif2john.pl
) として提供されますが、環境によってはPython版 (ldif2john.py
) が存在する場合もあります。機能は基本的に同じです。実行には対応するインタプリタ(PerlまたはPython)が必要です。
基本的な使い方
ldif2john
の基本的な使い方は非常にシンプルです。入力としてLDIFファイルを指定し、標準出力にJohn the Ripper形式のハッシュを出力します。通常、この出力をファイルにリダイレクトして保存します。
# Perlスクリプトの場合
perl /path/to/ldif2john.pl <input_ldif_file> > <output_hash_file>
# Pythonスクリプトの場合
python /path/to/ldif2john.py <input_ldif_file> > <output_hash_file>
# 実行権限があれば直接実行できる場合も
/path/to/ldif2john <input_ldif_file> > <output_hash_file>
各要素の説明:
/path/to/ldif2john.pl
または/path/to/ldif2john.py
:ldif2john
スクリプトへの実際のパス。環境に合わせて修正してください。<input_ldif_file>
: パスワードハッシュが含まれているLDIFファイルの名前。>
: 標準出力をファイルにリダイレクトする演算子。<output_hash_file>
: John the Ripper形式のハッシュを保存するファイル名。任意の名前を指定できます(例:ldif_hashes.txt
)。
実行例
例として、以下のような内容のLDIFファイル (users.ldif
) があるとします。
dn: uid=alice,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
uid: alice
cn: Alice Wonderland
sn: Wonderland
userPassword: {SSHA}abcdefghijklmnopqrstuvwxyzABCDEF==
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/alice
dn: uid=bob,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
uid: bob
cn: Bob The Builder
sn: Builder
userPassword:: e1NIQX1mZ2hpamtsbW5vcHFyc3R1dnc9PQ== # Base64エンコードされたSSHA
loginShell: /bin/bash
uidNumber: 1002
gidNumber: 1002
homeDirectory: /home/bob
dn: uid=charlie,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
uid: charlie
cn: Charlie Chaplin
sn: Chaplin
# パスワードなし、または他の場所に保存
loginShell: /bin/bash
uidNumber: 1003
gidNumber: 1003
homeDirectory: /home/charlie
dn: uid=david,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
uid: david
cn: David Copperfield
sn: Copperfield
userPassword: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
loginShell: /bin/bash
uidNumber: 1004
gidNumber: 1004
homeDirectory: /home/david
この users.ldif
ファイルに対して ldif2john
を実行します。ここでは ldif2john
が /usr/share/john/ldif2john
にあると仮定します。
/usr/share/john/ldif2john users.ldif > ldif_hashes.txt
実行後、ldif_hashes.txt
ファイルには以下のような内容が出力されます(実際のハッシュ値は上記例のダミーデータから生成されるため異なります)。
alice:$ldif$SSHA$abcdefghijklmnopqrstuvwxyzABCDEF==
bob:$ldif$SSHA$ZmdoaWprbG1ub3BxcnN0dXZ3PT0= # Base64デコード後の値
david:$ldif$MD5$Xr4ilOzQ4PCOq3aQ0qbuaQ==
この出力形式について詳しく見ていきましょう。
- ユーザー名 (
alice
,bob
,david
): LDIFファイルから抽出されたユーザー識別子(通常はuid
やcn
)。コロン (:
) でハッシュ本体と区切られます。 $ldif$
: John the Ripperに対して、これがLDIF由来のハッシュであることを示す識別子です。- ハッシュタイプ (
SSHA
,MD5
): 検出されたハッシュアルゴリズムの種類。John the Ripperはこの情報を使って適切なクラッキング処理を選択します。 - ハッシュ本体: 実際のハッシュ値(SSHAの場合はソルトも含むBase64エンコードされたデータ、MD5の場合はBase64エンコードされたハッシュ値)。Base64エンコードされた属性(例:
userPassword::
)は自動的にデコードされます。
charlie
のように userPassword
属性がないエントリは、出力に含まれません。
オプション
ldif2john
は比較的シンプルなツールであり、多くのコマンドラインオプションは提供されていません。しかし、John the Ripperスイート内の一部のツールと同様に、特定のヘルプオプションやバージョン情報表示オプションが存在する可能性があります(ただし、実装に依存します)。
基本的な使用法は、入力ファイルを与えて出力をリダイレクトする形式が主です。特定のハッシュタイプのみを抽出したり、出力を細かく制御したりする高度なオプションは通常ありません。必要に応じて、生成されたハッシュファイルを後処理(例: grep
で特定のハッシュタイプをフィルタリング)することができます。
# 例: SSHAハッシュのみを抽出する場合
/usr/share/john/ldif2john users.ldif | grep ':\$ldif\$SSHA\$' > ssha_hashes.txt
John the Ripperでのクラッキング
ldif2john
でハッシュファイル (例: ldif_hashes.txt
) を生成したら、いよいよ John the Ripper を使ってパスワードクラッキングを試みます。
最も基本的なコマンドは以下の通りです。
john ldif_hashes.txt
John the Ripper は、ファイル内のハッシュ形式 ($ldif$SSHA$
や $ldif$MD5$
) を自動的に認識し、デフォルトのクラッキングモード(シングルクラックモード、ワードリストモード、インクリメンタルモードの順)で解析を開始します。
特定のワードリストを使用する場合は、--wordlist
オプションを指定します。
john --wordlist=/path/to/password.lst ldif_hashes.txt
特定のフォーマットのみを対象にする場合は --format
オプションが利用できます。ldif2john
が生成するハッシュの場合、John the Ripper内部ではより具体的なフォーマット名(例: LDAP-SSHA
, LDAP-MD5
)で認識されることがあります。john --list=formats
コマンドで利用可能なフォーマット名を確認できます。
# 利用可能なフォーマットを確認
john --list=formats | grep -i ldap
# SSHA形式のみをクラックする場合 (フォーマット名は環境により異なる可能性あり)
john --format=LDAP-SSHA ldif_hashes.txt
# MD5形式のみをクラックする場合 (フォーマット名は環境により異なる可能性あり)
john --format=LDAP-MD5 ldif_hashes.txt
クラッキングが成功すると、John the Ripper は発見したパスワードを表示します。進捗状況は実行中に任意のキー(スペースキーなど)を押すことで確認できます。クラックされたパスワードは、デフォルトでは ~/.john/john.pot
(またはJohnの実行ディレクトリ内の john.pot
) というファイルに保存され、--show
オプションで後から確認できます。
# クラックされたパスワードを表示
john --show ldif_hashes.txt
出力例:
alice:password123:1001:1001::/home/alice:/bin/bash
david:secret:/path/to/ldif:/sbin/nologin
2 password hashes cracked, 1 left
ユースケースと考慮事項
ldif2john
と John the Ripper の組み合わせは、以下のような場面で役立ちます。
- セキュリティ監査: 組織内のLDAPサーバーに保存されているユーザーパスワードの強度を評価し、弱いパスワードを使用しているユーザーを特定します。
- ペネトレーションテスト: 侵害されたシステムからLDIFファイルを入手した場合、パスワードハッシュを抽出し、さらなる権限昇格や横展開(ラテラルムーブメント)のためにパスワードのクラックを試みます。
- パスワードリカバリ: 正当な理由でパスワードを忘れてしまった(かつ他の回復手段がない)場合に、自身のハッシュからパスワードを復元する最後の手段として(ただし、倫理的・法的な問題を考慮する必要があります)。
倫理的および法的考慮事項
パスワードクラッキングツールは強力であるため、その使用には倫理的および法的な配慮が不可欠です。
- 許可: 他者のシステムやアカウントに対してパスワードクラッキングを行う場合は、必ず事前に明示的な許可を得てください。無許可でのアクセスやクラッキングは違法行為となります。
- 目的: セキュリティ評価や監査など、正当な目的のためにのみ使用してください。
- データ保護: LDIFファイルやクラックされたパスワードは機密情報です。安全な場所に保管し、不要になったら適切に削除してください。
ツールの使用は、常に自己責任で行ってください。
まとめ
ldif2john
は、LDIFファイルに含まれるパスワードハッシュをJohn the Ripperで解析可能な形式に変換するための便利なツールです。LDAP環境のセキュリティ評価やペネトレーションテストにおいて、ユーザーパスワードの強度を分析する上で重要な役割を果たします。
基本的な使い方は簡単で、LDIFファイルを指定して実行し、出力をファイルに保存するだけです。その後、John the Ripper本体を使って、様々な手法でパスワードクラッキングを試みることができます。
ただし、これらのツールの使用には責任が伴います。常に法と倫理を遵守し、適切な許可を得てから使用するようにしてください。🔐
参考情報
-
John the Ripper official website:
https://www.openwall.com/john/
John the Ripper の公式サイト。ダウンロード、ドキュメント、関連ツールへのリンクがあります。
-
John the Ripper Community Wiki (GitHub):
https://github.com/openwall/john/wiki
使い方、オプション、対応フォーマットなど、より詳細な情報が記載されています。
コメント