This post is also available in: English (英語)
概要
本シリーズは、疑わしいネットワークアクティビティの調査やネットワークトラフィックのパケットキャプチャ(pcap)の確認を業務で行っておられるセキュリティ専門家を読者として想定しています。このため本稿での手順説明は読者の皆さんがWiresharkの使いかたをご存知であることを前提としています。また、本稿にて利用するWiresharkのバージョンは主に3.xとなります。
Emotetは情報窃取型のマルウェア (インフォスティーラ) で、バンキングマルウェアとして2014年に最初に報告されました。それ以来、ドロッパなどの機能を追加して進化をかさね、Gootkit、IcedID、Qakbot、Trickbotなど、ほかのマルウェアファミリを配布するようになってきています。
今回のパケット解析講座では、Emotetのアクティビティを確認し、トラフィック分析から本マルウェアを特定するのに役立つヒントを提供していきます。
注意: 本チュートリアルは、以前の『Wireshark によるパケット解析講座1: Wiresharkの表示列をカスタマイズする』で設定したカスタマイズ済みの列表示を使います。また、本チュートリアルで使うpcapファイルの入ったZIPアーカイブを格納しているGithubリポジトリからサンプルファイルをあらかじめ取得しておいてください。解凍用パスワードは「infected」です。
注意: 本稿のチュートリアルに利用するpcapファイルはWindowsで動作するマルウェアを含んでいます。したがって、Windowsコンピュータを使っている場合感染リスクがあります。できるかぎり BSD系、Linux系、macOSなど、Windows環境以外の環境でpcapファイルを確認することをお勧めします。
Emotetによる感染イベント チェーン
Emotetのネットワークトラフィックを理解するには、感染につながる一連のイベントを理解しておく必要があります。Emotetはたいてい悪意のあるスパム(マルスパム)を介して配布されており、脆弱なWindowsホストに感染するように設計されたマクロを含むMicrosoft Wordドキュメントがその感染チェーンの重要ステップとなっています。
Emotetを拡散させるマルスパムはさまざまな手法でこれらWordドキュメントを配布します。
マルスパムには、添付ファイルとしてMicrosoft Word文書が含まれている場合もあれば、Word文書を含む添付ZIPアーカイブが含まれている場合もあります。ここ数ヶ月では、これらZIPアーカイブがパスワードで保護されている例が複数観測されています。Emotetを配布する電子メールのなかには、添付ファイルがないものもあり、その場合かわりにWord文書をダウンロードするリンクが含まれています。
過去数年間、Emotetをプッシュするマルスパムは、これらのEmotet Wordドキュメントを配信する目的で、リンクを埋め込んだPDF添付ファイルも使用していました。
図2にこれら4つの配布手法を示します。
Word文書の配信後、被害者が文書を開き、脆弱なWindowsホスト上でマクロを有効にした場合、そのコンピュータはEmotetに感染します。
トラフィックの観点でみると、Emotet用WordドキュメントからEmotet感染へいたるステップは次のようなものであることが確認されています。
- 初期バイナリを取得するWebトラフィック
- HTTPによるエンコードないし暗号化されたコマンド&コントロール(C2)トラフィック
- Emotetがフォローアップマルウェアをドロップしてくる場合は追加の感染トラフィック
- Emotetが感染ホストをスパムボットとして使用する場合はSMTPトラフィック
図3はEmotetへの感染で検出されることのあるネットワークアクティビティをフローチャートにしたものです。
2020年12月21日以降、Emotetの初期バイナリはWindowsDLLファイルでした。それ以前のバイナリはWindows 実行可能ファイル (EXE) でした。
EmotetのC2トラフィックは、HTTPを介して送信されるエンコードないし暗号化されたデータで構成されています。このC2アクティビティはHTTPトラフィックに関連付けられた標準・非標準のTCPポートを使うことがあります。このC2アクティビティはこのほか、データ漏出や、初期Emotetバイナリ更新のためのトラフィックで構成されていることもあります。
Emotetはマルウェアドロッパでもあるので、被害者は他のマルウェアにも感染する可能性があります。アナリストは、Emotet感染ホストからのトラフィックを調査するにあたり、他のマルウェアからのトラフィックについても検索すべきです。
最後に、Emotet感染ホストは、25/tcp、465/tcp、587/tcpなどのSMTPに関連付けられたTCPポートを介し、大量のトラフィックを生成するスパムボットになる可能性もあります。
Emotetの感染アクティビティを含むPcapファイル
最近のEmotet感染トラフィックのpcapを含む5つのパスワード付きZIPアーカイブ(パスワードは「infected」)をこちらのGitHubリポジトリから取得してください。Githubページに移動して、ZIPアーカイブのエントリをクリックし、図4と図5に示す手順でダウンロードします。
本ZIPアーカイブファイルを解凍するパスワードは「infected」です。展開すると次の5つのpcapファイルが作成されます。
- Example-1-2021-01-06-Emotet-infection.pcap
- Example-2-2021-01-05-Emotet-with-spambot-traffic-part-1.pcap
- Example-3-2021-01-05-Emotet-with-spambot-traffic-part-2.pcap
- Example-4-2021-01-05-Emotet-infection-with-Trickbot.pcap
- Example-5-2020-08-18-Emotet-infection-with-Qakbot.pcap
例1: Emotet感染トラフィック
Example-1-2021-01-06-Emotet-infection.pcapを開いたら、『Wireshark によるパケット解析講座 2: 脅威インテリジェンス調査に役立つフィルタリング設定』のチュートリアルで解説した「basic」の web 用フィルタを適用します。Wireshark 3.xでのbasicフィルタは次のとおりです。
(http.request or tls.handshake.type eq 1) and !(ssdp)
シリーズ初回の『Wireshark によるパケット解析講座 1: Wiresharkの表示列をカスタマイズする』に従ってWiresharkを設定すると、図6のような表示となります。
図6に示すように、最初の5つのHTTP GETリクエストは、初期Emotet DLLの取得に使われる4つのURLを表しています。それらのトラフィックは次のとおりです。
- hangarlastik[.]com GET /cgi-bin/Ui4n/
- hangarlastik[.]com GET /cgi-sys/suspendedpage.cgi
- padreescapes[.]com GET /blog/0I/
- sarture[.]com GET /wp-includes/JD8/
- seo.udaipurkart[.]com GET /rx-5700-6hnr7/Sgms/
最初の2つのURLからは、hangarlastik[.]comに以前ホスティングされていたEmotet DLLファイルがすでに存在しないことがわかります。その確認には、これらの各リクエストについてTCPストリームを追跡し、各HTTP GETリクエストへのレスポンスを確認してみてください。
HTTP レスポンスを確認する簡単な方法は、先程適用したWiresharkの「basic」Webフィルタに、HTTPレスポンスのフィルタを追加してやることです (下記の強調部分)。
(http.request or http.response or tls.handshake.type eq 1) and !(ssdp)
これにより、HTTP レスポンスが[Info]列に表示されます (図7参照)。
これで、WordマクロがEmotet DLLを取得しようとしたときに何が起こったのかがより明確になりました。
- hangarlastik[.]com GET /cgi-bin/Ui4n/
- HTTP/1.1 302 Found
- hangarlastik[.]com GET /cgi-sys/suspendedpage.cgi
- HTTP/1.1 200 OK
- padreescapes[.]com GET /blog/0I/
- HTTP/1.1 401 Unauthorized
- sarture[.]com GET /wp-includes/JD8/
- HTTP/1.1 403 Forbidden
- seo.udaipurkart[.]com GET /rx-5700-6hnr7/Sgms/
唯一、「200 OK」となったレスポンスは、hangarlastik[.]comからの、サスペンドされたページに関する通知へのリプライです。
seo.udaipurkart[.]comへのHTTP GETリクエストにはレスポンスが表示されていないので、このリクエストへのTCPストリームを追跡してみましょう(図8参照)。
エクスポートされたDLLのSHA256ハッシュ値は次のとおりです。
8e37a82ff94c03a5be3f9dd76b9dfc335a0f70efc0d8fd3dca9ca34dd287de1b
EmotetのC2トラフィックは、HTTP POSTリクエストを使用して送信されるエンコードされたデータです。これらのリクエストは、次のフィルタを使用するとWiresharkで簡単に見つけることができます。
http.request.method eq POST
このフィルタの適用結果を図11に示します。
1つ目のpcapでは、EmotetのC2トラフィックは次のHTTP POSTリクエストで構成されています。
- 5.2.136[.]90 (80/tcp)
- 167.71.4[.]0 (8080/tcp)
EmotetはC2トラフィックに2種類のHTTP POSTリクエストを生成します。1種類目のPOSTリクエストはHTTP /1.1で終わるもので、2種類目のPOSTリクエストはHTTP/1.1 (application/x-www-form-urlencoded)で終わるものです。
16:42:34 UTCの1つ目の5.2.136[.]90へのHTTPリクエストのTCPストリームを追跡して、1種類目のC2 POSTリクエストの例を確認しましょう (図12参照)。
図12はこのPOSTリクエストが、エンコードないし暗号化されたバイナリのように見える約6KBのフォームデータを送信する様子を示しています。HTTPレスポンスまで下にスクロールし、サーバーから返されたエンコードされたデータを確認しましょう。図13は、このエンコードされたデータのはじまりを示しています。
この種のエンコードないし暗号化されたデータが、Emotetボットネットサーバーと感染Windowsホストとでデータを交換する方法です。これはまた、EmotetがEmotet DLLを更新してフォローアップマルウェアをドロップするために使用するチャネルでもあります。
Emotet C2トラフィックの2種類目のHTTP POSTリクエストは、1種類目とはかなり異なって見えます。Wiresharkで次のフィルタを使用すると、この2種類目のHTTP POSTリクエストを容易に見つけることができます。
urlencoded-form
このフィルタにより、8080/tcp経由の167.71.4[.]0への2つのHTTP POSTリクエストが表示されます (図14参照)。
16:58:43 UTC に発生したこれら2つのHTTP POSTリクエストのうち、1つ目のTCPストリームを追跡してトラフィックを確認します。その結果を図15に示します。
図15に示したように、POSTリクエストで送信されるデータの一部は、URLエンコードによりbase64文字列としてエンコードされています。例えば、%2Bが「+」記号を、%2Fが「/」を、%3Dが「=」を表すのに使用される、といったぐあいです。
サーバーからのレスポンスとして送信されるデータは、エンコードまたは暗号化されています。
1つ目のpcapには、フォローアップマルウェアなどの重要アクティビティは含まれていません。
ほかの唯一のアクティビティは、443/tcp経由で46.101.230[.]194への接続試行を繰り返していることです。このアクティビティは、Retransmission (再送信) のTCP SYNセグメントをフィルタリングすることで簡単に見つかります。そのためには、次のWiresharkフィルタを使用します。
tcp.analysis.retransmission and tcp.flags eq 0x0002
結果を図16に示します。
インターネットで46.101.230[.]194を検索すれば、このIPアドレスがEmotetのC2アクティビティに使用されてきたものであることが明らかになるでしょう。
このpcap内の残りのトラフィックはMicrosoft Windows10ホストが生成したシステム トラフィックです。
次の2つ目のpcapではスパムボット アクティビティを行うEmotet感染について調べていきます。
例2: スパムボットトラフィックを含む Emotet パート1
Example-2-2021-01-05-Emotet-with-spambot-traffic-part-1.pcapをWiresharkで開いて、「basic」Webフィルタを適用します(図17参照)。
1つ目のサンプル同様、Emotet C2トラフィック発生前に複数のHTTP GETリクエストを受信しています。これらのGETリクエストは、Webトラフィック経由で最初のEmotet DLLをダウンロードしようとしています。列表示した最初のフレームには、obob[.]tvへのHTTPSトラフィックが表示されていますが、これがおそらく最初のEmotet DLLへのWebリクエストだと考えられます。というのも、このドメインは、2021年1月5日にEmotetバイナリをホスティングしていたことが報告されており、その日付はこのpcapの日付と同一だからです。
miprimercamino[.]comへのHTTP GETリクエストのTCPストリームを追跡し、これがEmotet DLLを返したことを確認してください。1つ目のpcapの図9で示したものと似たインジケータが表示されるはずです。miprimercamino[.]comから返されたEmotet DLLは、図18に示した手順でエクスポートできます。
2つ目のpcapからエクスポートしたDLLのSHA256ハッシュ値は次のとおりです。
963b00584d8d63ea84585f7457e6ddcac9eda54428a432f388a1ffee21137316
ここでもEmotetはC2トラフィックに2種類のHTTP POSTリクエストを生成します。Emotet C2トラフィックのそれぞれの種類のHTTP POSTリクエストをフィルタリングするには、次のWiresharkフィルタを使います。
- 1種類目: http.request method eq POST and !(urlencoded-form)
- 2種類目: urlencoded-form
これらのフィルタで返されるHTTP POSTリクエストのTCPストリームを追跡し、2つ目のpcapでも1つ目のpcapで見たのと同じトラフィック パターンが見られることを確認してください。
pcap内でEmotetのC2トラフィック例をいくつか確認したら、次はスパムボットのアクティビティの確認に移りましょう。
この例では、感染ホストがスパムボットに変えられたため、SMTPトラフィックが含まれています。スパムボットのSMTPトラフィックは暗号化されていますが、「basic」のWebフィルタを使って列表示を下にスクロールすることで簡単に見つけることができます。
このpcapでは、20:06:20 UTC から、25/tcp、465/tcp、587/tcpなどのSMTP電子メールプロトコルに関連付けられたTCPポートへのSSL/TLSトラフィックが表示され始めます (図19参照)。
SMTPでフィルタリングすれば、暗号化されたSMTPトンネルの確立前にSMTPコマンドがいくつかあることがわかります。図20に結果を示します。
Emotetに感染したWindowsホストの生成するスパムボットトラフィックのなかには、暗号化されていないSMTPトラフィックも見つかることがあります。平文のSMTPからはメッセージの内容が確認できますが、スパムボット ホストから送信される暗号化SMTPトラフィックのボリュームは平文のそれとくらべてきわだって大きいことから、Emotet感染ホストのスパムボットメッセージはそのほとんどが暗号化トラフィックに潜んでいるということになります。
この例では暗号化されたSMTPトラフィックのみを確認できます。
なお、次にあげる例はこれと同じ感染の後半のもので、ここでようやく暗号化されていないSMTPが見つかります。
例2: スパムボットトラフィックを含む Emotet パート2
Example-3-2021-01-05-Emotet-with-spambot-traffic-part-2.pcapをWiresharkで開いて、「basic」Webフィルタを適用します(図21参照)。
このpcapでも、Emotet C2トラフィックに対するHTTP POSTリクエストが少なくとも1分に2回表示されています。以前のpcapと同様の暗号化されたスパムボット アクティビティも見つかります。
スパムボット アクティビティでは頻繁に大量のトラフィックが生じます。このpcapには、感染Windowsホスト上での4分42秒にわたるスパムボット アクティビティが記録されていますが、この中には 21MB 超のトラフィックが含まれています。
暗号化されていないSMTPトラフィックをすばやく識別するには次のWiresharkフィルタを使用します。
smtp.data.fragment
図22は、3つ目のpcapに対するこのフィルタの結果を示しています。このフィルタにより、感染Windowsホストが生成した5つのEmotetマルスパムのサンプルが明らかになります。
20:19:54 UTCのfrom: “Gladisbel Mirandaという最後の電子メールのTCPストリームを追跡します。これらのメッセージがどのような形式かを確認しましょう (図23参照)。
Emotetマルスパムのこれら5つのオブジェクトは、Wiresharkのメニューからエクスポートすることができます。図24にしたがって、[File (ファイル)]、[Export Objects (オブジェクトのエクスポート)]、[IMF]の順にクリックします。
これらの電子メールをエクスポートして調べましょう。これも、できればWindows環境以外でやるのをお勧めします。潜在的な被害者からこうした電子メールがどのように見えるかを確認するさいは、Thunderbirdなどの無料電子メールクライアントを使うとよいでしょう。
さて、先に述べたとおり、Emotetはマルウェアダウンローダでもあります。Emotet経由で配布される最も一般的なマルウェアはおそらくTrickbotでしょう。
例4: Trickbotを配布するEmotet感染
Example-4-2021-01-05-Emotet-infection-with-Trickbot.pcapをWiresharkで開いて、「basic」Webフィルタを適用します(図25参照)。
このpcapには、初期Emotet DLLに対するHTTP GETリクエストは含まれていません。ただしbasicフィルタを適用して表示させた最初のフレームには、fathekarim[.]comへのHTTPSトラフィックが表示されています。これがおそらくEmotet DLLへのWebリクエストだと考えられます。というのも、このドメインは、2021年1月5日にEmotetバイナリをホスティングしていたことが報告されており、その日付はこのpcapの日付と同一だからです。
この pcap でも、先の2つのpcapで説明したように、Emotet C2に関連付けらているものと同じ2種類のHTTP POSTリクエストが見つかります。
このpcapには、Trickbot感染のインジケータも含まれています。ここでも「basic」Webフィルタを適用し、下にスクロールしていってTrickbotトラフィックを確認してください (図26参照)。
すでにTrickbot感染トラフィックについては『Wiresharkによるパケット解析講座 5: Trickbot感染の調査』でレビュー済みですが、ここで簡単におさらいしておきましょう。Trickbotの一般的なインジケータには次のものがあげられます。
- 関連するドメインやホスト名のない447/tcpないし449/tcp経由のHTTPSトラフィック
- /81、/83、または/90で終わる、標準/非標準TCPポートを経由したHTTPトラフィックのHTTP POSTリクエスト(データ漏出に関連)
- Emotet感染によるTrickbotの場合、上記のHTTP POSTリクエストは/morで始まり、この後ろに数字 (これまで確認されているのは1桁か2桁のみ) が続く
- 追加のTrickbotバイナリを返す.pngで終わるURLに対するHTTP GETリクエスト
これらのインジケータは次のWiresharkフィルタを適用すると簡単に見つかります。
- tls.handshake.type eq 1 and (tcp.port eq 447 or tcp.port eq 449)
- (http.request.uri contains /81 or http.request.uri contains /83 or http.request.uri contains /90) and http.request.uri contains mor
- http.request.uri contains .png
図27から図29は、上記の各フィルタを適用した結果を示しています。
図28に示した各HTTP POSTリクエストのTCPストリームを追跡し、パスワードデータが窃取されているかどうかを確認しましょう。/90で終わる最後のHTTP POSTリクエストには、感染Windowsホストとその環境に関するデータが含まれています。
図29に示した各HTTP POSTリクエストのTCPストリームを追跡し、Windowsバイナリが返されていないかどうかを確認しましょう。そうすれば、Windows実行可能ファイルが2つ返されていることがわかるはずです。確認後は、これらのバイナリをpcapからエクスポートしましょう。そのためにはこれまでのサンプルと同様に[File (ファイル)]メニューで[Export Objects (オブジェクトのエクスポート)]、[HTTP]の順にクリックします。
これら2つのWindowsバイナリ(いずれも実行可能ファイル)のSHA256ハッシュ値は次のとおりです。
- 59e1711d6e4323da2dc22cdee30ba8876def991f6e476f29a0d3f983368ab461 (mingup.png)
- ed8dea5381a7f6c78108a04344dc73d5669690b7ecfe6e44b2c61687a2306785 (saved.png)
TrickbotはEmotetの配布する最も一般的なマルウェアですが、これ以外のマルウェアが配布されることもあります。Qakbotがそうしたマルウェアの1つで、これもEmotetに感染したWindowsホストによってよくドロップされています。
例5: Qakbotを配布するEmotet感染
Example-5-2020-08-18-Emotet-infection-with-Qakbot.pcapをWiresharkで開いて、「basic」Webフィルタを適用します(図30参照)。
5つ目のpcapでは、Emotet Wordドキュメントが21:23:50 UTCにsawtpranamam.mysquare[.]inから取得されていますが、これは同じ日にEmotet Wordドキュメントをホスティングしていたことが報告されているURLと合致しています。このWordドキュメントをpcapからエクスポートしましょう。そのためには、これまでのサンプルと同様に[File (ファイル)]メニューで[Export Objects (オブジェクトのエクスポート)]、[HTTP]の順にクリックします。
エクスポートしたWordドキュメントのSHA256ハッシュ値は次のとおりです。
- c7f429dde8986a1b2fc51a9b3f4a78a92311677a01790682120ab603fd3c2fcb
samaritantec[.]comへのHTTPSトラフィックが21:24:40 UTCに発生していることも確認できます。このドメインは、同じ日にEmotetバイナリをホスティングしていたことが報告されています。
これまでの例と同様に、Emotet C2トラフィックに関連付けられたものと同じ2種類のHTTP POSTリクエストが見つかります。
このpcapにはこのほかにQakbot感染のインジケータも含まれています。ここでも「basic」Webフィルタを適用し、下にスクロールしていってQakbotトラフィックを確認してください (図31参照)。
すでにQakbot感染トラフィックについては『Wiresharkによるパケット解析講座 7: Qakbot感染の調査』でレビュー済みですが、ここで簡単におさらいしておきましょう。Qakbotの一般的なインジケータには次のものがあげられます。
- HTTPSの標準/非標準TCPポートを介したHTTPSトラフィック
- Qakbot HTTPSトラフィックの証明書データのIssuerフィールドの値が正常な内容とは異なっており、証明書も米国に拠点を置く認証局が発行したものではない
- 65400/tcp経由のTCPトラフィック
- 2020年11月下旬以前はQakbotはよくcdn.speedof[.]meへのHTTPSトラフィックを生成していた
- 2020年11月下旬以前はQakbotはよくa.strandsglobal[.]comへのHTTP GETリクエストを生成していた
これらのインジケータは次のWiresharkフィルタを適用すると簡単に見つかります。
- tls.handshake.type eq 11 and !(x509sat.CountryName == US)
- tcp.port eq 65400
- tls.handshake.extensions_server_name contains speedof
- http.host contains strandsglobal
図32から図35は、上記の各フィルタを適用した結果を示しています。
1つ目のフィルタを適用した結果が図32ですが、ここでは71.80.66[.]107からのトラフィックが列表示されていて、フレームが複数あることが確認できます。各フレームでパケットの詳細ペイン (Packet Details ペイン) を探索し、証明書のIssuerデータに異常があることを確認してください。
図33は、65400/tcp経由のQakbotトラフィックのTCPストリームを1つ表示させたところですが、このストリームには、Qakbot感染WindowsホストのパブリックIPアドレスとボットネット識別文字列が含まれています。
結論
今回はEmotet感染トラフィックを含むpcapを使って同マルウェアのアクティビティを識別する方法を確認しました。最近の5つのpcapを確認し、Emotet感染後のC2トラフィックによって引き起こされるHTTP POSTリクエストに類似点があることを確認できました。これらのパターンは同マルウェアについてかなり特徴的なものなので、これらを使えばネットワーク内のEmotet感染を識別することができます。ここではまた、スパムボット トラフィックや、感染ホストにドロップされた複数のマルウェアファミリなどの、Emotet関連の感染後アクティビティについても確認しました。
疑わしいネットワークアクティビティをセキュリティ専門家が確認するさいにこうした知識があれば、Emotet感染をよりうまく検出・捕捉できるようになります。
『Wiresharkによるパケット解析講座』シリーズの以前の講座は以下から確認してください。
- Wireshark によるパケット解析講座 1: Wiresharkの表示列をカスタマイズする
- Wireshark によるパケット解析講座 2: 脅威インテリジェンス調査に役立つフィルタリング設定
- Wireshark によるパケット解析講座 3: ホストとユーザーを特定する
- Wireshark によるパケット解析講座 4: Pcapからのオブジェクトのエクスポート
- Wireshark によるパケット解析講座 5: Trickbot感染の調査
- Wireshark によるパケット解析講座 6: Ursnif感染の調査
- Wireshark によるパケット解析講座 7: Qakbot感染の調査
- Wireshark によるパケット解析講座 8: HTTPSトラフィックの復号
- Wireshark によるパケット解析講座 9: Dridex感染トラフィックの調査