Wireshark でマルウェアパケットを解析する準備
1.はじめに
マルウェアのパケット解析をする準備として、Palo Alto Networks - Unit42 のBrad Duncan 氏のWireshark チュートリアルを進めた際の備忘録です。
環境
- Wireshark: v3.6.0-1
2.事前準備
言語変更
以下よりJapanese を選択して日本語化します。
"Edit" --> "Preferences" --> "Appearance" --> "Language"
カラム表示のカスタマイズ
Wireshark Tutorial: Changing Your Column Display を参考にカラム表示をカスタマイズし見やすくします。
- No./Protocol/Length カラムの削除
※私はポート番号とプロトコルの組み合わせ忘れるので、"Protocol"カラムは削除せずに都度表示/非表示を切り替えています。 - Source Port/Destination Port カラムの追加
- Time カラムの表示をUTC へ変更
- カスタムカラムとして、Host/Server Name の追加
変更後のカラム
3.使い方の確認
Statics(統計)
パケットの統計を表示する機能です。"統計"タブより複数の統計から種類を選択して確認、保存できます。
使い方
-->キャプチャファイルプロパティ
pcap ファイルの概要を表示します。
-->プロトコル階層
pcap ファイル内すべてのプロトコルのツリーを表示します。
全体に対してのパケット数やバイト数の割合を確認できます。
-->フローグラフ
パケットの流れを視覚的に表示します。
-->入出力グラフ
表示フィルタを適用したパケットI/O の時間変化をグラフ化します。
Display Filter(表示フィルタ)
キャプチャしたパケットを絞り込んで表示する機能です。
例えば「tcp」と指定するとTCP プロトコルのパケットだけを表示してくれます。Wireshark Tutorial: Display Filter Expressions を参考に使い方を確認します。
表示フィルタ
使い方
-->比較演算子
フィルタ値に対して比較演算子を使用できます。
English | Alias | C-like | Description | Example |
---|---|---|---|---|
eq | any_eq | == | Equal(any if more than one) | ip.src == 10.0.0.5 |
ne | all_ne | != | Not equal (all if more than one) | ip.src != 10.0.0.5 |
gt | > | Greater than | frame.len > 10 | |
lt | < | Less than | frame.len < 128 | |
ge | >= | Greater than or equal to | frame.len ge 0x100 | |
le | <= | Less than or equal to | frame.len <= 0x20 | |
contains | Protocol, field or slice contains a value | sip.To contains "a1762" | ||
matches | ~ | Protocol or text field matches a Perl-compatible regular expression | http.host matches "acme\.(org | |
bitwise_and | & | Bitwise AND is non-zero | tcp.flags & 0x02 |
-->フィルタ値の組み合わせ
ブール式を使用して、フィルタ値を組み合わせることができます。
代表的なものを表に記載します。
English | C-like | Description | Example |
---|---|---|---|
and | $$ | Logical AND | http.request && ip.addr == 192.168.10.195 |
or | || | Logical OR | dns.qry.name contains microsoft or dns.qry.name contains windows |
not | ! | Logical NOT | !(ip.addr eq 192.168.10.1) |
-->フィルタリングの例
- Web トラフィックをクイックに確認
http.request or ssl.handshake.type == 1
- TCP SYN flag でフィルタ(マルウェア感染端末の接続試行を確認)
tcp.flags eq 0x0002
- 暗号化されていないSMTP トラフィックの探索
smtp contains "From: "
smtp contains "Message-ID: "
smtp contains "Subject: "
-->フィルタの保存
使用したフィルタを保存することができます。
-
表示フィルタバー右側の「プラス」ボタンを押します。
-
表示されるフィールドを埋めて"OK"ボタンで保存します。
- Label(ラベル)
- Filter(フィルタ)
- Comment(コメント)
ホストとユーザーの識別
Wireshark Tutorial: Identifying Hosts and Users を参考にパケットキャプチャよりマルウェア感染したホストや侵害されたユーザーを特定する方法を確認します。
使い方
-->DHCP トラフィックからのホスト情報探索
dhcp
でフィルタし、"Info"カラムが「DHCP Request」のパケットからMAC アドレスとホスト名の情報をPacket Details ペインより確認します。
-
MAC アドレス:
"Bootstrap Protocol (Request)" --> "Client Identifier" --> "Client MAC address"
-
ホスト名:
"Bootstrap Protocol (Request)" --> "Host Name" --> "Host Name"
-->NetBIOS ネームサービス(NBNS)トラフィックからのホスト情報探索
NBNS は、Windows ネットワーク内の名前解決を行うプロトコルです。
nbns
でフィルタしMAC アドレスとホスト名の情報を確認します。
-->HTTP トラフィックからのデバイスモデルとOS 情報探索
- Windows
HTTP のUser-Agent ヘッダーからOS を識別できる場合があります。
User-agent | Windows モデル |
---|---|
Windows NT 5.1 | Windows XP |
Windows NT 6.0 | Windows Vista |
Windows NT 6.1 | Windows 7 |
Windows NT 6.2 | Windows 8 |
Windows NT 6.3 | Windows 8.1 |
Windows NT 10.0 | Windows 10 |
また、近頃はUser-Agent ではなくUser-Agent Client Hints によるデバイスの識別が推奨されています。Windows 10/11はこの情報を見て識別できます。
Header | Windows 10 | Windows 11 |
---|---|---|
Sec-CH-UA-Platform | Windows | Windows |
Sec-CH-UA-Platform-Version | 1.0.0 ~ 10.0.0 | 13.0.0以上 |
- Android
Android デバイスであればUser-Agent からデバイス製造元とモデルを確認できます。
例えば以下の場合は、Android OS 7.1.2でモデルがLM-X210APM のLG 製スマホです。
User-Agent: Dalvik/2.1.0 (Linux; U; Android 7.1.2; LM-X210APM Build/N2G47H)
- Apple
Apple 製のデバイスはUser-Agent からOS や、iPhone、iPad、iPod などデバイスの種類が判別できます。ただしデバイスのモデルはわかりません。
以下の場合は、デバイスがiPhone でiOS 12.1.3です。
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1
-->Kerberos トラフィックからのWindows ユーザーアカウント情報探索
AD 環境のWindows ホストの場合、Kerberos トラフィックからユーザーアカウント名を見つけることができます。ホスト名のCNameString には末尾に$が含まれるため、フィルタで除外することでユーザーアカウント名でフィルタリングできます。
kerberos.CNameString and !(kerberos.CNameString contains $)
探索する際はCNameString カラムを追加して確認します。
題名 | 種別 | フィールド |
---|---|---|
CNameString | Custom | kerberos.CNameString |
参考:
User-AgentClientヒントを使用してWindows11を検出する
Sec-CH-UA-Platform
Sec-CH-UA-Platform-Version
オブジェクトのエクスポート
Wireshark Tutorial: Exporting Objects from a Pcap を参考にpcap からさまざまなオブジェクトをエクスポートする方法を確認します。
使い方
"ファイル" --> "オブジェクトをエクスポート" --> エクスポート対象プロトコルを選択
HTTP オブジェクトのエクスポート
-
SMB オブジェクトは、「コンテントタイプ」カラムに表示される数字が[100.00%]なければいけません。100%を下回っている場合はファイルの破損や不完全なコピーです。
SMB オブジェクトのエクスポート
-
IMF オブジェクトとしてEML file をエクスポートします。取得したファイルはテキストエディタやEmail クライアントにインポートし確認します。
IMF オブジェクトのエクスポート
-
FTP オブジェクトは「オブジェクトをエクスポート」機能を使用することはできませんが、以下の手順で取得することができます。
1.ftp-data
でフィルタし、FTP のデータ転送のパケットをフィルタリングする。
2. 対象データが含まれるパケットを右クリック --> "追跡" --> "TCP ストリーム"
3. 「...として保存」ボタンを押してファイルを保存する。
FTP オブジェクトのエクスポート
HTTPS トラフィックの復号
pcap ファイルから HTTPS トラフィックを復号する方法を確認します。
使い方
複合していない場合は平文を確認できません。
複合していない場合
複合するにはいずれかを用意する必要があります。
- pre-master-secret log
- RSA secret key
"編集" --> "設定" --> "Protocols" --> "TLS" で対応する鍵をインポートすることで複合して平文のデータを確認できます。
今回はpre-master-secret log セッションキーで複合してみます。
TLS セッションキーをインポート
複合した場合
参考:
TLS
Wireshark Tutorial: Decrypting HTTPS Traffic
【解析/Wireshark】https(SSL/TLS)を復号化する方法(SSLKEYLOGFILE),ブラウザで見る方法
TLS 通信のパケットキャプチャ
4.練習
マルウェア感染端末のパケット解析チュートリアルをこなしてIOC(Indecators of Copromise) を収集する練習を行い経験値を稼ぎます。
解析チュートリアル
Wireshark Tutorial: Examining Trickbot Infections
Wireshark Tutorial: Examining Ursnif Infections
Wireshark Tutorial: Examining Qakbot Infections
Wireshark Tutorial: Examining Dridex Infection Traffic
Wireshark Tutorial: Examining Emotet Infection Traffic
Wireshark Tutorial: Examining Traffic from Hancitor Infections
チュートリアルが完了したら、MALWARE-TRAFFIC-ANALYSIS.NET でTRAFFIC ANALYSIS EXERCISES をこなしていきます。EXERCISES の内容も今後記事を書いていきたいと思います!
Discussion