現代の複雑なIT環境において、システムのセキュリティを維持することは極めて重要です。特に、基幹業務システムであるSAPシステムは、企業の機密情報や業務プロセスの中核を担っており、そのセキュリティ確保は最優先課題の一つです。 パスワードは依然として多くのシステムで主要な認証手段であり、その強度を定期的に評価することは、不正アクセスを防ぐ上で不可欠です。 この記事では、パスワードクラッキングツール「John the Ripper (JtR)」のスイートに含まれるユーティリティの一つ、sap2johnに焦点を当て、その機能と使用方法について詳しく解説します。
John the Ripper と *2john ツールについて
John the Ripper(通称JohnまたはJtR)は、非常に有名で強力なオープンソースのパスワードクラッキングツールです。1996年に最初のバージョンがリリースされて以来、多くのプラットフォームに移植され、様々なハッシュ形式に対応するように拡張されてきました。JtRの主な目的は、システム内に存在する弱いパスワードを検出し、セキュリティ管理者が対策を講じることを支援することです。
JtRは、様々なアプリケーションやシステムから得られるパスワードハッシュを直接扱えるわけではありません。多くの場合、特定のフォーマットに変換する必要があります。この変換を行うために、JtRスイートには*2john(アスタリスク・トゥ・ジョン)と呼ばれる一連のユーティリティスクリプトやプログラムが含まれています。例えば、zip2johnはZIPファイルのパスワードハッシュを、rar2johnはRARファイルのパスワードハッシュを、そして今回解説するsap2johnはSAPシステムのパスワードハッシュをJtRが解析可能な形式に変換します。
sap2john とは?
sap2john(多くの場合、Perlスクリプト sap2john.pl として提供されます)は、SAPシステムから抽出されたユーザーアカウント情報(特にパスワードハッシュ)を、John the Ripperが処理できる形式に変換するためのツールです。SAPシステムでは、ユーザーのパスワードは平文ではなく、ハッシュ化された形式でデータベーステーブルに保存されています。sap2johnは、これらのハッシュ情報を含むファイルを読み込み、JtRに適した形式で標準出力に出力します。
SAPのパスワードハッシュ形式
SAPシステムは、歴史的にいくつかの異なるパスワードハッシュアルゴリズムを使用してきました。これらのアルゴリズムは「Code Version (CODVN)」として識別されます。sap2johnとJohn the Ripperが主に対応しているのは以下のものです。
| Code Version (CODVN) | ハッシュアルゴリズム | 格納テーブル/フィールド | 特徴 | JtR フォーマット名 (例) | 備考 |
|---|---|---|---|---|---|
| B | MD5ベース | USR02 / BCODE | 8文字、大文字のみ、ASCII。古い形式で脆弱。 | sapb | 2014年頃には広く使われていたが、現在は非推奨。Hashcatなどのツールで比較的短時間でクラック可能。 |
| F | SHA-1ベース | USR02 / PASSCODE | 40文字、大文字小文字区別、UTF-8。Bより強力。 | – | NetWeaver 6.40以降で導入。 |
| G | F + B | USR02 / PASSCODE, BCODE | F形式とB形式の両方のハッシュを生成・格納。 | sapg (PASSCODE部分) | 互換性のために複数のハッシュを保持。 |
| H | 反復ソルト付きSHA-1 | USR02 / PWDSALTEDHASH | ランダムなソルトを使用し、複数回の反復計算を行う。現在最も強力な形式。 | – | NetWeaver 7.02以降で導入。プロファイルパラメータ login/password_hash_algorithm で設定。 |
| I | H + F + B | USR02 / PWDSALTEDHASH, PASSCODE, BCODE | H, F, Bの3つの形式のハッシュを生成・格納。 | – | 最大の互換性を提供。 |
※ CODVN A, D, Eなども存在しますが、AとDは廃止されており、JtRでは通常サポートされていません。 ※ JtRのフォーマット名はバージョンや実装によって異なる場合があります。john --list=formatsで確認できます。
sap2johnは、これらの異なる形式のハッシュデータを含む入力ファイルから、JtRが解釈できる形式(通常は ユーザー名:<スペースパディング>$ハッシュ値 や、H形式の場合はハッシュ値のみなど)を生成します。
互換性のための古いハッシュ
SAP NetWeaver 7.02以降では、下位互換性のために、新しい強力なハッシュ(例:H形式)と同時に、古い弱いハッシュ(例:B形式、F形式)も生成・保存する設定がデフォルトでした(CODVN GやI)。これは、古いシステムやコンポーネントとの連携を維持するためでしたが、セキュリティ上のリスクとなります。プロファイルパラメータ login/password_downwards_compatibility を 0 に設定し、クリーンアッププログラム CLEANUP_PASSWORD_HASH_VALUES(または改良版のZCLEANUP_PASSWORD_HASH_VALUESX)を実行することで、これらの古いハッシュを削除することが強く推奨されています。2014年頃と比較して、多くの企業でこの対策が進んでいます。
前提条件
sap2john を使用するには、以下の準備が必要です。
- John the Ripper のインストール:
sap2johnは JtR の一部として提供されることが多いため、まず JtR をインストールする必要があります。多くの Linux ディストリビューションではパッケージマネージャー(例:sudo apt install johnやsudo yum install john)でインストールできます。最新版や特定機能(Jumbo バージョンなど)が必要な場合は、Openwall の John the Ripper 公式サイトからソースコードやバイナリをダウンロードしてコンパイルまたはインストールします。Jumbo バージョンはより多くのハッシュ形式に対応しており、sap2john.plスクリプトも含まれていることが一般的です。 - SAP ユーザーハッシュデータの入手: これが最も重要かつ慎重に行うべきステップです。SAPシステムのパスワードハッシュは、主にデータベーステーブル
USR02に格納されています(過去のハッシュはUSH02やUSRPWDHISTORYにも存在する場合があります)。USR02テーブルには、ユーザー名 (BNAME)、パスワードハッシュアルゴリズムを示すコード (CODVN)、そして実際のハッシュ値 (BCODE,PASSCODE,PWDSALTEDHASH) などが含まれています。- このデータを入手するには、通常、SAPデータベースへの直接アクセス権限(SQL実行など)または、SAP GUIのトランザクション(例:
SE16,SE11)を使用してテーブル内容をエクスポート(スプレッドシート形式など)する権限が必要です。 - エクスポートする際は、フィールド名を列見出しとして出力するように設定してください(フィールド記述ではなく)。
sap2johnが必要とする主なフィールドは、BNAME(ユーザー名、ソルトとして使われる場合がある)、BCODE、PASSCODE、PWDSALTEDHASH、そして可能であればCODVNです。
- Perl インタープリタ (sap2john.pl の場合):
sap2john.plを使用する場合、Perl がシステムにインストールされている必要があります。多くの Linux システムにはデフォルトでインストールされています。
sap2john の使い方
sap2john(ここでは sap2john.pl を例とします)の基本的な使い方はシンプルです。
基本的なコマンド構文
./sap2john.pl <入力ファイル> [オプションのハッシュタイプ] > <出力ファイル><入力ファイル>: SAPからエクスポートした、ユーザーハッシュ情報を含むファイル(例: スプレッドシートをCSV形式で保存したもの)。ファイル名の代わりに-を指定すると、標準入力からデータを読み込みます。[オプションのハッシュタイプ]: (省略可能) 出力したいSAPハッシュの Code Version (A, B, D, E, F, H) を指定します。- 省略した場合、デフォルトでは CODVN F と CODVN H のすべてのハッシュ、および CODVN B と見なされるすべてのハッシュ(CODVN列がない場合や空の場合も含む)が出力されます。JtR はこれらの混合形式を区別できるため、通常は問題ありません。
- 特定の形式(例: B形式のみ)を解析したい場合に指定します。
> <出力ファイル>: JtR が読み込むことができる形式に変換されたハッシュデータを保存するファイル名を指定します。
入力ファイルの準備
前述の通り、SAPトランザクション SE16 などを使って USR02 テーブル(または関連テーブル)の内容をエクスポートします。ファイル形式は、sap2john.pl が解釈できる形式である必要があります。多くの場合、タブ区切りやCSV形式が使われます。重要なのは、最初の行にフィールド名(BNAME, BCODE, PASSCODE, PWDSALTEDHASH, CODVNなど)が含まれていることです。
例として、以下のような内容のCSVファイル (usr02_export.csv) を準備したとします。
MANDT,BNAME,CODVN,BCODE,PASSCODE,PWDSALTEDHASH,...
"100","DDIC","G","CADD1E9A0C1F855E","ABCDEF0123456789ABCDEF0123456789ABCDEF01",,...
"100","SAP*","I","A9B3F5E2G8H1I0K7","FEDCBA9876543210FEDCBA9876543210FEDCBA98","$v1$40000$...abc...",...
"100","TESTUSER","H","","","$v1$40000$...xyz...",...
"100","OLDUSER","B","BEEFCAFE12345678","",,...
"100","NOCODVN","","DEADBEEF87654321","",,...(注意: 上記のハッシュ値はダミーです。)
実行例
上記の usr02_export.csv を入力として、デフォルトの形式(F, H, B)でハッシュを抽出し、sap_hashes.txt に保存するコマンドは以下のようになります。
./sap2john.pl usr02_export.csv > sap_hashes.txtもし、CODVN B のハッシュのみを抽出したい場合は、次のようにします。
./sap2john.pl usr02_export.csv B > sap_b_hashes.txt出力形式
sap2john が生成する出力ファイル (sap_hashes.txt) の内容は、JtR が認識できる特定の形式になります。これはJtRのバージョンや対象のハッシュタイプによって若干異なりますが、一般的には以下のようになります。
- CODVN B, D, F など (ソルトとしてユーザー名を使用):
USERNAME<スペースで40文字までパディング>$HASHVALUE(近年のJtRバージョンでは、40文字へのスペースパディングが不要な場合もあります)
例 (CODVN B):
例 (CODVN F from G):OLDUSER $BEEFCAFE12345678 NOCODVN $DEADBEEF87654321
例 (CODVN F from I):DDIC $ABCDEF0123456789ABCDEF0123456789ABCDEF01SAP* $FEDCBA9876543210FEDCBA9876543210FEDCBA98 - CODVN H (ソルト付きハッシュ): ハッシュ値自体にソルト情報などが含まれているため、ユーザー名は不要な場合があります。
$v1$40000$...abc... $v1$40000$...xyz...
実際の出力は、使用する sap2john スクリプトと JtR のバージョンに依存します。
John the Ripper でのクラック実行
sap2john でハッシュファイル (sap_hashes.txt など) を準備したら、いよいよ John the Ripper を使ってパスワードクラックを試みます。
基本的な実行コマンド
john <ハッシュファイル>例:
john sap_hashes.txtこのコマンドを実行すると、JtR はデフォルトのモード(通常はシングルクラックモード、辞書モード、インクリメンタルモードの順)でクラックを開始します。JtR はファイル内のハッシュ形式を自動検出しようとします。
よく使われるオプション
--wordlist=<辞書ファイル>: パスワードの候補リスト(辞書ファイル)を指定して、辞書攻撃を行います。強力な辞書を使うほど、成功率が高まります。john --wordlist=/path/to/password.lst sap_hashes.txt--rules: 辞書攻撃と組み合わせて使用し、辞書内の単語に様々な変換ルール(大文字小文字変換、数字や記号の追加など)を適用して、より多くのパスワード候補を試します。john --wordlist=/path/to/password.lst --rules sap_hashes.txt--format=<フォーマット名>: JtR がハッシュ形式を自動検出できない場合や、特定の形式のみを対象にしたい場合に、ハッシュ形式を明示的に指定します。SAP関連のフォーマット名にはsapb,sapgなどがあります(john --list=formatsで確認)。# CODVN B (BCODE) のみを対象とする場合 john --format=sapb sap_b_hashes.txt--show: 既にクラックに成功したパスワードを表示します。結果は通常$JOHN/john.potファイルに保存されています。john --show sap_hashes.txt--restore[=<セッション名>]: 中断したクラックセッションを再開します。john --restore
クラック結果
クラックに成功すると、JtR は通常以下のような形式で結果を表示します。
CrackedPassword (Username) 結果は $JOHN/john.pot ファイルに蓄積されていきます。このファイルは、ユーザー名とクラックされたパスワードのペアを記録しており、次回の実行時に同じハッシュを再度クラックしないようにするために使用されます。
注意点とベストプラクティス
- 権限の確認: 何度も強調しますが、必ずテスト対象システムの所有者から書面による明確な許可を得てから実施してください。
- データソースの保護:
USR02テーブルからエクスポートしたデータは非常に機密性が高い情報です。安全な場所に保管し、不要になったら確実に削除してください。 - 古いハッシュのリスク認識: CODVN Bのような古いハッシュ形式は非常に脆弱です。システム内に残存している場合は、早急に無効化(
login/password_downwards_compatibility = 0)し、クリーンアッププログラムを実行してください。古いハッシュがクラックされると、たとえそれが直接ログインに使えなくても、実際のパスワードを推測する手がかりになる可能性があります(例:CODVN Bで”PASSWORD”とクラックされた場合、実際のパスワードが”Password1234″である可能性を示唆するなど)。 - 強力なパスワードポリシーの施行: パスワードクラックツールによる監査は、あくまで現状のリスクを評価する手段です。根本的な対策として、長く複雑なパスワードの使用を強制し、定期的な変更を促すなど、強力なパスワードポリシーを施行することが不可欠です。SAPのセキュリティポリシー機能(トランザクション
SECPOL)などを活用しましょう。 - 多要素認証 (MFA) の導入: パスワードだけに頼らない認証方式として、多要素認証の導入を検討してください。
- アクセス制御の強化:
USR02やUSH02などのテーブルへのアクセス権限は、必要最小限の管理者に限定してください。SAP標準の権限グループSPWDを利用することも有効です。 - ツールのアップデート: John the Ripper や
sap2johnは継続的に開発されています。最新のハッシュ形式への対応やバグ修正のために、定期的にツールをアップデートすることをお勧めします。
まとめ
sap2john は、John the Ripper スイートの一部として、SAPシステムのパスワードセキュリティ監査において重要な役割を果たすツールです。SAPシステムから抽出したパスワードハッシュデータを JtR が解析可能な形式に変換することで、組織内の弱いパスワードを特定し、セキュリティリスクを評価するのに役立ちます。
しかし、その使用には大きな責任が伴います。必ず適切な権限の下で倫理的に使用し、検出された脆弱性に対しては、パスワードポリシーの強化、古いハッシュ形式の排除、多要素認証の導入といった具体的な対策を講じることが重要です。sap2john と John the Ripper を正しく活用し、SAPシステムのセキュリティ維持に役立ててください。