ゾンビ狩りクラブ

Linux, Server, Network, Security 関連などをゆるーくテキトーに載せてます

pkcrackを使用してzipファイルのパスワードを解析する

Index

1. はじめに

pkcrackは既知平文攻撃を使用して、zipファイルのパスワードを解析するツールである。
既知平文攻撃は、暗号化されたzipファイル内のとあるファイルが平文でわかっている場合に行うことができる。

今回実施した環境は以下である。

% uname -a
Linux pc 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

% lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04 LTS
Release:          16.04
Codename:   xenial

2. pkcrackのインストール

pkcrackをダウンロードし、解凍する。

% wget https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack/pkcrack-1.2.2.tar.gz
% tar xfvz pkcrack-1.2.2.tar.gz

srcディレクトリにMakefileがあるので、makeすると、同ディレクトリにpkcrackという実行ファイルができる。

% cd pkcrack-1.2.2/src
% make

3. 使ってみる

オプションは以下のようになっている。 [必須] -c: 暗号化されたzipファイル中の平文がわかるファイル -p: 平文のファイル

[オプション] -o: 暗号化されたファイル中での平文のオフセット -C: 暗号化されたzipファイル -P: 平文のファイルが格納されたzipファイル -d: 出力先

解凍したディレクトリ中の testディレクトリにあるbug.zipを使用して pkcrack を試すことができる。

普通に解凍してみる。

% cd ../test
% ls
Makefile  bug.zip  test.sh*
% unzip bug.zip
Archive:  bug.zip
[bug.zip] ../doc/appnote.iz.txt password:
password incorrect--reenter:
password incorrect--reenter:
   skipping: ../doc/appnote.iz.txt   incorrect passwor

パスワードがかかっていて解凍できないので、pkcrackを使用して解析する。
解析の前にまずは、unzip コマンドや zipinfo コマンドを使用して、zipファイルに含まれているファイルを調査する。

% unzip -l bug.zip
Archive:  bug.zip
  Length      Date    Time    Name
---------  ---------- -----   -   104575  2001-12-04 04:04   ../doc/appnote.iz.txt
---------                     ----   104575                     1 file

appnote.iz.txt というテキストファイルがあるのがわかる。
また、docディレクトリに平文の appnote.iz.txt が用意されている。

% ls ../doc
CHANGES     LIESMICH  README.W32   appnote.iz.txt
KNOWN_BUGS  README    README.html  pkzip.ps.gz

これを使用して解読してみる。

% ../src/pkcrack -C ./bug.zip -c ../doc/appnote.iz.txt -p ../doc/appnote.iz.txt Warning! Plaintext is longer than Ciphertext!
Files read. Starting stage 1 on Fri Jul 29 13:00:20 2016
Generating 1st generation of possible key2_104586 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 970 values at offset 101037
Lowest number: 910 values at offset 100869

...

Done. Left with 97 possible Values. bestOffset is 99273.
Stage 1 completed. Starting stage 2 on Fri Jul 29 13:00:41 2016
Stage 2 completed. Starting password search on Fri Jul 29 13:00:44 2016
No solutions found. You must have chosen the wrong plaintext.
Finished on Fri Jul 29 13:00:44 2016

どうやら失敗したようだ。
こういう時は、Pオプションをつけて実行すれば解析できる可能性がある。
Pオプションで使用するzipファイルを作成する。

% zip ./appnote.zip ../doc/appnote.iz.txt  
  adding: ../doc/appnote.iz.txt (deflated 76%)

% ls
Makefile  appnote.zip  bug.zip  test.sh*

作成した appnote.zip を使用して再度実行する。

% ../src/pkcrack -C ./bug.zip -c ../doc/appnote.iz.txt -p ../doc/appnote.iz.txt -P ./appnote.zip
Files read. Starting stage 1 on Fri Jul 29 13:06:58 2016
Generating 1st generation of possible key2_25625 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 972 values at offset 21357
Lowest number: 971 values at offset 21356

...

Done. Left with 160 possible Values. bestOffset is 20088.
Stage 1 completed. Starting stage 2 on Fri Jul 29 13:07:38 2016
Ta-daaaaa! key0=3313609c, key1=be926f5d, key2=bfc303f7
Probabilistic test succeeded for 5542 bytes.
Ta-daaaaa! key0=3313609c, key1=be926f5d, key2=bfc303f7
Probabilistic test succeeded for 5542 bytes.
Stage 2 completed. Starting password search on Fri Jul 29 13:07:45 2016
Key: 61 72 67 68
Or as a string: 'argh' (without the enclosing single quotes)
Finished on Fri Jul 29 13:07:45 2016

解析に成功し、パスワードが「argh」ということが分かった。