John the Ripper スイートの一部である office2john を使用して、保護された Office ドキュメントからパスワードハッシュを抽出し、解析する手順を詳しく解説します。
はじめに: office2john とは? 🤔
office2john
(または office2john.py
) は、有名なパスワードクラッキングツール John the Ripper (JtR) スイートに含まれるユーティリティスクリプトです。その主な目的は、パスワードで保護された Microsoft Office ドキュメント (Word, Excel, PowerPoint など) からパスワードハッシュ情報を抽出することです。抽出されたハッシュは、John the Ripper が解読できる形式になっており、これを利用して元のパスワードの回復を試みることができます。
ファイルを紛失したり、パスワードを忘れてしまったりした場合に、重要なドキュメントへのアクセスを取り戻すための強力なツールとなり得ます。ただし、このツールを使用する際は、自身が所有している、またはアクセス許可を得ているファイルに対してのみ使用するようにしてください。不正アクセスは法律で禁止されています 🚫。
John the Ripper と office2john の準備 ⚙️
office2john
を使用するには、まず John the Ripper をシステムにインストールする必要があります。JtR は多くの Linux ディストリビューションのパッケージマネージャを通じてインストールできますし、公式サイトからソースコードやビルド済みバイナリを入手することも可能です。
Linux (Debian/Ubuntu) でのインストール例:
sudo apt update
sudo apt install john -y
Linux (Fedora/CentOS/RHEL) でのインストール例:
sudo dnf update
sudo dnf install john -y
あるいは、John the Ripper Jumbo Community-enhanced version をダウンロードして手動でビルドすることも推奨されます。Jumbo バージョンはより多くのフォーマットや最適化が含まれています。
# 例: ソースからビルドする場合
wget https://www.openwall.com/john/john-1.9.0-jumbo-1.tar.gz
tar -xzvf john-1.9.0-jumbo-1.tar.gz
cd john-1.9.0-jumbo-1/src/
./configure && make -s clean && make -sj4
# ビルド後、実行ファイルは ../run/ ディレクトリにあります
JtR をインストールすると、通常 office2john
スクリプト (多くの場合 office2john.py
) は JtR の実行ファイルが含まれるディレクトリ (上記のビルド例では ../run/
) に配置されます。システムによっては /usr/bin/
や /usr/share/john/
などに配置されることもあります。見つからない場合は、find
コマンドなどで探してみてください。
# JtR のインストールディレクトリを探す (例)
find /usr -name office2john.py 2>/dev/null
# またはビルドしたディレクトリ内で探す
# cd john-1.9.0-jumbo-1/run/
# ls office2john*
office2john.py
は Python スクリプトなので、実行には Python (通常は Python 3) が必要です。
office2john の基本的な使い方 🧑💻
office2john
の基本的な構文は非常にシンプルです。
python /path/to/office2john.py [対象のOfficeファイル]
または、スクリプトに実行権限が付与されていれば、直接実行できる場合もあります。
/path/to/office2john.py [対象のOfficeファイル]
このコマンドを実行すると、指定された Office ファイルからパスワードハッシュ情報が抽出され、標準出力に表示されます。この出力は John the Ripper が解読できる形式になっています。
実行例:
例えば、confidential.docx
というパスワードで保護された Word 文書があるとします。このファイルからハッシュを抽出するには、次のように実行します。
# JtR の run ディレクトリにいると仮定
./office2john.py confidential.docx
成功すると、以下のような形式のハッシュ文字列が出力されます (形式は Office のバージョンや暗号化方式によって異なります)。
confidential.docx:$office$*2010*100000*256*16*...長い16進文字列...
この出力されたハッシュをファイルに保存し、John the Ripper に渡してパスワード解析を開始します。
# ハッシュを hashes.txt ファイルに保存
./office2john.py confidential.docx > hashes.txt
# John the Ripper を使って解析を開始
./john hashes.txt
John the Ripper は、デフォルトのモード (辞書攻撃やインクリメンタルモードなど) で解析を試みます。特定の辞書ファイルを使用したい場合や、特定のルールを適用したい場合は、JtR のオプションを指定します。
# 辞書ファイル 'password.lst' を使用する場合
./john --wordlist=password.lst hashes.txt
# マスクモードを使用する場合 (例: 8文字の小文字英字)
./john --mask='?l?l?l?l?l?l?l?l' hashes.txt
./office2john.py file1.xlsx >> hashes.txt
./office2john.py file2.pptx >> hashes.txt
./john hashes.txt
対応している Office フォーマット 📄
office2john
は、長年にわたって開発が続けられており、多くの Microsoft Office フォーマットと暗号化方式に対応しています。John the Ripper Jumbo バージョンに含まれる office2john.py
は、特に幅広い互換性を持っています。
主に以下の形式に対応していますが、バージョンによって対応状況が異なる場合があります。
ファイル形式 | 拡張子 | Office バージョン (目安) | 備考 |
---|---|---|---|
Microsoft Word 文書 (旧形式) | .doc |
Office 97/2000/XP/2003 | RC4 暗号化が主 |
Microsoft Excel ワークシート (旧形式) | .xls |
Office 97/2000/XP/2003 | RC4 暗号化が主 |
Microsoft PowerPoint プレゼンテーション (旧形式) | .ppt |
Office 97/2000/XP/2003 | RC4 暗号化が主 |
Microsoft Word 文書 (OOXML) | .docx |
Office 2007/2010/2013/2016/2019/Microsoft 365 | AES 暗号化 (128bit/256bit)、SHA-1/SHA-512 など |
Microsoft Excel ワークシート (OOXML) | .xlsx |
Office 2007/2010/2013/2016/2019/Microsoft 365 | AES 暗号化 (128bit/256bit)、SHA-1/SHA-512 など |
Microsoft PowerPoint プレゼンテーション (OOXML) | .pptx |
Office 2007/2010/2013/2016/2019/Microsoft 365 | AES 暗号化 (128bit/256bit)、SHA-1/SHA-512 など |
古い Word/Excel 形式 (暗号化ヘッダ) | .doc , .xls |
Office 95 以前? | 対応は限定的かも |
特に Office 2007 以降で導入された OOXML 形式 (.docx
, .xlsx
, .pptx
) は、より強力な AES 暗号化とハッシュアルゴリズム (SHA-1 や SHA-512 など)、そしてキー導出のための反復回数 (Iteration Count) の増加により、旧形式 (.doc
, .xls
, .ppt
) よりも格段にパスワード解析が困難になっています 💪。
office2john
が特定のファイル形式や暗号化方式に対応しているか不明な場合は、とりあえず実行してみるのが一番です。対応していない場合は、エラーメッセージが表示されるか、ハッシュが出力されません。
高度な使い方と注意点 ✨
古い Office 形式 (97-2003) の扱い
古い .doc
, .xls
, .ppt
ファイル (Office 97-2003 形式) のパスワードハッシュは、現代の基準では比較的弱い RC4 暗号に基づいています。これらのハッシュは、$oldoffice$*...
という形式で出力されることが多いです。
document.doc:$oldoffice$*...
これらの形式は、現代の CPU/GPU を使えば、比較的短時間で解析できる可能性があります。
新しい Office 形式 (2007 以降) の扱い
Office 2007, 2010, 2013, 2016, 2019, Microsoft 365 などで使用される .docx
, .xlsx
, .pptx
ファイルは、より堅牢な暗号化を使用しています。office2john
が抽出するハッシュは、バージョンや設定によって以下のような形式になります。
- Office 2007:
$office$*2007*...
(AES-128, SHA-1, 50,000 回反復) - Office 2010:
$office$*2010*...
(AES-128, SHA-1, 100,000 回反復) - Office 2013/2016 以降:
$office$*2013*...
(AES-256, SHA-512, 100,000 回反復)
report.xlsx:$office$*2013*256*16*...長い16進文字列...*100000*...
ハッシュ文字列の中に、バージョン (2007
, 2010
, 2013
)、暗号化ビット長 (128
or 256
)、ソルト、暗号化された検証子、反復回数 (100000
など) といった情報が含まれています。
反復回数が多い (例: 100,000回) ため、パスワードの試行一回あたりにかかる計算コストが大きく、解析には非常に時間がかかります ⏳。GPU を活用できるバージョンの John the Ripper (または Hashcat などの他のツール) を使用すると、解析速度を大幅に向上させることができます。
# GPU を使用して解析する場合 (JtRがOpenCLサポートでビルドされている場合)
./john --format=office --opencl-device=0 hashes.txt
エラーとトラブルシューティング 🛠️
- “Unsupported file format or structure” / “is not a supported Office file”: ファイルが破損しているか、
office2john
が対応していない形式・暗号化方式である可能性があります。最新版の JtR Jumbo を試すか、ファイル自体を確認してください。 - “No password hash found”: ファイルにパスワードが設定されていない、または
office2john
が認識できる形式のパスワード保護ではない可能性があります (例: 編集制限のみで、ファイルを開く際のパスワードではない場合など)。 - Python の依存関係エラー:
office2john.py
は特定の Python ライブラリ (例えば暗号化処理ライブラリ) を必要とする場合があります。エラーメッセージに従って、必要なライブラリをpip
などでインストールしてください。 - ファイル名の問題: ファイル名に特殊文字やスペースが含まれていると、正しく処理されない場合があります。ファイル名をシンプルな英数字に変更するか、適切にエスケープ・引用符で囲んでみてください。
まとめ 🏁
office2john
は、パスワードで保護された Microsoft Office ファイルからパスワードハッシュを抽出し、John the Ripper で解析するための準備を行うための重要なツールです。
- John the Ripper (できれば Jumbo 版) をインストールします。
office2john.py
を見つけ、対象の Office ファイルを指定して実行します。- 出力されたハッシュ文字列をファイルに保存します (例:
hashes.txt
)。 - John the Ripper を使用して、保存したハッシュファイルを指定し、解析を開始します (
./john hashes.txt
)。 - 必要に応じて、辞書ファイルやマスク、GPU アクセラレーションなどの JtR オプションを利用します。
Office のバージョンが新しいほど、またパスワードが複雑であるほど、解析には時間がかかることを念頭に置いてください。GPU を活用することで、特に新しい形式のファイルの解析時間を短縮できる可能性があります。
繰り返しになりますが、このツールは倫理的な目的、つまり自身がアクセス権を持つファイルのパスワード回復のためにのみ使用してください。Happy cracking! (ただし、正当な理由で 😉)
コメント