ZIPファイルのパスワードを総当りで解析する【CTF】

最近では、ZIPファイルの暗号化を利用したファイル共有がセキュリティ的に課題があるという話が話題になっています。
暗号化方式の問題等いくつかの課題はありますが、今回は短いパスワードを設定した際にどのような問題があるのかを、実際にパスワードを解析しながら見ていきます。

注: CELTF の "ToDo管理サービス" に関する解析方法を含みます。

ZIPファイルの暗号化

ZIPとはファイルを書庫化する仕組みで、書庫化する際にファイルを暗号化する機能を有しています。
ZipCryptoは96bitの鍵長しか無いため、パスワードを複雑に設定しても強度に限界がありました。
暗号化方式をAES256などのより強度の高いものを指定する事で、暗号化強度を担保する事ができます。

解析するZIPファイルを準備

解析するZIPファイルを準備します。
CELTFの競技を行っている方は、ToDo管理サービス サイトの 預かった認証トークン からダウンロードしてください。
それ以外の方はこちらからダウンロードします。

パスワードの解析

ツールの準備

今回はJohn The Ripperというツールを使用していきます。
バージョン1.8.0 には不具合があり No password hashes loaded (see FAQ) と表示されて解析ができない場合があります。
バージョン1.9.0では問題が解決しているので、こちらを利用します。

Windowsの場合はバイナリファイルをダウンロードし、Linuxの場合はソースファイルからビルドします。

ハッシュの解析

ツールの準備ができたら、書庫ファイルから解析に利用するハッシュを生成します。
john-the-ripper.zip2john もしくは zip2john というコマンドを利用し、以下のようにハッシュを生成します。

john-the-ripper.zip2john credentials.zip > credentials.zip.hash

生成したファイルは John The Ripper で解析するために、Shadowファイルのようなフォーマットで保存されます。
エンコードされたパスワード(ハッシュ)を確認すると、何のフォーマットが利用されているか等確認する事ができます。

cat credentials.zip.hash | cut -d ":" -f 2

$pkzip2$1*2*2*0*31*25*cfcb39db*46*4f*0*31*cfcb*accc*c1f2d50d2fdb57046ca0c1153eebc0962643439de42317b1cb3c41c3ccc071c62c766ebfa93327fff24d114390f1c49f72*$/pkzip2$

今回はPKZIP2というフォーマットが利用されています。

生成したハッシュを利用してパスワードを解析

ハッシュの生成が完了したら、パスワードを解析します。
今回は辞書などを利用せず、総当り(ブルートフォース)を行うので、以下のようなコマンドを入力します。

john-the-ripper --incremental=ASCII credentials.zip.hash

一度も解析をした事がないのに、 No password hashes left to crack (see FAQ) と表示される事があります。
その場合は、解析結果を管理しているpotファイルを一時的に指定し、回避する事が可能です。

john-the-ripper --pot=temp.pot --incremental=ASCII credentials.zip.hash

解析が完了すると、以下のように結果が表示されます。

Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
*******           (credentials.zip/credentials/token.txt)
1g 0:00:00:26 DONE (2021-12-07 13:35) 0.03760g/s 21697Kp/s 21697Kc/s 21697KC/s 3b88og..3b8c2h
Use the "--show" option to display all of the cracked passwords reliably
Session completed

また、今回は総当り攻撃を行うために incremental というオプション ※1 を利用しています。
今回の文字長であれば、ASCIIを指定したとしても数十秒〜数分で完了すると思います。

※1 incremental

総当り攻撃するためのMODEを指定します。
ASCIIを指定した場合、ASCIIで指定可能なすべての文字列(95種類)に対して解析が行われます。
パスワード強度が脆弱である場合、AlnumAlphaなど、パターン数の少ない解析を指定する事も可能です。
詳細なMODEを確認する場合は、公式ドキュメントを参照してください。

おわりに

今回は簡単ながらZIPファイルのパスワード解析を行いました。
ASCIIという全通りのパターンを利用したとしても、文字長が充分に長くない場合はものの数十秒で解析が完了してしまいます。
また、GPUやより強力なコンピュータを利用すると、より強度の高いパスワードだったとしても現実的な時間で解析する事が可能な時代になりました。
ファイルを暗号化する際は、とりあえず暗号化するだけでなく、何の暗号化方式が利用されているのか、パスワード長は充分か等意識するようにしましょう。

今後CELTFでより強度の高い暗号化について触れる機会があったら、別の解析方法に関する解説記事も書こうと思います。