私の友人が非常に重要な Excel ファイルのパスワードを忘れてしまったと尋ねてきました。彼にとって非常に重要なことです。昔、hashcat で解読できることを覚えていたので、ついでに調べて、使い方を記録しておきます。
強力なパスワード解読ツール John the Ripper (JtR) を使用して、忘れたパスワードの XLSX ファイルを復元する方法を簡単に説明し、John のいくつかのコア解読モードをカバーします。
前提条件#
- John the Ripper: John the Ripper をダウンロードして解凍していることを確認してください。コミュニティの拡張版 "Jumbo John" を強く推奨します。なぜなら、より多くのハッシュタイプと GPU アクセラレーションをサポートしているからです。https://github.com/openwall/john
- 対象ファイル: パスワードを解読する必要がある
.xlsx
ファイル。
第一步:XLSX ファイルからハッシュを抽出#
John the Ripper は直接.xlsx
ファイルを処理できません。特別な形式の「ハッシュ」文字列が必要です。office2john.py
スクリプトを使用して抽出します。
- ターミナル(Windows の PowerShell または CMD)を開きます。
cd
コマンドを使用して John the Ripper のrun
ディレクトリに移動します。- 次のコマンドを実行します:
# "C:\path\to\your\file.xlsx"をあなたのExcelファイルの完全なパスに置き換えます
python .\office2john.py "C:\path\to\your\file.xlsx" > hash.txt
このコマンドは、John the Ripper が必要とする暗号情報を含むhash.txt
という名前のファイルを生成します。
第二步:解読モードを選択して実行#
John the Ripper にはさまざまな解読モードがあり、異なるシナリオに応じて適切なモードを選択することが成功の鍵です。
John のコア解読モード#
1. 辞書モード (Wordlist Mode)#
最も一般的なモードです。一般的なパスワードを含む辞書ファイル(wordlist)を提供すると、John はそれを一つずつ試します。ルール(Rules)を組み合わせて辞書の単語を変形することもでき(例:pass
-> P@ss123
)、成功率が大幅に向上します。
# --wordlist=の後にあなたの辞書ファイルのパスを続けます
john --wordlist=password.lst hash.txt
2. 増分モード (Incremental Mode)#
純粋なブルートフォース解読です。すべての可能な文字の組み合わせを試みます。理論的には、時間が十分であれば必ず解読できますが、少し長いパスワードの場合は非常に非常に遅くなります。
# 8文字以内の小文字の組み合わせをすべて試します
john --incremental=Lower --max-len=8 hash.txt
3. マスクモード (Mask Mode) - 今回使用するモード#
パスワードの構造についてある程度の理解がある場合、これは最も効率的なモードです。パスワードの形式を定義することで、検索範囲を大幅に縮小できます。
?d
: 1 桁の数字を表します (0-9)?l
: 1 桁の小文字を表します (a-z)?u
: 1 桁の大文字を表します (A-Z)?s
: 1 桁の特殊記号を表します (!@#$)
例: 6 桁の純数字のパスワードを解読します。
参考にすることができます:https://in.security/2022/06/20/hashcat-pssw0rd-cracking-brute-force-mask-hybrid/
https://github.com/openwall/john/blob/bleeding-jumbo/doc/RULES
(非常に複雑なので、AI に直接尋ねることをお勧めします)
john --mask=?d?d?d?d?d?d hash.txt
簡単に言うと:
? 記号自体は 1 文字ではなく、「特別な命令」または「プレフィックス」であり、John に「私の後に続く文字は普通の文字ではなく、特定の文字セットを表すプレースホルダーである」と伝えます。
これを空欄の問題として考えてみてください:
__ __ __ __ __ __
?d?d?d?d?d?d このマスクは次のように言っているのと同じです:
- 最初の空欄 __ には、数字(digit) (?d)
- 2 番目の空欄 __ には、数字(digit) (?d)
- ... このようにして、6 つの空欄を埋めます。
詳細な分解#
次に、 ? とその後の文字の組み合わせを詳しく見てみましょう。
1. 内蔵の標準プレースホルダー#
John the Ripper は、特定の文字セットを表す文字を定義しています。これらの文字が ? の後に続くとき、特定の文字セットを表します。最も一般的なものは:
プレースホルダー | 表す文字セット | 説明 | 例の文字 |
---|---|---|---|
?d | 数字 | 数字 | 0, 1, 2, ... 9 |
?l | 小文字 | 小文字 | a, b, c, ... z |
?u | 大文字 | 大文字 | A, B, C, ... Z |
?s | 特殊 | 特殊記号(ASCII) | !, @, #, $ ... |
?a | すべて | すべての印刷可能な文字(?l+?u+?d+?s) | a, A, 1, ! ... |
?h | 小文字の 16 進数 | 小文字の 16 進数文字 | 0-9, a-f |
?H | 大文字の 16 進数 | 大文字の 16 進数文字 | 0-9, A-F |
?b | すべての 8 ビット | すべての可能な ASCII 文字 (0-255) | (すべての文字) |
2. それらをどう組み合わせるか?#
これらのプレースホルダーを自由に組み合わせて、あなたが考える可能性のあるパスワード構造を構築できます。
例 1:最初の文字が大文字で、後に 7 つの小文字が続くパスワード (例: Password)
--mask=?u?l?l?l?l?l?l?l
例 2:4 桁の数字の ATM パスワードの後に 2 つの大文字が続く (例: 1234AB)
--mask=?d?d?d?d?u?u
3. パスワードに普通の文字が含まれている場合はどうするか?#
すべてのない ? プレフィックスのない文字は、普通(または「リテラル」)文字として処理されます。John the Ripper は、この位置の文字が固定されていると考えます。
例 3:パスワードが pass-で始まり、後に 4 つの数字が続くことを知っている (例: pass-1234)
--mask=pass-?d?d?d?d
この例では、p, a, s, s, - はすべて固定されており、後ろの 4 つの ?d 位置だけが John によってブルートフォース解読されます。これにより、検索空間が大幅に減少します!
4. より高度な使用法:カスタム文字セット#
自分自身のプレースホルダー ?1, ?2, ?3 などを定義することもできます。
例 4:パスワードが 8 桁で、a, b, c, 1, 2, 3の文字だけを含むことを知っている。
カスタム文字セット?1を定義し、それを 8 回繰り返すことができます。
john --mask='?1?1?1?1?1?1?1?1' --mask-char-?1='abc123' hash.txt
- <font style="color:rgb(26, 28, 30);">--mask-char-?1='abc123'</font><font style="color:rgb(26, 28, 30);">:この部分は、</font><font style="color:rgb(26, 28, 30);"> </font><font style="color:rgb(26, 28, 30);">?1</font><font style="color:rgb(26, 28, 30);"> </font><font style="color:rgb(26, 28, 30);">このプレースホルダーが表す文字セットは</font><font style="color:rgb(26, 28, 30);"> </font><font style="color:rgb(26, 28, 30);">'abc123'</font><font style="color:rgb(26, 28, 30);">であることを定義します。</font>
- <font style="color:rgb(26, 28, 30);">--mask='?1?1?1?1?1?1?1?1'</font><font style="color:rgb(26, 28, 30);">: この部分は、John the Ripperにパスワードが8つの</font><font style="color:rgb(26, 28, 30);"> </font><font style="color:rgb(26, 28, 30);">?1</font><font style="color:rgb(26, 28, 30);"> </font><font style="color:rgb(26, 28, 30);">文字セットからの文字で構成されていることを伝えます。</font>
? 記号自体には意味はありませんが、その後に続く文字に特別な意味を与えます。これにより、「すべての可能性を盲目的にブルートフォースする」から「特定の形式を戦略的にブルートフォースする」へと変わり、解読時間を数年から数秒に短縮します。
4. 単一解読モード (Single Crack Mode)#
John が最初に試みるモードで、非常に速いです。ハッシュファイル内のユーザー名などの情報を利用して簡単な変換や推測を行います。
# 何のモードパラメータも加えず、デフォルトで有効になります
john hash.txt
実践演習:6 桁の数字パスワードの XLSX ファイルを解読#
私たちの実践では、パスワードが 6 桁の数字であることがわかっているので、マスクモードを選択します。
理想的なコマンドは:
.\john --mask=?d?d?d?d?d?d hash.txt
よくある質問と解決策#
エラー : Error: UTF-16 BOM seen in input file.
#
- 問題: John は
hash.txt
のファイルエンコーディングを認識できません。 - 原因: Windows PowerShell の
>
リダイレクト記号を使用してファイルを作成すると、デフォルトのエンコーディングはUTF-16
であり、John はUTF-8
またはASCII
を必要とします。 - 解決策:
- メモ帳で
hash.txt
ファイルを開きます。 - 「ファイル」->「名前を付けて保存」を選択します。
- ポップアップウィンドウの下部で、「エンコーディング」を
UTF-16 LE
からUTF-8
に変更します。 - 保存して元のファイルを上書きします。
- メモ帳で
第三步:解読結果を確認#
コマンドが成功裏に実行されると、次のような出力が表示されます:
Warning: detected hash type "Office", but the string is also recognized as "office-opencl"
Use the "--format=office-opencl" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (Office, 2007/2010/2013 [SHA1 256/256 AVX2 8x / SHA512 256/256 AVX2 4x AES])
Cost 1 (MS Office version) is 2007 for all loaded hashes
Cost 2 (iteration count) is 50000 for all loaded hashes
Will run 32 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
933728 (微信登记1 (1).xlsx)
1g 0:00:00:29 DONE (2025-09-05 19:45) 0.03344g/s 20067p/s 20067c/s 20067C/s 616778..351115
結果の解釈:
- 解読されたパスワード:
933728
- 所要時間:
0:00:00:29
、つまり 29 秒。
その後、再度解読されたパスワードを確認したい場合は、次のコマンドを実行します:
.\john --show hash.txt
これで終了です。
PS:
外部のサードパーティソフトウェアはたくさんありますが、調べたところ、Passper for Excel.exe というソフトウェアを見つけました。おそらく John を呼び出しているもので、GUI グラフィカルをサポートしているので、必要があれば直接使用することをお勧めします。関連する Passper for Excel crack を検索してください。