ldif2john: LDIFファイルからパスワードハッシュを抽出してJohn the Ripperで解析する方法

セキュリティツール

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 は、これらの一般的なハッシュ形式を自動的に検出し、ユーザー名(通常は uidcn 属性)と関連付けて、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ファイルは機密情報(ユーザー名やパスワードハッシュ)を含む可能性があるため、取り扱いには十分注意し、適切な権限管理を行ってください。

実行例

例として、以下のような内容の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ファイルから抽出されたユーザー識別子(通常は uidcn)。コロン (:) でハッシュ本体と区切られます。
  • $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

    使い方、オプション、対応フォーマットなど、より詳細な情報が記載されています。

コメント

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