sekai013's blog

JavaScriptとかを勉強する

KSNCTF #14 John

問題

ksnctf - 14 John

考えたこと

ぱっと見てわからなかったので意味ありそうなタイトル John でググるけど John が一般的すぎてそれっぽいのはひっかからない。

問題文見てたら user00, 01, ..., 20 ときていきなり 99 になっているのでなんだろうと思ったらメッセージだった。

user99:$6$SHA512IsStrong$DictionaryIsHere.http//ksnctf.sweetduet.info/q/14/dicti0nary_8Th64ikELWEsZFrf.txt:15491:0:99999:7:::

SHA512 is strong. Dictionary is here: http://ksnctf.sweetduet.info/q/14/dicti0nary_8Th64ikELWEsZFrf.txt

と読める。見てみたら単語がずらっとならんでて前問を思い出した。
どうやら何かが SHA512 で暗号化されているらしい。SHA512 は解けなさそう。

この辺でググりなおしてみる。john dictionary, john sha512 ときたところでそれっぽいのが出た。

John the Ripper というパスワードクラッカーがあるらしい。apt-get john で簡単にインストールできる。
John the Ripper のパスワード解析には

  • ユーザーネームからパスワードを推測する方法
    john --single myPasswordFile
  • 辞書を用いて攻撃する方法
    john --wordlist=myDictionaryFile myPassswordFile
  • ルールを指定して総当り
    john --incremental:Rule myPasswordFile

の3通りあるらしく、単に john myPasswordFile とすると john 側で持ってる辞書とかを使いながら全部の方法でパスワードを推測するらしい。
今回は dictionary というファイルが与えられているので辞書だけ使ってアタックする。問題文を users, 上の URL から拾ってきた辞書を dictionary として保存して john --wordlist=dictionary users 実行したら5秒くらいで解析終わった。結果を見るには john --show users でOK

user00:FREQUENT:15491:0:99999:7:::
user01:LATTER:15491:0:99999:7:::
user02:ADDITIONAL:15491:0:99999:7:::
user03:GENDER:15491:0:99999:7:::
user04:__________:15491:0:99999:7:::
...

21 password hashes cracked, 1 left

解析できてないのは user99 だけなので問題ない。どう考えても頭の文字を拾っていけば旗取れそうなので適当にコード書いたら旗取れた。

begin
    File.open 'result' do |file|
        file.each do |line|
            line.match(/^user\d\d:(.*)/) {|match|
                print match[1][0]
            }
        end
        puts
    end
rescue => e
    puts e.message
end

思ったこととか

問題文見た時なんかのデータベースかな〜とか思ってたけど、途中で Linux のアカウント情報であることを知った。せっかくなので調べてみた。

参考になるページ

何も知らない人間にとってはググってツール使って終わりみたいな感じになってしまうけど、それじゃあ意味ないので、問題見るたびにいろいろ調べてみたい。ちゃんとわかってる人にとっては最後のメッセージなくても SHA512 で暗号化されてるアカウント情報だってわかる。ググって解けるかどうかよりそういうところが重要な気がする。