本稿ではWiresharkがより使いやすいものになるようなヒントをお教えします。今回は、感染したWindowsホストからの悪意のあるネットワークトラフィックのpcapを確認するときに役立つと思われるフィルタ設定について説明します。
チュートリアルで利用するpcapはこちらから入手してください。
なお本チュートリアルでは、Wiresharkを効果的に使用する上での前提となるネットワークトラフィックの基本について、皆さんがすでに理解していることを前提としています。また、マルウェア感染がおこる仕組みについての基本的な理解も前提としています。
本稿は、悪意のあるネットワークトラフィックを分析する方法の包括的なチュートリアルではなく、Wiresharkの表示フィルタについてのヒントとこつをいくつか示すことを目的としています。この点についてはご了承ください。
今回のチュートリアルでは、以下について説明します。
- 感染トラフィックの痕跡
- Wiresharkの表示フィルタ
- フィルタの保存
- Web経由の感染トラフィック用フィルタ
- 他の種類の感染トラフィック用フィルタ
感染トラフィックの痕跡
このチュートリアルでは、「悪意のあるスパム(マルスパム)やWebトラフィックなどが大量に配信したWindowsを対象とする商用マルウェアからの感染トラフィック」をサンプルとして使用します。こうした感染では、Windowsホストがマルウェア(通常はWindows実行可能ファイル)に感染するまでに、さまざまな経路を通ることが考えられます。
こうしてさまざまな経路を通った感染トラフィックの痕跡は「IOC(侵害の痕跡)」と呼ばれます。セキュリティの専門家は、感染時にマルウェアが生成するネットワークトラフィックからこうした「感染の痕跡」情報を抽出し、見つかったURL、ドメイン名、IPアドレス、プロトコル、ポートなどの感染トラフィックの痕跡を文書に記録していきます。
Wiresharkの表示フィルタを適切に使用すると、これらの痕跡を素早く見つけることができます。
Wiresharkの表示フィルタ
本稿で説明する「Wiresharkの表示フィルタ」とは、[Packet List] ペインの上にある[Filter]ツールバーに入力するフィルタの内容を指しています。ここには、Wiresharkがpcapファイルから読み出して表示するフレーム、IPパケット、TCPセグメントをフィルタリング(絞り込み表示)するための式を入力します。
表示フィルタにテキストを入力すると、Wiresharkは、入力したテキストに基づいて候補のリストを表示します。表示フィルタの背景色が赤いとき、入力した式はまだそのままでは利用できない状態です。
この色が緑に変われば、入力内容は式として利用でき、正しく動作します。表示フィルタの背景色が黄色の場合、式は受け入れられていても、おそらく意図したとおりには動作しません。
Wiresharkの表示フィルタには、ブール式を利用できます。つまり、複数の式を指定して連結できます。一般に使用される式を次に示します。
- 等号: ==またはeq
- 論理積: &&またはand
- 論理和: ||(2本の縦線)またはor
ブール式を利用した式のサンプルを次に示します。
- ip.addr eq 192.168.10.195 and ip.addr == 192.168.10.1
- http.request && ip.addr == 192.168.10.195
- http.request || http.response
- dns.qry.name contains microsoft or dns.qry.name contains windows
ある値の除外を指定をしたい場合フィルタ式に「!=」は使用しません。たとえば「IPアドレス192.168.10.1を含まないすべてのトラフィックを指定する」場合のフィルタ式は「!(ip.addr eq 192.168.10.1)」です。「ip.addr != 192.168.10.1」と指定すると正しく動作しません。
Web経由の感染トラフィック用フィルタ
pcapでWebトラフィックをすばやく確認する方法として、次のフィルタ式をよく利用します。
http.request or ssl.handshake.type == 1
「http.request」はHTTPリクエストのURLを検出し、「ssl.handshake.type == 1」はHTTPSまたはSSL/TLSトラフィックで使用されているドメイン名を検出します。
前回のチュートリアルで使った pcap サンプル(traffic-for-wireshark-column-setup.pcap)には、2018年8月に「college.usatoday[.]com」からユーザーがURLを表示したときに生成されたWebトラフィックが含まれています。またpcapの内容からユーザーはWindows 10コンピュータでMicrosoftのEdge Webブラウザを使用していることが確認できます。「http.request or ssl.handshake.type == 1」でフィルタリングすれば、このWebトラフィックのイベントのフローが表示されました。
今回のチュートリアルの1つめのサンプル Using-Wireshark-diplay-filters-Emotet-with-IcedID.pcap には、Windows 7ホスト上で生成したトラフィックのパケット キャプチャ ファイルが含まれています。その中には、感染トラフィックとは無関係な通常通信で生成されるUDPポート1900番(1900/udp)経由のHTTPリクエストもあります。
1900/udp経由のHTTPトラフィックはSSDP(Simple Service Discovery Protocol)が生成しているもので、SSDPはプラグ アンド プレイ デバイス検出に使用されているプロトコルです。
この1900/udpの通信はいわゆる一般的なwebトラフィックとは関連しないものなので、表示されてほしくありません。そこで、前回のチュートリアルで指定した「http.request or ssl.handshake.type ==1」だけでなく、次の複合フィルタ式でこの不要なHTTPリクエストを除外することにしましょう。
Using-Wireshark-diplay-filters-Emotet-with-IcedID.pcap をWiresharkで開き、[Filter]ツールバーに次の式を入力してください。
(http.request or ssl.handshake.type == 1) and !(udp.port eq 1900)
なお、次のフィルタ式でも同じ結果を得ることができます。
(http.request or ssl.handshake.type == 1) and !(ssdp)
このようにSSDPによる活動をフィルタリングして除外することで、感染Windows 7ホストのpcapに含まれる感染に関連したトラフィックをより確認しやすくなります。
下図は今開いたUsing-Wireshark-diplay-filters-Emotet-with-IcedID.pcapからのもので、Windows 7ホストでの2018年12月3日のEmotetの活動とIcedIDの感染トラフィックを示しています。
この図では、SSDPリクエストを含むWebトラフィックがフィルタリングして表示されています。
下図は、同じpcapでSSDPリクエストを除外してWebトラフィックをフィルタリングした場合を示しています。これにより、感染活動をより明確に表示できます。
上図から、感染トラフィックの痕跡の一部を確認できますが、ここには表示されていない痕跡もあります。場合によっては、感染したホストが、オフラインのサーバーやTCP接続を拒否するサーバーに接続を試みていた可能性もあるのです。こうした接続試行の様子は、フィルタに「tcp.flags eq 0x0002」を追加してTCP SYNセグメントを含めれば表示することができます。
ではファイルUsing-Wireshark-diplay-filters-Emotet-with-IcedID.pcapに、今度は次のフィルタを適用してみましょう。
(http.request or ssl.handshake.type == 1 or tcp.flags eq 0x0002) and !(udp.port eq 1900)
検索対象にTCP SYNセグメントを含めると、図8に示すように、TCPポート8443番(8443/tcp)経由でIPアドレス217.164.2[.]133に接続しようとする感染ホストの様子が明らかになります。
他の種類の感染トラフィック用フィルタ
場合によっては、感染後のトラフィックがwebベースではないトラフィックを使い、コマンド アンド コントロール(C2)サーバーに接続しようとすることがあります。これらのC2サーバーは IPアドレスを使って直接ホスティングされる場合と、ドメイン名をもつサーバーにホスティングされる場合があります。たとえばNanocoreリモート アクセス ツール(RAT)由来のC2トラフィックなどのように、感染後の活動がHTTPでもなければHTTPS/SSL/TLSトラフィックでもないものがあります。
このため、C2サーバーが利用するドメインがトラフィック内でアクティブになっているかどうかをpcapで確認することを目的に、DNS活動もフィルタに追加することがよくあります。これを追加すると以下のフィルタ式になります。
(http.request or ssl.handshake.type == 1 or tcp.flags eq 0x0002 or dns) and !(udp.port eq 1900)
では、Wiresharkで新しいサンプルファイルUsing-Wireshark-diplay-filters-Nanocore-RAT.pcapを開き、上記の式でフィルタリングをしてください。
下図は、上記のフィルタ式を使用してpcapを確認したところです。ここから、脆弱なWindowsホストに感染するため、www.mercedes-club-bg[.]comからNanocore RAT実行可能ファイルがダウンロードされていることがわかります。この最初のダウンロードに続き、185.163.45[.]48に名前解決されるfranex.sytes[.]net、95.213.251[.]165に名前解決されるfranexserve.duckdns[.]orgに対してTCP接続が試みられています。
下図は、DNSクエリとTCPトラフィックの相関関係を示しています。
一部の感染トラフィックは、Wiresharkによって容易にデコードできる、一般的なプロトコルを使用しています。下図はサンプルファイルUsing-Wireshark-diplay-filters-FTP-malware.pcapをWiresharkで開いたところで、このマルウェア実行可能ファイルが原因で発生する感染後のFTPトラフィックを示しています。
DNSトラフィックやTCP SYNフラグもチェックする標準的なWebトラフィック検索用フィルタを指定すれば、ftp.totallyanonymous[.]comに対するDNSクエリの後に、TCPポート21およびその他のTCPポートを経由したトラフィックも見つかります。
FTPトラフィックの場合、表示フィルタにftpと指定することができます(下図参照)。このpcapをftpでフィルタリングすると、感染したWindowsホストがtotallyanonymous.comでFTPアカウントにログインし、fc32.exeおよびo32.exeという名前のファイルを取得していることがわかります。
下図に示すように、後のFTPトラフィックまでスクロールしていくと、ほぼ毎分FTPサーバーに送信される6R7MELYD6という名前のファイルが見つかります。さらに調べると、6R7MELYD6には、感染したWindowsホストから窃取したパスワード データが含まれていることがわかります。
マルウェアは、悪意のあるトラフィックとしてFTP以外の一般的なプロトコルも使用することがあります。
スパムボット マルウェアは、毎分数十件から数百件の電子メール メッセージを送信することを目的としたスパムボットに感染ホストを変えてしまいます。特徴として、いくつかのDNSリクエストがさまざまな電子メール サーバーに送られた後、25/tcp、465/tcp、587/tcp、または電子メール トラフィックに関連するそれ以外のTCPポートでSMTPトラフィックが発生します。
このフィルタ式を再度試してみましょう。
今度は、サンプルファイルUsing-Wireshark-diplay-filters-spambot.pcapを開いて、次のフィルタ式を適用してみてください。
(http.request or ssl.handshake.type == 1 or tcp.flags eq 0x0002 or dns) and !(udp.port eq 1900)
スパムボット トラフィックを確認すると、メール サーバーに対するDNSクエリと、前述した、SMTP関連ポートに対するTCPトラフィックが見つかります。
smtpをフィルタ式として使用してみましょう。ここからいくつかのことがわかります。まず、STARTTLSを見つけても、おそらくは暗号化されたSMTPトラフィックなので電子メール データを確認することはできません。
ここ数年、スパムボットの電子メール トラフィックは、ほとんどが暗号化されたSMTPです。ですが、以下のような電子メールの一般的な見出しで文字列を検索すると、暗号化されていないSMTPトラフィックも見つかることがあります。
- smtp contains “From: "
- smtp contains “Message-ID: "
- smtp contains “Subject: "
Wiresharkの表示フィルタでは大文字と小文字が区別されることに注意してください。暗号化されていないSMTP通信でスパムボット トラフィックを検索するとき、よく「smtp contains “From: “」をフィルタ式として使用します。Using-Wireshark-diplay-filters-spambot.pcapを開いた状態で、このフィルタ式を入力してみてください。下図に示したパケットが見つかるでしょう。
SMTPトラフィックのフィルタリングしたら、表示されたフレームのいずれかを選択してTCPストリームを追跡して内容を確認してみましょう。
表示されているフレームのいずれかひとつを選択して右クリックし、表示されたコンテキストメニューで[追跡]、[TCP ストリーム]の順にクリックします。これでそのフレームに関連するSMTP通信の内容が表示されるので、スパムボットから送信された電子メールの1つ(たとえば下図の例ではericrene.malherbe@wanadoo[.]fr)が見つかります。
フィルタの保存
フィルタ式のなかには毎回入力するのが非常に面倒なものもあります。それらはフィルタ ボタンとして保存しておくことができます。Wiresharkのフィルタ バーの右側には、フィルタ ボタンを追加するための[+]ボタンがあります。
[+]をクリックして、フィルタ式をフィルタ ボタンとして保存します。以下のフィールドが表示されます。
- Label(ラベル)
- Filter(フィルタ)
- Comment(コメント)
「Comment(コメント)」の記入は任意です。また、[Filter(フィルタ)]には、Wiresharkの[Filter]タスクバーに現在入力されている内容がデフォルトで設定されます。「Label (ラベル)」に入力したら、[OK]をクリックします(下図参照)。
前記の画像では、(http.request or ssl.handshake.type == 1) and !(udp.port eq 1900)というフィルタについて「basic」と入力し、基本フィルタとして保存しました。下図では、「basic」というラベルのフィルタ ボタンが、+記号の右側に表示されています。
Wiresharkにおける標準的なフィルタ設定として、以下のフィルタ ボタンを作成しています。
- basic (http.request or ssl.handshake.type == 1) and !(udp.port eq 1900)
- basic+ (http.request or ssl.handshake.type == 1 or tcp.flags eq 0x0002) and !(udp.port eq 1900)
- basic+DNS (http.request or ssl.handshake.type == 1 or tcp.flags eq 0x0002 or dns) and !(udp.port eq 1900)