ネットワークパケットの解析やセキュリティ調査を行う際に重宝されるWiresharkをこれから少しずつ触ってみようと思います。その中で私が使えそうだなと思ったTipsを書き溜めていきます。私が個人的に使えそうだなと思って見つけた方法です。良いなと思ったTipsがあれば随時更新していきます。特にWiresharkで検索する場合のフィルターや分析が捗る方法を中心にまとめます。
パケットの総数、パケットロスの総数、データ量(Bytes)を知る
pcapファイルを取得したらまず全体像を把握したくなるでしょう。全体像を知るためにStatisticsのタブから統計情報を取得することができます。「Statistics」タブから様々な情報を得ることができます。
「Capture File Properties」タブから統計情報を収集します。パケット測定をする際にロスしたパケットが無いかの調査や通信のデータ量をおおよそ把握することに役に立ちます。
検知したIPアドレス(IPv4)の台数を知る
「IPv4 Statistics」タブからIPv4で検知した端末の全体像を把握します。端末はバックグラウンドで複数の端末と通信をしているので不要な通信先や怪しい通信先がないかを確認することに役に立ちます。「IPv6 Statistics」でIPv6で検知した端末の全体像も把握できます。
また「Resolved Address」でも同様に出現したアドレスとポートの一覧を確認することができます。
収集したpcapに含まれる送信元と送信先の一覧を知る
通信パケットには必ず送信元と送信先が存在します。セキュリティ調査では特に通信回数が多かったり、通信容量が多い通信に注意を払う必要があります。取得したpcap全体の中でだれが・どこに・どれくらい通信しているかをざっくり知ることができます。「Statistics」>「Conversations」から情報を取得することができます。下図のようにIPv4やIPv6、TCP、UDPなどの単位で確認することができます。左図にある「IPv4・11」のタブに記載されている数字の意味はIPv4で通信したペアが11組あるという意味を示します。
また左側のチェックボタン「Name Resolution」を押下すると名前解決できた表記に切り替えることができます。ただし事前に「Edit」>「Preferences」>「Name Resolution」>「Resolve Network(IP) Address」にチェックを入れておく必要があります。デフォルトではチェックが入っていないため、初期設定では下図の「Name Resolution」ボタンはグレーアウトされています。
Webページとファイルを復元してみる
ネットワーク調査やセキュリティ調査を行う際に通信した内容を詳しく確認するために、例えばHTTPでGETしたwebページやHTTP、FTPなどで取得したファイル、画像などを調べる方法を紹介します。キャプチャした通信が暗号化されていなければWiresharkで実際のデータを復元することができます。
私の自宅に設置しているrtx1200の管理画面へwebアクセスしたパケットをサンプルにデータの復元を行います。「File」タブから「Export Objects」を選択します。
取得したいデータを選択して「SAVE」します。今回は「title_rtx1200.jpg」を保存して開いてみました。下記のように管理画面で利用される画像のデータ復元をすることができました。接続して得られたwebページの情報(index.html)も取得することでどんな情報を得ていたのかを知ることができます。
ディスプレイの時間(時刻)をキャプチャした時刻に変える
pcapで取得したデータは時刻表記がされており、No1のデータを基準に時刻表記がされています(デフォルト設定)。一方でパケット解析をする際に、取得した時刻で調査したいという状況もあるかと思います。そこで、Wiresharkで表記される時刻をパケットを取得した時刻に切り替える方法を紹介します。「View」のタブから「Time Display Format」を選択します。
任意の時刻表記方法を選択します。ここでは「YYYY-MM-DD HH:MM:SS」表記にしてみました。
Displayに表示されている項目からフィルターを掛ける
先に記載したようにpcapで取得したデータにはほしい情報以外にも多くの通信が含まれている可能性が高いです。そこで必要な情報のみに絞って情報を抽出したいと思います。Wiresharkでは表示されているDisplayから抽出したい項目を右クリックで簡単にフィルターを掛けることができます。また任意の文字列も検索できる機能があるので紹介します
送信元IPアドレスを表示されいるDisplayから選択してフィルターを行います。今回はSourceの「192.168.x.x」にカーソルを当てて右クリックから「Apply as Filter」>「Selected」を押下します。検索窓に選択した送信元IPアドレスで検索クエリが表示されます。
またパケット内容についても同様に右クリックから簡単にデータを抽出することができます。ここでは自分で記載すると面倒なユーザーエージェントの情報を抽出してみます。先ほどと同様にパケット内容に記載されている「User-Agent」の部分にカーソルを当てて右クリックします。「Apply as Filter」>「Selected」を押下すると選択した項目で検索窓にクエリが表示されます。なおクエリ文では「==」を利用されていますが、「contains」「matchs」などに置き換えることで検索の幅を広げることができます。
データ内に任意の文字列が含まれているパケットを抽出する
検索したい文字列が含まれているかどうかをpcap全体で調べたいときに便利な機能です。
「View」>「Find Packet…」をクリックします。次に検索窓の下に新しい検索窓ができます。「Packet details」を選択して「String」を選び検索窓に任意の文字列を入れることでデータ内に含まれる情報を検索することができます。ここではあらかじめPacket commentsに「This is sample comment」と準備しておきましたので、こちらを検索してみました。
関連する一連のデータ情報(ストリーム)を抽出する
パケットはクライアントからサーバへの通信があり、その返信をサーバからクライアントに通信するように複数回やり取りが実施されます。この一連の流れ(ストリーム)を抽出する方法を紹介します。調査したいポケットを選択して右クリックし「Follow」を選択します。サーバへ通信したTCP Streamの情報を抽出してみます。
よく使いそうなフィルターについてまとめてみた
ネットワーク調査やセキュリティ調査をする時によく使いそうなフィルターを次の表にまとめてみました。
フィルター | 説明 | 備考 |
ip | IPパケットに絞って表示する | |
ip.addr == x.x.x.x | x.x.x.xのIPパケットに絞って表示する | |
ip.addr == x.x.x.x/24 | x.x.x.x/24のサブネットに所属するIPアドレスのパケットに絞って表示する | |
ip.src == x.x.x.x | 送信元のIPアドレスがx.x.x.xのパケットに絞って表示する | |
ip.dst == x.x.x.x | 送信先のIPアドレスがx.x.x.xのパケットに絞って表示する | |
tcp.port == xx | TCPのxxポートで通信したパケットに絞って表示する | |
tcp.srcport == xx | TCPのxxポートから発信されたパケットに絞って表示する | |
tcp.dstport == xx | TCPのxxポートに発信されたパケットに絞って表示する | |
tcp.flags == x | TCPにセットされたフラグ:xのパケットに絞って表示する | 2:SYN 16:ACK 18:SYN+ACK 4:RST 20:RST+ACK 1:FIN |
tcp.window_size <= xxxx | TCPのウィンドウズサイズがxxxx以下のパケットに絞って表示する | TCPスキャンをするときは1024バイト以下になることが多い |
udp.port == xx | UDPのxxポートで通信したパケットに絞って表示する | |
udp.srcport == xx | UDPのxxポートから発信されたパケットに絞って表示する | |
udp.dstport == xx | TCPのxxポートに発信されたパケットに絞って表示する | |
http | HTTPパケットに絞って表示する | |
http.response.code == xxx | HTTPの応答が200だったパケットに絞って表示する | 200:OK 401:認証失敗 403:アクセス権なし 404:存在しないURL 500:サーバ側のエラー 502:経路上での問題 |
http.request.method == “xxx” | 送信先に対してxxxでHTTPリクエストしたパケットに絞って表示する | GET:参照 POST:新規作成 PUT:更新 PATCH:一部更新 DELETE:削除 |
http.user_agent contains “xxx” | HTTPのパケットでユーザエージェントにxxxが含まれるパケットに絞って表示する | |
http.request.uri contains “xxx” | HTTPパケットでxxxが含まれるURIを指定したパケットに絞って表示する | |
dns | DNSパケットに絞って表示する | |
dns.flags.respomse == x | DNSのフラグ番号に絞って表示する | 0:DNSクエリ 1:DNS応答 |
dns.qry.type == x | DNSのクエリタイプに絞って表示する | 1:Aレコード 2:NSレコード 5:CNAME 12:PTRレコード 15:MXレコード 16:TXTレコード 28:AAAAレコード |
dns.qry.name.len > xx | DNSのパケットで名前がxx文字以上のクエリに絞って表示する | サブドメインに攻撃コードを仕込む場合に名前部分が長くなる |
contains | 大文字、小文字を区別した特定の文字列が含まれるパケットに絞って表示する | 例:http.server contains “Apache” |
matches | 大文字、小文字を区別せずに正規表現のパターンで検索した結果に絞って表示する | 例:http.host matches “\.(php|html)” ¥:エスケープ ^:頭文字 $:末尾文字 ():グルーピング |
in | 特定の範囲内に合致する結果に絞って表示する | 例:tcp.port in {80 443 8080} |
string | 文字列に変換して比較演算子が使えるようにする | 例:string(frame.number) matches “[13579]$” 奇数で終わる番号 |
icmp.type==3 and icmp.code==3 | ICMPパケットが到達不能、ポート到達不能のパケットに絞って表示する | UDPパケットが閉じているパケットを示す ※逆に左記のパケットが無いUDPについてはオープンしていること示す |
arp | arpパケットに絞って表示する | |
arp.duplicate-address-detected or arp.duplicate-address-frame | ARPポイズニングのパケットの可能性があるパケットに絞って表示する | |
((arp) && (arp.opcode == 1)) && (arp.src.hw_mac == target-mac-address) | ARPフラッディングの可能性があるパケットに絞って表示する | |
dhcp | DHCPのパケットに絞って表示する | |
dhcp.option.dhcp == x | DHCPのオプションに絞って表示する | 3:Request 5:ACK 6:NAK |
dhcp.option.hostname contains “xxx” | DHCPのパケットでホスト名:xxxが含まれるパケットに絞って表示する | |
ftp | ftpパケットに絞って表示する | |
ftp.response.code == xxx | ftpパケットでコード:xxxに絞って表示する | 211:システムステータス 212:ディレクトリステータス 213:ファイルステータス 230:ユーザログイン 430:ユーザ名またはPWが無効 530:ログインNG、PWが無効 |
ftp.request.command == “xxx” | ftpで実行されたコマンドを含むパケットに絞って表示する | ユーザ名、パスワード、コマンド(cwd、list) |
ftp.response.arg contains “xxx” | ftpリクエストでxxxが含まれる文字列に絞って表示する |
認証情報を含む可能性があるパケットを調査する
Wiresharkはパケットを調査するだけのツールなので怪しい通信を検知する機能は持っていません。しかし、ユーザが認証情報を含む通信をしている可能性がある通信といった怪しい行動につながる可能性のあるパケットについて、検索を支援するツールがあります。「Tools」>「Credentials」から確認することができます。プロトコルごとに通信したパケットの一覧で表示されます。下図の場合ですと、HTTPでベーシック認証かつユーザ名がadminで通信されたパケットを抽出してくれています。クリックすると当該パケットを表示してくれます。
まとめ
今回ネットワーク調査やセキュリティ調査を行う際に重宝されるWiresharkの実践で使えるTipsを紹介しました。素早く調査するために日頃から操作方法を慣れておき、いざというときに有効活用できるようにしておきたいと思います。
これまでにpcapファイルの全体像を把握することや通信されたページ、ファイル等の確認方法、フィルターの掛け方について紹介しました。今後も有効な情報があれば、随時追加していきます。
コメント