CTFっぽい話(john)
ksnctf という CTF があります。
そもそもctfとは…。
CTF(Capture The Flag)とは、コンピュータセキュリティ技術の競技である。CTFは通常、参加者に対しコンピュータを守る経験に加え、現実の世界で発見されたサイバー攻撃への対処を学ぶ教育手法として企画されている。「ハッカーコンテスト」「ハッキング大会」「ハッキング技術コンテスト」「ハッカー大会」などとも訳される。
※(Wikipedia より)
ksnctfは、そんなctfのオンラインバージョンなわけです。ググれば出てきます。
今回はその中の14問目、「john」を解いた際の解説をします。
※以降ネタバレ要素を含みます(というか思いっきりネタバレ)なので、自分で解きたい方はブラウザの戻るボタンを押してください。
問題
まずこれが問題の画面です。
こういう画面が出てくるわけです。
これは知っているかどうかの問題だと思いますが、僕はちょうど学校のカリキュラムでLPICを学んでいたので、この文字列の集合が「なんとなく shadow ファイルっぽい」という手がかりを最初に掴みました。
手始めにこの文字列をコピペして、「 testpassword 」という名前のファイルで保存します。
(shadow ファイルとは、ホストに居るユーザのパスワードを暗号化して格納するファイルです。/etc 以下にあり、基本的にスーパユーザしか読めません。)
つまり、shadow ファイルの中身は暗号化されているので、復号してあげればいいわけです。
復号①
とりあえず中身を cat してみます。
問題の画面で気づいた方も居るかもしれませんが、user99 の行にURLが書いてありました。
因みに、このURLにアクセスすると、末尾の拡張子からもわかるように、テキストファイルが現れます。とりあえず、「 dictionary.txt 」という名前で落としました。
ここで dictionary = 辞書 という名前のファイル名にしたのは、 shadow ファイルの解析によく用いられるパスワード解析ファイル「 john the ripper 」で使用する為です。
ただの無作為な文字列の並びだったこともあり、恐らくこれを辞書攻撃用のファイルとして使用してあげれば良いのでは、と思ったわけです。
復号②
さっそく yum install john します。
無事に落とせたので、ヘルプをみて使い方を確認します。
解析のモードはいくつかあるようですが、ここでは「 --wordlist 」オプションを使いました(先ほど落とした dictionary.txt を使うので)。
オプションを指定して実行するコマンドが以下のようになります。
# john --wordlist=dictionary testpassword
このコマンドを実行します。
すると、user~~ のそれぞれのパスワードが少しずつ解析されていきます。
解析後のファイルを見るには、 --show オプション付きの john コマンドを呼んであげればよいです。
# john --show testpassword
すると、解析されたパスワードの一覧が表示されます。↓
user04 のパスワードがおかしい、と思い小一時間悩みましたが、ヒントはそこではなく各ユーザのパスワードの先頭文字でした。
画像にある通り、「 FLAG_a... 」となっているのが解ります。
そこで、今度は python の出番でした。
復号③
解析後、 --show オプションで閲覧できるファイルを、.txt 形式のファイルに保存します。
# john --show testpassword > foo.txt
生で叩いても良さそうですが、今回の解説用に上記のコマンドを実行しました。
先ほどの画像からもわかるように、どうやらパスワードの先頭文字は8文字目からのようなので、 index にすると7に当たる部分の文字を取得して、連結していってあげるとよいことが解ります。
ソースコードはこちらです。
テキストファイルとして保存した foo.txt を一行ずつ取り出して、連結していきます。
実行結果がこちらです。
これを最初の問題の画面にあるテキストフォームにコピペしてあげると、正解となります。
まとめ
今回はVM上の CentOS5.8 を使って解きました。
問題文を解くきっかけとしては、最初の画像を見て shadow ファイルを推測できるかどうかが鍵かと思います。
ちなみに、解析前のパスワードの先頭についていた「$6」という文字列は、SHA-512で暗号化されている、という印らしいです。