ここのところ、ちょっとした対応のためにレインボーテーブルについて調べていたのだが、Python3製のワードリストからレインボーテーブルを生成できる『Leprechaun』なるツールを見かけたので、試しに使ってみることにする。 指定したワードリストからハッシュ値を生成できるので、よく利用されるパスワードをワードリストに入れておけば、ランダムな文字列で生成したレインボーテーブルよりも効率よくパスワード解析ができるかもしれない。 ワードリストからの生成の他、地味にソルト(前後対応)やストレッチングも指定できるので、結構便利そうだ。 今回はUbuntu Server 16.04 LTS上でテストを行う。

1. インストール

まず、以下のコマンドでインストールを行う。 (pipだとちょっと古いっぽいのでソースからインストール)

sudo apt install git
git clone https://github.com/zcdziura/leprechaun
cd leprechaun
chmod +x setup.py
sudo ./setup.py install

これでインストールができた。

2. レインボーテーブルの生成

次に、実際にレインボーテーブルの作成を行ってみよう。 以下、コマンドのhelp。

blacknon@BS-PUB-DEVELOP:~$ leprechaun -h
usage: leprechaun [-h] [-f] [-g] [-l WORD_LENGTH] [-o OUTPUT] [-d] [-m] [-s]
                  [-s2] [-s3] [-s5] [-i ITERATIONS] [--prefix PREFIX]
                  [--postfix POSTFIX] [--first-run-only] [--debug]
                  WORDLIST

positional arguments:
  WORDLIST              The file name of the wordlist to hash, without the
                        file extension

optional arguments:
  -h, --help            show this help message and exit

wordlist arguments:
  -f, --wordlist-folder
                        Hash all of the plaintext files in a folder, rather
                        than a single file; the name of the folder will be set
                        by the WORDLIST argument
  -g, --generate-wordlist
                        Generate a wordlist dynamically instead of using a
                        pre-built one; the name of the dynamically generated
                        wordlist will be set by the WORDLIST argument
  -l WORD_LENGTH, --word-length WORD_LENGTH
                        Maximum word length for generated wordlist

output arguments:
  -o OUTPUT, --output OUTPUT
                        The name of the output file (default=rainbow)
  -d, --use-database    Rainbow table will be an sqlite database, not a
                        plaintext file

hashing algorithms:
  -m, --md5             Generate MD5 hashes of given passwords (default)
  -s, --sha1            Generate SHA1 hashes of given passwords
  -s2, --sha256         Generate SHA256 hashes of given passwords
  -s3, --sha384         Generate SHA384 hashes of given passwords
  -s5, --sha512         Generate SHA512 hashes of given passwords

hashing arguments:
  -i ITERATIONS, --iterations ITERATIONS
                        Set the number of hash iterations, default=1
  --prefix PREFIX       Set a prefix for the word
  --postfix POSTFIX     Set a postfix for the word
  --first-run-only      Add the pre/postfixes only during the first iteration,
                        default=False

logging arguments:
  --debug               Print out debug statements

それでは、実際にワードリストを読み込ませてレインボーテーブルを作成してみよう。 今回は、以下のようなワードリストを読み込ませてみる。

blacknon@BS-PUB-DEVELOP:~$ cat test_word.list
password
password1
password12
password123
passWord
passWord1
passWord12
passWord123
Password
Password1
Password12
Password123
PassWord
PassWord1
PassWord12
PassWord123

とりあえず、アルゴリズムがmd5やSHA1、SHA256などで設定したレインボーテーブルを以下のように作成してみた。

blacknon@BS-PUB-DEVELOP:~$ # md5
blacknon@BS-PUB-DEVELOP:~$ leprechaun --md5 -o test_rainbow_md5.table test_word.list
Leprechaun started, 07:48:46
Rainbow table has been generated
Leprechaun finished in: 0:00:00.022383.
blacknon@BS-PUB-DEVELOP:~$ cat test_rainbow_md5.table.txt
5f4dcc3b5aa765d61d8327deb882cf99:password
7c6a180b36896a0a8c02787eeafb0e4c:password1
c24a542f884e144451f9063b79e7994e:password12
482c811da5d5b4bc6d497ffa98491e38:password123
9334cf859035e2f0318320ceb88c7e6d:passWord
5896f7b56f5d7f43270cb1bc66bd4d41:passWord1
ab02afc90f2d2fa48a0ab66d0c4d6998:passWord12
e9aad0ee0eb5b38b36d7bb39f49e0c39:passWord123
dc647eb65e6711e155375218212b3964:Password
2ac9cb7dc02b3c0083eb70898e549b63:Password1
08f5b04545cbf7eaa238621b9ab84734:Password12
42f749ade7f9e195bf475f37a44cafcb:Password123
a9d402bfcde5792a8b531b3a82669585:PassWord
f2126d405f46ed603ff5b2950f062c96:PassWord1
bde4c7f50802c53f1825de349a7ce55c:PassWord12
28d2464b121f120a41f4cd5c496cae2c:PassWord123
blacknon@BS-PUB-DEVELOP:~$ # sha1
blacknon@BS-PUB-DEVELOP:~$ leprechaun --sha1 -o test_rainbow_sha1.table test_word.list
Leprechaun started, 07:49:52
Rainbow table has been generated
Leprechaun finished in: 0:00:00.023371.
blacknon@BS-PUB-DEVELOP:~$ cat test_rainbow_sha1.table.txt
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8:password
e38ad214943daad1d64c102faec29de4afe9da3d:password1
10c28f9cf0668595d45c1090a7b4a2ae98edfa58:password12
cbfdac6008f9cab4083784cbd1874f76618d2a97:password123
f06fec81712821efc805e9c49cf3bfecdcdcaa0c:passWord
fae2a9d752a0062ba905ab896f851f725803d6fd:passWord1
1bb25ce9d081792928f3732103e475d4633f4bb9:passWord12
316ee133b40d3164b5b3f5aeefd22435b125e4b1:passWord123
8be3c943b1609fffbfc51aad666d0a04adf83c9d:Password
70ccd9007338d6d81dd3b6271621b9cf9a97ea00:Password1
67a258218f68f6b5f7142593cf4b1f7d87622dd8:Password12
b2e98ad6f6eb8508dd6a14cfa704bad7f05f6fb1:Password123
f5d8cf270e82cff012babb306319ffa13983a45d:PassWord
285d0c707f9644b75e1a87a62f25d0efb56800f0:PassWord1
0cbdab7ab5b0fa7ed35f51b2352afd9b849acdfc:PassWord12
e02c1eaba7bcf2415bc9c80e1eb0b8611bb50247:PassWord123
blacknon@BS-PUB-DEVELOP:~$ # sha256
blacknon@BS-PUB-DEVELOP:~$ leprechaun --sha256 -o test_rainbow_sha256.table test_word.list
Leprechaun started, 07:50:22
Rainbow table has been generated
Leprechaun finished in: 0:00:00.023703.
blacknon@BS-PUB-DEVELOP:~$ cat test_rainbow_sha256.table.txt
5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8:password
0b14d501a594442a01c6859541bcb3e8164d183d32937b851835442f69d5c94e:password1
b3d17ebbe4f2b75d27b6309cfaae1487b667301a73951e7d523a039cd2dfe110:password12
ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94f:password123
a6f63a5fb10b3bba180a79f2fc565b1db2101040ce71ea80692d671857fe2117:passWord
a9bdcfbc66f41ec7711a11583198cb082801c130b2eca9d799f170f61fa50946:passWord1
bcd6724c7ad9a89d8215a89c3376a3ef119e4b7e9f961cee942fe8cfaf0ff4d6:passWord12
6ea1634442bf3a853f350c0d5612742c99646d8ca922ea942382ba152b51f077:passWord123
e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a:Password
19513fdc9da4fb72a4a05eb66917548d3c90ff94d5419e1f2363eea89dfee1dd:Password1
f3c16dc3ef3ba55671b0ac2938730a4afc3867cf4c01ae9a09cfe4e2367666bd:Password12
008c70392e3abfbd0fa47bbc2ed96aa99bd49e159727fcba0f2e6abeb3a9d601:Password123
fa3c600fd798799c9f214813806a51e51b8db790a45dd1285f573890f24a5cfe:PassWord
c04265d72b749debd67451c083785aa572742e3222e86884de16485fa14b55e7:PassWord1
704ff8caa642f5ec2dc6e1ce92438e1b9da83cb820b94514800ad5c43f2c3f10:PassWord12
5649332ac4766c482f458ae0e276d7a5330a1f76816732e7a8c0be9ccdfa2d1a:PassWord123
blacknon@BS-PUB-DEVELOP:~$ cat test_rainbow_md5_solt.table.txt
e0e47b25e8c67d14c4fa5ed7e006daf1:password
3f25a2fe9f9af157914e743e666ea8a5:password1
c13e86f85c940d10f84967496c5baf32:password12
572f81ddc0f1e2d768654dfe8346cf06:password123
3890bb507801f605e7eb4696c51ff100:passWord
00931f5f7cbcf71239ebe427900bafe3:passWord1
1416d47746ba61c33052e7d51541d721:passWord12
57219546c1fabb25f18a693b6dbef0fb:passWord123
7e07b12def86b4e8be8834c2d5b045f8:Password
a7e0ccb72db37d26a889d77c6f43ee88:Password1
1ee4c328f715ba3d87ca00b2f5daccd9:Password12
c9c35100a6c477fbf663d95ee946482c:Password123
b380211beadb8b8119eec8c0b1ab4a62:PassWord
0768224773e276486813910b95a5398f:PassWord1
3a0cd15809175e88dc3b4da7c9aab226:PassWord12
dceeecf7721c0294ce852797821c52ab:PassWord123
blacknon@BS-PUB-DEVELOP:~$ leprechaun --prefix solt --sha1 -o test_rainbow_sha1_solt.table test
_word.list
Leprechaun started, 07:53:29
Rainbow table has been generated
Leprechaun finished in: 0:00:00.023267.
blacknon@BS-PUB-DEVELOP:~$ cat test_rainbow_sha1_solt.table.txt
30e2c871d7c244659c75af587e5656af11788136:password
6303ed6a0dc6ea2a9c7d3a42a48a1be437b021b5:password1
a775f4d4e316399abd9fb62d1a800f963195699b:password12
761953fee521730db8779bdb7c2c8edaee3da20e:password123
be10b0a7d08eb348c0155e749519d6d9777e9193:passWord
ea7910737554e02fafb3a65d31ae6ccb878a2ce7:passWord1
0859a228fe64d5fe7dd3c3a281151f7a334dc0aa:passWord12
acd057327c7443d5a1d5e9aa799c1c5f41d2ac92:passWord123
c902fadcad050890ba3c21a4097f3371556c665d:Password
c789d822bc19d9f7723715de742bc662fda0f200:Password1
37dcd1c285bbbdb9757470a94de693ad35952461:Password12
855b33a30b73486dfb502e3641e86b56956b2ecd:Password123
5f590b4ed24a0bd30536c6cda03229d64bd02a3f:PassWord
81d10650f0da897859e48de11e91302c410ea938:PassWord1
8fa963c52b4d82057559d1e7654e17d2d1f8e33c:PassWord12
0489cdeb3975e16de2239c7c06e1b90225288ac5:PassWord123

後は、コレを加工してハッシュ値と突合させていけばいいということか。平文で出力されるので、数が少なければgrepなりawkでの突合でもそれなりにやれそうだ。 (実際のパスワードだと、ソルトの値はわからないしストレッチングもしているだろうから相応に膨大なレインボーテーブルを生成する必要があると思うが…)