ふと、シェル芸でワードリストから簡単なレインボーテーブルを生成することができないかと思ったので、ちょっとやってみることにした(レインボーテーブルと言うか、作ってるのは簡単な逆引き表なのだが)。 記号系にエスケープが必要だったりするので、その辺に注意が必要かも。 とりあえず、以下のようにコマンドを実行することで、「パスワード ハッシュ値」の形式でワードリストが生成できた(sha256sumのトコは、ターゲットとなる形式に応じて切り替えて於けばいいだろう。md5sumとか。)。

なお、速度向上のためxargsでパラレルでの実行をさせている。 (2017/06/29 ちょっと間違ってたので修正)

cat パスワードリスト | sed -e 's/`/\\`/g' | xargs -P32 -n1 -d"\n" -I@ bash -c 'echo $(printf %s "@ "&&printf "%q" "@"|(md5sum|awk "{print \$1}")) >> passlist'
[root@BS-PUB-CENT7-01 ~]# head passlist
123456 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
password 9167f9906b89001707ab4097bb5f66ac6e87912e3a9c74dc631a2c7a32f4e3dc
12345678 20dd707d7f0294e1cf29f017f69579613ea2c431505f329416cf5f9b4d561791
qwerty 9903e2c63e038914646a62ddbada2d5ecd56f0eedcb62f011d63de82aca8d1f2
123456789 6c7ecb2ae699cd2cb66ab58daf48ee88d03a802ff7f2fc1aa13bcd96b57c7460
12345 efe1e01888dcdbf842d5f12cac170770d5bd125a9fd5285b14ac4f50bb74dd4d
1234 55ba86eef2e42591651237755f306e71b9e85f2e6019b6e5ca514d9dd09c1bd2
111111 765a690246b9f7d1ebe70b788dd49fc2dfeb79555d1cacb1188944ca9d7ced30
1234567 452e1de0e5569f7ed2a3b671a3dd077600d389039fe7f9aa8045119e8035243e
dragon bb2531bb80b2227d1d15630017298071458d24210f66493cf17db273181669dc
[root@BS-PUB-CENT7-01 ~]# head md5_passlist
123456 e10adc3949ba59abbe56e057f20f883e
password 768d0813cde672ef751a0af70cc0bc7f
12345678 a7cc59c68949f4e4b412f257eeac2764
qwerty e5bd0a793460559be2e689d39ad9f037
123456789 0410fc9e0286052679fbfd3d62d95043
12345 b89a8b9593b5ff58e68f36dfe7bf85f9
1234 d8e5f94d2ac91ce895e9b6a8dda03788
111111 ca36e8a4e28ad8130b13a28db8f41133
1234567 4d92026ad5e5dd1ff65b3bb205273865
dragon d3cfcabc3a11f7a93fa3fe04348eafdf

パラレルで実行したとしても、出力完了までにはそれなりに時間がかかる。 時間がある時にちょこちょこ進めていくといいだろう。

最後の行で空行のハッシュ値が入ってしまうので、気になるようならtestで正常終了かどうかを入れるといいだろう。 なお、ソルトやストレッチングをする場合は、それぞれ以下のように記述してやればいい。

# soltを入れる場合。末尾に入れるならsedの指定を^から$に変えるなど。
cat パスワードリスト | sed -e 's/^/solt/g' -e 's/`/\\`/g' | xargs -P32 -n1 -d"\n" -I@ bash -c 'echo $(printf %s "@ "&&printf "%q" "@"|(md5sum|awk "{print \$1}"))'
# ストレッチングを入れる場合。
cat パスワードリスト | sed -e 's/^/solt/g' -e 's/`/\\`/g' | xargs -P32 -n1 -d"\n" -I@ bash -c 'echo $(printf %s "@ "&&printf "%q" "@"|(md5sum|awk "{print \$1}")|(md5sum|awk "{print \$1}"))'

ストレッチングについては、この辺を参考にブレース展開で処理を増やさせる書き方もあるにはあるのだが、エスケープとかが面倒なのでこんな感じで。 一応、シェル芸でレインボーテーブルの生成もできなくはないというのが確認できた(マルチプロセスでキックできるので、見てるとむしろ早いかも…?)ので、必要な時にはこれで作ろうかな。 ワードリストについては、この辺を使うとよさそうだ。