2016.12.05
「ネットワークジャンル(パケット解析)」-CTF for ビギナーズ2015での演習より
これまでの連載記事はセキュリティ・キャンプのCTFで出題された問題ですから、全国から集まる比較的高いレベルの参加者に合わせて作られています。そのため少し難しいと感じた方もいるかもしれません。
今回は『CTF for ビギナーズ2015』のCTF演習の時間に出題し、比較的正答率が高かったネットワークジャンル(パケット解析)の問題をご紹介します。
はじめに
こんにちは、「CTF for ビギナーズ」運営の保要です。CTF for ビギナーズでは、2014, 2015年とネットワーク講習の講師やCTF演習の作問を務めてきましたが、最近は身を引いて陰ながら運営のお手伝いをしています。
さて、第1,2回はセキュリティ・キャンプ2015で出題されたWeb問題、第3,4回はセキュリティ・キャンプ2016で出題されたプログラミング問題、第5回は昨年のSECCON 2015オンライン予選で出題された問題をそれぞれ運営メンバーが解説してきました。
先の記事にも書かれていますが、セキュリティ・キャンプやSECCONのCTFで出題された問題は、全国から集まる比較的高いレベルの参加者に合わせて作られているため、少し難しいと感じた方もいるかもしれません。
そこで今回は、CTF for ビギナーズ2015のCTF演習の時間に出題し、比較的正答率が高かったネットワークジャンル(パケット解析)の問題をご紹介します。
ネットワークジャンル(パケット解析)の問題(CTF for ビギナーズ2015のCTF演習より)
File Transfer Protocol
ジャンル:ネットワーク、得点:300
次のファイルからFLAGを探してください。 FLAG文字列のフォーマットはctf4b{~}です。 |
問題ファイルはこちら: problem5.zip (クリックor右クリックでダウンロード可)
解説
問題ファイルを開く
まずは上記のリンクからファイルをダウンロードして、ZIP形式になっているファイルを展開してください。展開するとproblem5.pcapというファイルが作成されます。
作成されたファイルの拡張子を見ると「.pcap」となっています。これはネットワークを流れる通信(パケット)を記録するために使用されるpcapファイルの拡張子です。pcapファイルを開けるソフトウェアはいくつかありますが、ここではWiresharkを使って開いてみましょう。
WiresharkはGUIで使えるオープンソースのネットワーク解析ソフトウェアです。WindowsやmacOS、Linuxなど多くのOSに対応しています。WindowsやmacOSの場合、公式サイトから入手できるインストーラを使用することで、またLinuxの場合は、yumやaptのようなパッケージ管理ツールによりインストール可能です。
Wiresharkのインストールが完了したら、ダウンロードしてきたファイルをダブルクリックしてください。Wiresharkによってファイルが開かれ、図2のような画面が表示されます。
図2の画面は、Wiresharkの基本的な解析画面です。標準の設定では、記録されているパケットを一覧で表示している Packet List
(画面上段)、パケットの詳細情報を表示する Packet Details
(画面中段)、記録されているデータをバイナリエディタのように表示する Packet Bytes
(画面下段)の3つのセクションで構成されています。
パケットを解析する
pcapファイルを開けたら、表示されたパケットを解析していきます。具体的には次のような手順で進めます。
・調べるパケットの目星をつける
・必要なパケットのみ表示する
・絞り込んだパケットを解析する
調べるパケットの目星をつける
WiresharkのPacket List画面で、各パケットのProtocolと書かれている部分に着目しながらいくつかのパケットを見てみると、問題のタイトルにもなっているFTPと表示されているパケットが確認できます。
FTPは、その名の通りサーバとクライアント間でネットワークを通じてファイルを転送する時に使われるアプリケーション層のプロトコルです。サーバとクライアント共にこのプロトコルを実装した多くのソフトウェアがあるため、ファイルを複数人で共有するためのファイルサーバの用途としてよく使われます。
このように頻繁に利用されているFTPですが、設定によってはユーザ名やパスワードなどの認証情報、転送しているファイルの内容などを暗号化しないままクライアントとサーバ間で送受信が行われます。
今回の場合も例に漏れず、FTPパケットは暗号化されていないため、パケットキャプチャによって通信内容を見ることができます。
このFTPパケットの中身を詳しく見てみましょう。
パケットをフィルタリングする
デフォルト画面のままでは、今回の解析に必要ないパケットも表示されています。そこで、Wiresharkのフィルタリング機能 (Display Filter) を使ってFTPに関連するパケットのみ表示します。Display Filterを使用するには、解析画面の上部のテキストボックス(図3の赤枠部分)に条件式を入力します。
FTPに関連する条件式には、以下の2つがあります。
条件式 | 意味 |
---|---|
ftp | 「FTPの制御用通信」 をフィルタリング |
ftp-data | 「FTPのデータ用通信」 をフィルタリング |
フィルタの構文が2つに分かれているのは、FTPがサーバとの接続を、制御用とデータ転送用の2つの接続に分ける仕様となっているためです。したがって、フィルタ構文を片方指定しただけでは、FTPに関連するすべてのパケットを表示できません。この場合 or
演算子を使用して、ftp or ftp-data
とすることで、2つの条件のどちらかを満たしたパケットを表示できます。
フィルタの構文を正確に適用すると入力部のテキストボックスの背景が緑色になります。この状態でテキストボックス右側の矢印ボタンを押すとフィルタが有効化され、図のようにFTPに関連するパケットのみが表示されます。
絞り込んだパケットを解析する
FTPであればPacket List
のInfo
の列にFTPサーバとの通信内容が表示されます。この部分を1つずつ見ていくと、 Request
と、Response
の2種類があることがわかります。Requestではクライアントからサーバへ送信した要求(コマンド)を表示し、Responseではコマンドを実行した結果(レスポンスコードとメッセージ)を表示します。
FTPの通信を解析するには、表示されているコマンドの意味を理解することが必要不可欠です。今回使われているコマンドの意味を以下の表に示します。
コマンド | パラメータ | 意味 |
---|---|---|
USER | username | パラメータで指定したユーザ名でFTPサーバにログインする |
PASS | password | USERコマンドで指定したユーザの認証に使用するパスワードを送信 |
CWD | directory path | パラメータで指定したpathに作業ディレクトリを移動 |
PORT | h1, h2, h3, h5, p1, p2 | パッシブモードで使用するIPアドレス(h1~h5)、ポート番号(p1~p2) を指定 |
LIST | directory path | パラメータで指定したpathにある (pathがない場合は作業ディレクトリ) ディレクトリ、ファイルの一覧を表示 |
RETR | file path | pathで指定したファイルをサーバからダウンロード |
QUIT | - | FTPサーバからログアウトしてコネクションを切断 |
このリストを参考にRequestと表示されているパケットを見ていくと、クライアントは次のような操作を行っていることがわかります。
1. FTPサーバに、ユーザ名:anonymous、パスワード:ctf4b@example.com でログイン
2. pubをカレントディレクトリに設定
3. カレントディレクトリ内のファイル・ディレクトリ一覧の取得
4. 1.txt, 2.zip, 3.txt というファイルをダウンロード
5. 通信切断
FTPサーバにログイン後、ファイルを3つダウンロードしています。ここまでFLAGに関係しそうな文字列が出てきていないことを考えると、このファイルの中にFLAGに繋がる情報が隠されていそうです。
ファイルの中身を調べる
先にも述べた通りFTPの通信は制御用(FTP)とデータ用(FTP-DATA)に接続が分かれています。ファイル本体はファイルダウンロードのコマンド(RETR)の直後、データ用の接続で転送されているのでそのパケットを探してみましょう。
「1.txt」
1.txtが含まれるパケット は、No.45のパケットです。このパケットのPacket Details情報を見てみます(図4)。
FTP Dataの部分に ctf4b{This_communication_is という FLAGの一部と思われる文字が確認できました。転送しているデータがASCIIだったため、Wiresharkが自動で変換して表示してくれたようです。
「2.zip」
2.zipが含まれるパケットは、No.62のパケットです。Packet DetailsのFTP Dataを同様に見てみると、「165byte」とデータサイズのみ書かれていてファイルの中身は見れません。
このファイルの中身を見るために、ここではWiresharkの Follow TCP Stream
という機能を使います。これは選択したTCPのセッションで送受信しているデータをまとめて表示する機能です。2.zipが含まれるパケットを選択して右クリックし、そこから、 Follow->TCP Stream
を選んでください。図5のような画面が表示されます。
表示されたデータを見ると先頭が PK
となっているので、2.zipはファイル拡張子のとおりZIP形式であることが確認できました。WiresharkではZIPファイルの中身を見ることは難しいため、このデータをファイルに保存して他のソフトウェアで開けるようにします。
送受信しているデータをファイルに保存するには、図5の画面中段の Show and save data as
の値を ASCII
から Raw
に変更し、下段の Save as
をクリックしてください。
ファイル保存後そのファイルを展開すると、新たにテキストファイルが作成されます。そのテキストファイルの中身を見てみると、 _not
という文字列が確認できます。
「3.txt」
3.txtが含まれるパケットは、No.79のパケットです。これも上記のパケットと同様にPacket Detailsを見てみると、ASCIIデータのため _encrypted.}
という文字列が確認できます。
以上3つのファイルから見つかった文字列をファイル名の順に結合すると、ctf4b{This_communication_is_not_encrypted.}
という文字列ができ上がります。これが問題のFLAGです。
さいごに
今回は最もメジャーなパケット解析ツールであるWiresharkを使って通信の解析からテキストやZIPファイルの抽出を行う解法を紹介しました。この他にも、NetworkMinerやtcpflowなどのツールを使ってファイル抽出を行ったり、stringsコマンドでFLAGとなるテキストを見つけたりして解くこともできます。もしかしたら、解説をすっ飛ばしてこれらのツールを使用して問題を解かれた方もいるかもしれません。
時間制限があるCTFでは一刻も早く問題を解くことが求められるので、このようなツールを使って素早く解くのは重要なことでしょう。しかし、これらのツールに頼りすぎることは、個人的にはあまり良くないことだと考えています。どのように通信を行ってファイルを転送しているか、パケットのどの部分にファイルが隠されているか、ということを知らなくてもFLAGを見つけられるためです。その点、Wiresharkでは前述した内容を知らなければFLAGの発見はできません(HTTPで転送されているファイルを抽出する機能がありますが…)。
競技ではなく学習目的でこのような問題を解く場合は、できるだけ簡単に解くことができるツールは使わず、是非pcapファイルに記録されている通信をWiresharkで観察しながら問題を解いてみてください。