パスワード付きzipファイルがどのぐらいでクラック(パスワード解析)できるか試してみる

2023-03-27Bash,Linux,Ubuntu

はじめに

前回のエントリで zip ファイルにパスワードを設定する方法について紹介しました。

標準的な zip ファイルは比較的容易にパスワード解析できるということなので、実際に突破できるか試してみることにしました。

総当りでクラック ( パスワードの解析 ) を行うスクリプトを適当に見繕って、試してみます。

検証環境

$ uname -moi
arm64 unknown Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.2.15(1)-release (aarch64-apple-darwin22.1.0)

$ go version
go version go1.19.2 darwin/arm64

zip クラック用のスクリプトを探す

Github には、 zip ファイルのパスワードを解析するためのスクリプトがいくつも存在しています。

いくつかスクリプトを見て、適当なものを採用しました。

zip クラック環境セットアップ

henriksb/ZipCrack は Go 言語で実装されていたため、Go 実行環境が必要です。

ここでは Go の実行環境構築の手順は割愛します。

Go で書かれたコードから実行可能ファイルを生成しておきます。

$ go mod init henriksb/ZipCrack.git
go: creating new go.mod: module henriksb/ZipCrack.git
go: to add module requirements and sums:
        go mod tidy

$ go mod tidy
go: finding module for package github.com/yeka/zip
go: downloading github.com/yeka/zip v0.0.0-20180914125537-d046722c6feb
go: found github.com/yeka/zip in github.com/yeka/zip v0.0.0-20180914125537-d046722c6feb
go: finding module for package golang.org/x/crypto/pbkdf2
go: downloading golang.org/x/crypto v0.5.0
go: found golang.org/x/crypto/pbkdf2 in golang.org/x/crypto v0.5.0

$ go build -o ZipCrack

クラック対象のパスワード付き zip ファイルを作成

zip コマンドでパスワード付き圧縮ファイルを生成する | ゲンゾウ用ポストイット で紹介した方法でパスワード付き zip ファイルを生成します。

後ほどこちらのファイルをクラックしてみます。

まずは軽微なパスワードにしてみます。

  • 5 文字
  • 小文字のアルファベットのみ
# 適当な内容のファイルを作成
$ echo hello > 1.txt

# "world" というパスワードを設定
$ zip --encrypt --password world 1.zip 1.txt
  adding: 1.txt (stored 0%)

zip クラック開始

ZipCrack を使って解析してみます。

アプローチとしては 2 つを選択できるようです。

  • 辞書攻撃
  • ブルートフォース攻撃 ( 総当り )

辞書攻撃は辞書データが必要なようで、探すのが面倒だったので総当りで攻撃してみることにします。

$ ./ZipCrack ../1.zip  abcdefghijklmnopqrstuvwxyz bruteforce
Starting brute force attack..
Password matched: world
Combinations tried: 10786572
Time taken: 136.452628 seconds
./ZipCrack ../1.zip abcdefghijklmnopqrstuvwxyz bruteforce  63.93s user 96.98s system 117% cpu 2:16.46 total

2 分強でパスワードが解析できました。

Password matched: world と出力されていることから、 world というパスワードを解析できたことがわかります。

文字数、文字種ともに限定されていたため容易に解析できました。

少しだけ複雑なパスワードをクラックしてみる

もう少しだけパスワードを複雑にしてみます。

  • 5 文字
  • 大文字、小文字のアルファベット と 数字 を含む

W0rld というパスワードを設定してみました。

$ zip --encrypt --password W0rld 1.zip 1.txt
updating: 1.txt (stored 0%)

解析します。

$ ./zipcarck ../1.zip $(echo {A..Z} {a..z} {0..9} | sed 's/ //g') bruteforce
Starting brute force attack..
Password matched: GFNHd
Combinations tried: 104918662
Time taken: 1347.150436 seconds
./zipcarck ../1.zip $(echo {A..Z} {a..z} {0..9} | sed 's/ //g') bruteforce  639.07s user 969.89s system 119% cpu 22:27.49 total

実行されたコマンドは以下の同義です。

  • ./ZipCrack ../1.zip ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 bruteforce

思ったより早く終わりました。 22 分強です。

パスワードがかかっていても同梱されているファイルのリストは確認できる

よく知られていることですが、zip ファイルはパスワードが掛かっていたとしても内包されているファイルのリスト、作成日時、サイズは確認できます。

$ unzip -l 1.zip
Archive:  1.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        6  2023-02-02 22:51   1.txt
---------                     -------
        6                     1 file

内包されているファイル名に会社名やファイルの概要が書かれていれば、内容が推測されてしまいます。

ひとこと

zip ファイルに限ったことでは有りませんが、パスワードはとにかく長くしましょう。

2023-03-27Bash,Linux,Ubuntu