「鍵は“J”の中にあるよ」CTF by ダークナイト解答編セキュリティ・ダークナイト(3)(2/4 ページ)

» 2010年02月22日 00時00分 公開

echo request(type 8)に隠されたシークレットメッセージ

 行き詰ったら、問題文に立ち返ろう。そこには、CTF出題者が込めた思いがあるはずだ。

 「Jは、2つの隠されたなぞを解決するだろう」。「なぞを解決する」という部分から考えると、zip展開のパスワードについてのことではないかと仮定される。つまり、出題者がこの問題文に込めたものとは、

[i] 2つの隠されたなぞが存在する。

[ii] それを解決してくれる「J」とは何か。

であると考えられる。

 まずは、[i]をパケットファイル内から探してみよう。パケットファイルの中身は先ほども整理した通り、通信の内容は、ICMPとFTPである。FTPについては、通信を見ても分かる通り、通常の認証を行い、[CWD]したあと、ファイルをダウンロードを行っているだけで「隠されたなぞ」といえる怪しいと思われる点はない。

 次に、ICMP通信に注目してみよう。

 ICMPの通信は、前述した通り、ICMP Echo (ping) request が2つと、その応答であるICMP Echo (ping) replyが2つ存在している。データ部分を見比べていただければ、requestとreplyで内容が同じであるため、文字列としてはユニークなものが2つあることが分かる。

図10 ICMP通信のデータその1 図10 ICMP通信のデータその1
図11 ICMP通信のデータその2 図11 ICMP通信のデータその2

データ部分の文字列を抽出すると下記の通りである。

2:ZYpwzqSIeT7FU

1:$1$ZX$mvBOzellP.O9Me/P.Jnqb/

リスト1 データ部分を抽出

整理したポイントに、このようなものがあったことを思い出してほしい。

  1. 192.168.0.20はWindows系、192.168.0.150はLinux系OSと思われる

 Windows系、Linux系OS間の通信であることが挙げられている。これらのOSが標準付属のICMP Echo requestを送信した場合、このパケットと同様のデータとなるかどうかの比較をしてみよう。

 図12はWindows系(XP)、図13は筆者の手元にあるLinux系(Ubuntu)OSに標準付属しているpingコマンドを実行した際のデータ部分である。

図12 Windows系のICMP Echo requestの内容 図12 Windows系のICMP Echo requestの内容
図13 Linux系のICMP Echo requestの内容 図13 Linux系のICMP Echo requestの内容

 実際に読者の方々も手元で再現してみれば分かるのだが

  • Windowsでは「abcdefghijklmnopqrstuvwabcdefghi」
  • Linuxでは「!"#$%&'()*+,-./01234567」

といったような規則が見つかることだろう。

 パケットファイル内に存在したICMP Echo requestと、この2つのOS標準の「ping」コマンドで送出したものとを比較すると、意図的に操作されたものであり、かなり怪しいと判断できる。この怪しい部分を元に戻す操作が必要だろう。とすれば、どう戻すのかを探さなければならない。

暗号化された文字列は

 文字とにらめっこし、思いつく限りの特徴からどういう処理をされている文字列であるのかを見つけ出さなければならない。ここでは、とらえるべき特徴について解説する。

 まず、1つ目の文字列「2:ZYpwzqSIeT7FU」と「1:$1$ZX$mvBOzellP.O9Me/P.Jnqb/」を見比べてみよう。「数字」+「:」となっている部分が共通している。ここで考えられることは、この部分は処理されたものではないのではないかと仮定できる。処理されている部分は「ZYpwzqSIeT7FU」と「$1$ZX$mvBOzellP.O9Me/P.Jnqb/」である。

 それでは、1つ目「ZYpwzqSIeT7FU」を見てみよう。

 先に種明かしをするが、この文字列はPerlのcrypt関数を用いて、DES(Data Encryption Standard)処理を行ったものだ。処理した方法は以下の通りである。

perl -e 'print crypt('暗号化前の文字列','2文字');'


 上記を実行すると、第1引数で与えた「暗号化前の文字列」の先頭8文字を第2引数の「2文字」をもとにして、文字列長13の文字列を生成する。ちなみに、先頭の2文字は第2引数で使った「2文字」である。「ZYpwzqSIeT7FU」は13文字であることから、このような処理を行っているのではないかと推測できる。

 次に、2つ目の文字列「$1$ZX$mvBOzellP.O9Me/P.Jnqb/」を見てみよう。この文字列で着目すべきところは、文字列の先頭からの3文字である。サーチエンジンで「$1$ ハッシュ」や「$1$ 暗号」などで検索するとさまざまヒントが見つかるだろう。

  答えは、「MD5」によるハッシュ化された文字列である。

 ちなみに、「$6$」から始まる場合は、「SHA-512」でハッシュ化された文字列である。これらのハッシュ化は、UNIX系OSのパスワード格納の際に使われているものである。下記は、「MD5」と「SHA-512」によってハッシュ化されたパスワードである。

[CENT OS 5.1 の /etc/shadow]

ntsuji:$1$DO0veTkq$STStxPpLTaS2Vzn2kvb13/:14631:0:99999:7:::

[Ubuntu 9.01 の /etc/shadow]

ntsuji:$6$FUXCOoWB$cmM/s/90Gu2LTUa3zgDGuRg  

Mmj7MlUEBrF.Co8RFnDQuPqU2xFa3JrI1Qqbf5AWFfFz

【注】Ubuntuのパスワードは実際には1行。ちなみに上記はJoeパスワードである。


 さて、この文字列を元の文字列に戻す作業が必要なるわけだが、ここでいったん、問題文に立ち返ろう。

 2つのなぞが何かということは判明した。次は「J」とは何であるかだ。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。