現代のデジタル社会において、パスワード認証はその脆弱性から多くの問題を引き起こしています。これに対処するため、パスワードレス認証技術が注目されており、その代表的な規格の一つが FIDO Alliance によって策定された Universal Authentication Framework (UAF) です。
しかし、セキュリティ監査やインシデント対応の現場では、時にこれらの新しい認証フレームワークに関連するデータを解析する必要が生じることがあります。ここで登場するのが、強力なパスワードクラッキングツールである John the Ripper (JtR) スイートに含まれる uaf2john
というツールです。
このブログ記事では、uaf2john
がどのようなツールであり、どのように使用するのか、そしてその背景にある UAF 技術について、詳しく解説していきます。セキュリティ専門家や、認証技術に関心のある方々にとって、有益な情報となることを目指します。
第1章: uaf2john とは何か?
uaf2john
は、オープンソースのパスワードクラッキングツールスイートである John the Ripper (JtR) の一部として提供されるユーティリティスクリプト(またはプログラム)の一つです。 JtR は、非常に多くの種類のパスワードハッシュや認証データフォーマットに対応しており、システム管理者が弱いパスワードを発見したり、ペネトレーションテスターがシステムのセキュリティ強度を評価したりする際に広く利用されています。
JtR スイートには、様々な形式のデータファイルからパスワードハッシュや解析可能な認証情報を抽出し、JtR 本体が処理できる形式に変換するための多数の *2john
ツールが含まれています。例えば、以下のようなものがあります。
zip2john
: ZIP アーカイブファイルからパスワードハッシュを抽出rar2john
: RAR アーカイブファイルからパスワードハッシュを抽出pdf2john
: PDF ファイルからパスワードハッシュを抽出ssh2john
: SSH 秘密鍵からパスフレーズハッシュを抽出keepass2john
: KeePass パスワードデータベースからマスターパスワードハッシュを抽出
uaf2john
もこれらのツールの一つであり、その名前が示す通り、Universal Authentication Framework (UAF) に関連するデータから、John the Ripper が解析可能な形式の情報を抽出することを目的としています。
uaf2john
の主な役割は以下の通りです。
- 特定の UAF 実装に関連するデータファイル(例:キーストア、設定ファイル、データベースダンプなど)を読み込む。
- そのデータの中から、暗号化されたキーやハッシュ化された認証情報など、解析対象となりうる情報を特定する。
- 特定した情報を、John the Ripper が認識できる特定のハッシュフォーマット(例:
$uaf$...
のような形式)に変換する。 - 変換したハッシュ情報を標準出力に出力する。
これにより、セキュリティ専門家は、取得した UAF 関連データに含まれる潜在的な脆弱性(弱いキー、設定ミスなど)を John the Ripper を用いて調査・分析することが可能になります。
第2章: uaf2john の入手とインストール
uaf2john
は単体のツールとして配布されているわけではなく、John the Ripper の一部として提供されています。特に、多くの追加機能やフォーマット対応が含まれる John the Ripper “Jumbo” バージョンに含まれていることが一般的です。
したがって、uaf2john
を利用するには、まず John the Ripper (Jumbo) をインストールする必要があります。インストール方法はいくつかあります。
1. パッケージマネージャーを利用する (Linux)
多くの Linux ディストリビューションでは、パッケージマネージャーを通じて John the Ripper を簡単にインストールできます。特に、Kali Linux や Parrot OS などのペネトレーションテスト用ディストリビューションには、Jumbo バージョンがデフォルトで含まれていることが多いです。
Debian/Ubuntu ベースのシステムの場合:
sudo apt update
sudo apt install john
Fedora/CentOS/RHEL ベースのシステムの場合:
sudo dnf install john
ただし、ディストリビューションのリポジトリに含まれるバージョンが最新でない場合や、Jumbo バージョンでない場合もあります。その場合は、ソースからビルドする方法を検討してください。
2. ソースコードからビルドする
最新版の John the Ripper (Jumbo) を利用したい場合や、特定の機能が必要な場合は、GitHub リポジトリからソースコードを取得してビルドするのが確実です。
-
依存関係のインストール: ビルドに必要な開発ツールやライブラリ(例: `build-essential`, `libssl-dev`, `yasm`, `libgmp-dev`, `libpcap-dev` など)をインストールします。必要なパッケージは OS によって異なります。
# Debian/Ubuntu の例 sudo apt update sudo apt install build-essential libssl-dev git zlib1g-dev libgmp-dev yasm libpcap-dev pkg-config libbz2-dev
-
ソースコードの取得: GitHub から最新の Jumbo バージョンのソースコードをクローンします。
git clone https://github.com/openwall/john -b bleeding-jumbo john
-
ビルド: ソースディレクトリに移動し、コンパイルします。
cd john/src/ ./configure make -s clean && make -sj$(nproc)
$(nproc)
は CPU コア数を自動的に取得し、並列ビルドを行います。
ビルドが成功すると、john/run/
ディレクトリ内に john
実行ファイル本体と、uaf2john
を含む多数の *2john
スクリプトやプログラムが生成されます。
3. その他の方法
- 公式バイナリ: Openwall のウェブサイトで、特定の OS 向けのコンパイル済みバイナリが提供されている場合があります。
- Docker イメージ: Docker Hub などで、John the Ripper がプリインストールされたコンテナイメージが公開されていることがあります。
- Snap パッケージ: Ubuntu などでは Snap パッケージとしても提供されています。
uaf2john スクリプトの場所
John the Ripper をインストールまたはビルドした後、uaf2john
スクリプト(通常は Python スクリプトまたは C プログラムとして実装されています)は、John the Ripper の実行ファイルと同じディレクトリ、またはその近辺(典型的には run
ディレクトリ)に配置されます。
# John the Ripper の run ディレクトリに移動 (ソースからビルドした場合の例)
cd john/run/
# uaf2john が存在するか確認
ls *uaf2john*
もし Python スクリプト(例: `uaf2john.py`)であれば、実行には Python 3 が必要になる場合があります。 C プログラム(例: `uaf2john`)の場合は、ビルドプロセス中にコンパイルされているはずです。 GitHub 上のソースコードを見ると、C 言語で書かれた `uaf2john.c` が存在しますが、これは OpenVMS の SYSUAF ファイルを処理するためのもので、FIDO UAF を直接ターゲットとしたものではない可能性が高いです。 ペネトレーションテスト用ディストリビューション (Kali Linux など) に含まれる `uaf2john` は Python スクリプトである可能性があり、特定の UAF サーバー実装 (Nok Nok Labs など) のデータを処理することを意図している場合があります。使用する `uaf2john` の実装を確認することが重要です。
第3章: uaf2john の基本的な使い方
uaf2john
の基本的な使い方は、他の *2john
ツールと同様に、入力となる UAF 関連データファイルを指定し、変換されたハッシュ形式のデータを標準出力に出力させる、というものです。出力されたデータは、ファイルにリダイレクトして保存し、その後 John the Ripper 本体で解析します。
基本的なコマンド構文
uaf2john
が Python スクリプト (uaf2john.py
) として提供されている場合、一般的には以下のような構文になります。
# uaf2john が Python スクリプトの場合
python /path/to/john/run/uaf2john.py [UAFデータファイル] > [出力ハッシュファイル]
# uaf2john が実行可能ファイルの場合
/path/to/john/run/uaf2john [UAFデータファイル] > [出力ハッシュファイル]
/path/to/john/run/
: John the Ripper のrun
ディレクトリへのパスを指定します。環境変数PATH
に追加されていれば、単にuaf2john.py
やuaf2john
と入力できる場合もあります。[UAFデータファイル]
: 解析対象の UAF 関連データファイルへのパスを指定します。このファイル形式はuaf2john
の実装に依存します。>
: 標準出力をファイルにリダイレクトします。[出力ハッシュファイル]
: 変換されたハッシュデータを保存するファイル名を指定します(例:uaf_hashes.txt
)。
入力ファイル形式について
uaf2john
がどのような形式の UAF データファイルを想定しているかは、そのスクリプトの実装によります。前述の通り、UAF はパスワードレス認証のフレームワークであり、標準化された「パスワードハッシュファイル」のようなものは通常存在しません。
考えられる入力ファイルの例としては、以下のようなものが挙げられます(ただし、これらはあくまで可能性であり、特定の uaf2john
実装が対応している保証はありません)。
- 特定の UAF サーバーソフトウェア(例: Nok Nok Labs S3 Authentication Suite)のキーストアファイルや設定ファイル。
- サーバーからエクスポートされたユーザー登録情報や認証器情報のダンプデータ。
- データベースから抽出された UAF 関連テーブルのデータ。
- フォレンジック調査で取得されたデバイス上の UAF クライアント関連データ。
残念ながら、公開されている情報だけでは、汎用的な UAF データ形式や、uaf2john
が具体的にどの UAF 実装のどのファイルをターゲットにしているかを特定するのは困難です。多くの場合、特定の脆弱性調査やペネトレーションテストの文脈で開発・使用されるツールであると考えられます。
出力形式について
uaf2john
が出力するデータは、John the Ripper が解析できるハッシュ形式になります。これは通常、特定のプレフィックス(例: $uaf$
や、対象ソフトウェア名を示すプレフィックス)で始まり、ハッシュ値、ソルト、その他解析に必要な情報が特定の区切り文字で連結された文字列です。
例(架空の形式):
$uaf$1$salt1234$hashvalueABCDEF1234567890
この正確な形式も uaf2john
の実装と、対応する John the Ripper のフォーマット定義 (uaf_fmt_plug.c
のようなファイル) によって決まります。
簡単な実行例
仮に、/data/noknok_keystore.db
というファイルがあり、これを処理できる uaf2john.py
が /opt/john/run/
にあるとします。
# Python スクリプトを実行し、出力を uaf_hashes.txt に保存
python /opt/john/run/uaf2john.py /data/noknok_keystore.db > uaf_hashes.txt
# 出力ファイルの内容を確認 (例)
cat uaf_hashes.txt
# user1:$uaf$0$salt[...] $hash[...]
# user2:$uaf$0$salt[...] $hash[...]
# ...
これで、John the Ripper で解析するための準備が整いました。次のステップは、John the Ripper 本体を使ってこの uaf_hashes.txt
ファイルを処理することです。
# John the Ripper を実行してハッシュ解析を開始
/opt/john/run/john uaf_hashes.txt
John the Ripper は、ファイル内のハッシュ形式を自動的に検出しようとします。もし自動検出がうまくいかない場合や、特定のフォーマットを指定したい場合は、--format=
オプションを使用します。
# フォーマット名を明示的に指定する場合 (フォーマット名は仮)
/opt/john/run/john --format=uaf uaf_hashes.txt
# 利用可能なフォーマットを確認
/opt/john/run/john --list=formats | grep -i uaf
uaf
というフォーマット名が存在するか、あるいは特定のベンダー名 (例: noknok
) を含むフォーマット名が存在するかを確認する必要があります。
第4章: UAF とは何か?もう少し詳しく
uaf2john
を理解するためには、そのターゲットである Universal Authentication Framework (UAF) について知ることが不可欠です。UAF は、パスワードへの依存を減らし、より安全で使いやすい認証方法を提供するために、FIDO (Fast IDentity Online) Alliance によって策定された技術仕様の一つです。FIDO Alliance は、Google, Microsoft, Apple, PayPal, Nok Nok Labs など、多くの大手テクノロジー企業が参加する業界団体です。
FIDO Alliance の認証仕様
FIDO Alliance は、主に以下の認証プロトコル仕様を策定・推進しています。
- FIDO UAF (Universal Authentication Framework): パスワードレス認証を実現するためのフレームワーク。ユーザーはデバイス上のローカル認証(生体認証、PIN など)を行うことで、オンラインサービスにログインできます。
- FIDO U2F (Universal 2nd Factor): 強力な第二要素認証を提供します。既存のパスワード認証に加えて、物理的なセキュリティキー(USB, NFC, Bluetooth)をタッチするなどの操作で認証を強化します。U2F は後に CTAP1 として FIDO2 に統合されました。
- FIDO2 (WebAuthn と CTAP): 最新の仕様セットで、ウェブブラウザ (WebAuthn API) と外部認証器 (CTAP) を連携させ、パスワードレス認証と多要素認証の両方を実現します。パスキー (Passkeys) は FIDO2 をベースにした認証情報です。
UAF は、これらの仕様の中で最初に登場したパスワードレス認証の試みの一つです。
UAF の仕組みの概要
UAF の認証プロセスは、公開鍵暗号方式に基づいています。基本的な流れは以下の通りです。
-
ユーザー登録 (Registration):
- ユーザーが UAF 対応のサービスにデバイスを登録しようとします。
- サービス (Relying Party, RP) 側は、受け入れ可能な認証方法(指紋、顔認証、PIN など)のポリシーをデバイス (FIDO UAF Client) に送ります。
- ユーザーはデバイス上で許可されたローカル認証方法(例: 指紋認証)を実行します。
- デバイス内の FIDO UAF Authenticator は、新しい公開鍵と秘密鍵のペアを生成します。秘密鍵はデバイス内の安全な領域(例: TEE, Secure Element)に保管され、デバイス外部には出ません。
- 生成された公開鍵と、Authenticator の信頼性を証明する情報(Attestation)がサービス側に送られ、ユーザーアカウントと紐付けて登録されます。
-
ユーザー認証 (Authentication):
- ユーザーがサービスにログインしようとします。
- サービス側は、認証要求(チャレンジと呼ばれるランダムなデータを含む)をデバイスに送ります。
- ユーザーはデバイス上で登録時と同じローカル認証方法(例: 指紋認証)を実行します。
- 認証が成功すると、デバイス内の Authenticator は保管されている秘密鍵を使って、サービスから送られてきたチャレンジに署名します。
- 署名されたチャレンジと関連情報がサービス側に送られます。
- サービス側は、登録済みの公開鍵を使って署名を検証します。検証が成功すれば、ユーザーは認証されたとみなされ、ログインが許可されます。
この仕組みにより、ユーザーはパスワードを覚える必要がなく、サービス側もパスワードを保管する必要がなくなります。また、秘密鍵がデバイスから出ないため、フィッシング攻撃に対しても高い耐性を持ちます。
UAF データに含まれる情報
UAF の実装において、サーバー側やクライアント側で保持される可能性のあるデータには以下のようなものが考えられます。
- ユーザーアカウント情報
- 登録された公開鍵
- Authenticator の Attestation 証明書やメタデータ
- 認証ポリシー設定
- (サーバー実装によっては)キー管理のための暗号化されたデータや内部的な認証情報
uaf2john
は、これらのデータの中に含まれる、何らかの理由で「クラック」の対象となりうる情報(例えば、暗号化キーの保護に使われるパスフレーズのハッシュ、設定ミスにより弱い形式で保存された内部クレデンシャルなど)を抽出することを目的としていると考えられます。
第5章: uaf2john の応用と注意点
uaf2john
を使って UAF 関連データからハッシュ情報を抽出できた場合、その後の解析は John the Ripper の豊富な機能を活用して行います。しかし、その利用にあたってはいくつかの注意点があります。
John the Ripper での解析
uaf2john
で生成したハッシュファイル(例: uaf_hashes.txt
)は、John the Ripper 本体で解析します。JtR は様々な攻撃モードをサポートしています。
-
Single Crack モード (
--single
): ハッシュファイルに含まれるユーザー名や GECOS 情報などを元に、よく使われる変形ルールを適用してパスワードを推測します。最初に試す価値のある高速なモードです。john --single uaf_hashes.txt
-
Wordlist モード (
--wordlist
): 指定した辞書ファイルに含まれる単語をパスワード候補として試します。強力な辞書とルールセット(--rules
)を組み合わせることで、効果的な攻撃が可能です。# デフォルト辞書を使用 john --wordlist=/usr/share/john/password.lst uaf_hashes.txt # 特定のルールセットを適用 john --wordlist=mydictionary.txt --rules=KoreLogic uaf_hashes.txt
-
Incremental モード (
--incremental
): 定義された文字セット(例: 数字のみ、英小文字のみ、全 ASCII 文字など)に基づいて、総当たり攻撃(ブルートフォースアタック)を行います。非常に時間がかかる可能性があります。john --incremental=Digits uaf_hashes.txt
-
Mask モード (
--mask
): パスワードのパターン(例: 大文字1文字 + 小文字5文字 + 数字2文字)を指定して総当たり攻撃を行います。Incremental モードより効率的な場合があります。john --mask='?u?l?l?l?l?d?d' uaf_hashes.txt
John the Ripper は、クラックに成功したパスワード(またはキー)を john.pot
というファイルに記録します。クラック結果は以下のコマンドで確認できます。
john --show uaf_hashes.txt
セッションを中断・再開することも可能です。
# セッションを中断 (Ctrl+C)
# セッションを再開
john --restore
複数のファイルの処理
複数の UAF データファイルを処理する必要がある場合は、シェルのループ機能などを使って自動化できます。
#!/bin/bash
JOHN_RUN_DIR="/opt/john/run"
UAF_DATA_DIR="/path/to/uaf/data"
OUTPUT_FILE="all_uaf_hashes.txt"
# 出力ファイルを初期化
> "${OUTPUT_FILE}"
# UAFデータディレクトリ内の全ファイルを処理
for datafile in "${UAF_DATA_DIR}"/*; do
if [ -f "${datafile}" ]; then
echo "Processing ${datafile}..."
# uaf2john を実行し、結果を追記
python "${JOHN_RUN_DIR}/uaf2john.py" "${datafile}" >> "${OUTPUT_FILE}"
fi
done
echo "Processing complete. Hashes saved to ${OUTPUT_FILE}"
# John the Ripper で解析開始
"${JOHN_RUN_DIR}/john" "${OUTPUT_FILE}"
注意点
- 法的・倫理的側面: パスワードクラッキングツールは、正当な権限を持つシステムやデータに対してのみ使用されるべきです。許可なく他者のシステムやデータにアクセスし、解析することは違法行為であり、重大な結果を招く可能性があります。常に法律と倫理規定を遵守してください。
-
UAF 実装の多様性: UAF はフレームワークであり、具体的な実装はベンダーやサービスによって異なります。特定の
uaf2john
スクリプトが、ある実装のデータ形式に対応していても、別の実装には対応していない可能性が高いです。対象とするデータの正確な性質を理解することが重要です。 -
解析対象の性質:
uaf2john
が抽出するのは、必ずしもユーザーが直接入力するパスワードや PIN とは限りません。内部的なキー、設定パラメータ、暗号化されたデータ片などである可能性があります。その情報がクラックされたとしても、それが直ちにアカウント侵害につながるかどうかは状況によります。 -
パスワードレスの限界: UAF はパスワードレス認証を推進しますが、完全にパスワードを排除できないケース(アカウント回復、一部の管理操作など)や、実装上の不備が存在する可能性はあります。しかし、UAF が適切に実装・運用されていれば、
uaf2john
で解析可能な有用な情報が抽出できる機会は限定的かもしれません。 -
ツールの限界:
uaf2john
や John the Ripper が、すべての UAF 関連データや暗号化方式に対応しているわけではありません。未知のフォーマットや新しい暗号アルゴリズムには対応できない場合があります。
第6章: まとめ
uaf2john
は、John the Ripper スイートに含まれる多数の *2john
ユーティリティの一つであり、Universal Authentication Framework (UAF) に関連するデータから、John the Ripper が解析できる形式の情報を抽出するために設計されたツールです。
UAF 自体は、生体認証や PIN などのローカル認証と公開鍵暗号を用いて、パスワードレス認証を実現するための FIDO Alliance による標準仕様です。そのため、uaf2john
が従来のパスワードハッシュを抽出する場面は限定的であり、特定の UAF サーバー実装(例:Nok Nok Labs)のキーストアや内部データ、設定ファイルなどを対象としている可能性が高いと考えられます。
このツールを使用するには、まず John the Ripper (Jumbo) をインストールし、run
ディレクトリにある uaf2john
スクリプト(またはプログラム)を見つけます。基本的な使い方は、解析対象の UAF 関連データファイルを引数として与え、標準出力をファイルにリダイレクトしてハッシュ情報を保存します。その後、John the Ripper 本体を使って、保存したハッシュファイルの解析を試みます。
uaf2john
は、セキュリティ監査、ペネトレーションテスト、インシデントレスポンスなどの特定の状況において、UAF 実装のセキュリティ強度を評価したり、潜在的な脆弱性を調査したりする際に役立つ可能性があります。しかし、その利用は常に法的・倫理的な範囲内に留めなければなりません。また、UAF 実装の多様性や、ツール自体の対応範囲の限界も理解しておく必要があります。
パスワードレス認証技術が普及する中でも、その実装の詳細や関連データのセキュリティを評価するためのツールは、セキュリティ専門家にとって依然として重要です。uaf2john
は、そうした評価の一助となる可能性を秘めたツールと言えるでしょう。
参考情報
- John the Ripper official website: https://www.openwall.com/john/
- FIDO Alliance website: https://fidoalliance.org/
- FIDO UAF Overview: https://fidoalliance.org/specifications/overview/