Wiresharkで使えるTipsをまとめてみた

 ネットワークパケットの解析やセキュリティ調査を行う際に重宝される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の情報を抽出してみます。

よく使いそうなフィルターについてまとめてみた

ネットワーク調査やセキュリティ調査をする時によく使いそうなフィルターを次の表にまとめてみました。

フィルター説明備考
ipIPパケットに絞って表示する
ip.addr == x.x.x.xx.x.x.xのIPパケットに絞って表示する
ip.addr == x.x.x.x/24x.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 == xxTCPのxxポートで通信したパケットに絞って表示する
tcp.srcport == xxTCPのxxポートから発信されたパケットに絞って表示する
tcp.dstport == xxTCPのxxポートに発信されたパケットに絞って表示する
tcp.flags == xTCPにセットされたフラグ:xのパケットに絞って表示する2:SYN
16:ACK
18:SYN+ACK
4:RST
20:RST+ACK
1:FIN
tcp.window_size <= xxxxTCPのウィンドウズサイズがxxxx以下のパケットに絞って表示するTCPスキャンをするときは1024バイト以下になることが多い
udp.port == xxUDPのxxポートで通信したパケットに絞って表示する
udp.srcport == xxUDPのxxポートから発信されたパケットに絞って表示する
udp.dstport == xxTCPのxxポートに発信されたパケットに絞って表示する
httpHTTPパケットに絞って表示する
http.response.code == xxxHTTPの応答が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を指定したパケットに絞って表示する
dnsDNSパケットに絞って表示する
dns.flags.respomse == xDNSのフラグ番号に絞って表示する0:DNSクエリ
1:DNS応答
dns.qry.type == xDNSのクエリタイプに絞って表示する1:Aレコード
2:NSレコード
5:CNAME
12:PTRレコード
15:MXレコード
16:TXTレコード
28:AAAAレコード
dns.qry.name.len > xxDNSのパケットで名前が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==3ICMPパケットが到達不能、ポート到達不能のパケットに絞って表示するUDPパケットが閉じているパケットを示す
※逆に左記のパケットが無いUDPについてはオープンしていること示す
arparpパケットに絞って表示する
arp.duplicate-address-detected or arp.duplicate-address-frame
ARPポイズニングのパケットの可能性があるパケットに絞って表示する
((arp) && (arp.opcode == 1)) && (arp.src.hw_mac == target-mac-address)ARPフラッディングの可能性があるパケットに絞って表示する
dhcpDHCPのパケットに絞って表示する
dhcp.option.dhcp == xDHCPのオプションに絞って表示する3:Request
5:ACK
6:NAK
dhcp.option.hostname contains “xxx”DHCPのパケットでホスト名:xxxが含まれるパケットに絞って表示する
ftpftpパケットに絞って表示する
ftp.response.code == xxxftpパケットでコード: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ファイルの全体像を把握することや通信されたページ、ファイル等の確認方法、フィルターの掛け方について紹介しました。今後も有効な情報があれば、随時追加していきます。

コメント

タイトルとURLをコピーしました