見出し画像

SMBパケットを調べてみよう

こんにちは、辻村です。何の因果かネットワークを流れるパケットの中身を見ることになったあなたに少しだけ参考になる記事です。この記事は古い記事に手を入れて、最近の情報を少し入れてあります。題名はWindowsのSMBプロトコルについてですが、他のプロトコルでも役に立つはずです。

1. ネットワークを解析するソフトを用意しよう

まずは何よりもネットワークを解析するためのソフトを用意しよう。使うPCは出来るだけメモリがいっぱい積んであって、性能が良いものがいい。できれば画面は広い方がいい。私の場合、MacBook Pro に16GBのメモリが積んであって、画面は26インチの外部モニターを使っている。

もはや定番となったWiresharkは以下のサイトからダウンロードする。
https://www.wireshark.org

2. 本当に調べなければいけないパケットファイルか確認しよう

考えもなく調べはじめると、本当に「干しわらの中に針を探す」ような作業になってしまう。まずは、手元にあるパケットファイルが本当に自分が調べようと思っているものかを確認する必要がある。Wireshark はGUIをつかって解析するツールだが、コマンドもインストールされる。パケットの概要をつかむには、capinfos コマンドを使う。例は私の Mac 上で実行した場合である。

MacBookPro:Downloads hisaotsu$ capinfos ad-join-2019.pcap
File name: ad-join-2019.pcap
File type: Wireshark/tcpdump/... - pcap
File encapsulation: Ethernet
File timestamp precision: microseconds (6)
Packet size limit: file hdr: 262144 bytes
Number of packets: 952
File size: 162 kB
Data size: 147 kB
Capture duration: 21.319135 seconds
First packet time: 2019-04-24 16:01:30.845782
Last packet time: 2019-04-24 16:01:52.164917
Data byte rate: 6,918 bytes/s
Data bit rate: 55 kbps
Average packet size: 154.93 bytes
Average packet rate: 44 packets/s
SHA256: e27f28db2a5b7eb3553e1c6f216bb4425be64e2c2596693e8c5076815ee49a67
RIPEMD160: 75c8b81a8cc6824547743509edc3d1fceb8cf6c1
SHA1: e1e53f66ab361329bff5951cf754c966bb145a2e
Strict time order: True
Number of interfaces in file: 1
Interface #0 info:
Encapsulation = Ethernet (1 - ether)
Capture length = 262144
Time precision = microseconds (6)
Time ticks per second = 1000000
Number of stat entries = 0
Number of packets = 952

注目するべきは、First packet timeとLast packet timeだ。この時間を見て自分の望む範囲の時間帯のパケットかどうかを確認する。

次に、tshark コマンドを使って、通信のリストを作る。IPで通信していることを想定している。ここに調査対象のサーバーなりクライアントなりのIPアドレスがあることを確認する。以下の例では、-Y 'nfs' と指定しているが、NFSプロトコルのパケットの限って通信のリスト(conversation list)を作成している。

$ tshark -r ../snoop-pffff_ibp1-20160127-231549.out -Y 'nfs' -qz conv,ip | head -6
IPv4 Conversations
Filter:<No Filter>
| <- | | -> | | Total | Relative | Duration |
| Frames Bytes | | Frames Bytes | | Frames Bytes | Start | |
192.168.0.2 <-> 192.168.0.1 1223974 28252617360 0 0 1223974

3. SMB のリクエストを見てみよう

3.1 SMB のリクエストの作り

かなりおおざっぱに説明すると、SMB のリクエストは SMB ヘッダーで始まって、コマンド、オプションなどが含まれるバイト文字列が含まれる。面白いことに、「応答 (response) 専用」のパケットはなく、SMB2 CREATE なら SMB2 CREATE のコマンドに「応答である」というフラグがついて返ってくる。細かなフォーマットはマイクロソフトさんのプロトコルのリファレンス(英語版)を見ていただく必要があるが、理屈としては、SMB/SMB2 で絞り込んで、「応答のフラグがついていない」パケットを選べば、コマンドだけ取り出すことができるようになっている。

この法則に従って、SMB2 CREATE (0x5) の含まれるフレームを取り出してみよう。

-bash-4.1$ tshark -tad -r sample.cap -2 -Y 'smb2.cmd == 0x5 &&(smb2.flags.response == 0)' -Tfields -e frame.number
1204
1272
1339
1579
3168
3368
3759
(略)

&& と書くと AND 条件という意味だ。
-2 というフラグはファイルを2パスで評価するという意味だ。ここではあまり意味がないが、あるパケットに応答しているパケットを探すような場合に必要である。1パスの -R というオプションはもう使われないそうなので、-2 -Y と覚えておいても良いかもしれない。

3.2 SMBの応答を付加する

2パスで評価するといったん全てのパケットを見て回るので、前後関係がある値が入ってくる。SMB を Wireshark で読み込むと、あるコマンドに対する応答のフレーム番号を算出してくれる。このフィールドは、smb2.response_in というフィールドに含まれてくる。コマンドと応答のフレーム番号を出すには以下のようなコマンドを実施すれば良い。

-bash-4.1$ tshark -tad -r sample.cap -2 -Y 'smb2.cmd == 0x5 &&(smb2.flags.response == 0)' -Tfields -e frame.number -e smb2.response_in
1204 1214
1272 1281
1339 1344
1579 1586
3168 3177
3368 3377
3759 3769
6959 6965
6972 6976
8414 8419

このリストに、response のパケットの応答をたしてあげれば、どのパケットの要求が失敗しているかがわかる。

他にもかなり柔軟にフィルタが使えたりする。私の使い方としては、Wireshark でおおよその流れをつかんで、tshark で記録に残すという使い方をしている。何らかの参考になれば幸いである。

参考文献



この記事はここまでです。 最後まで読んでいただいてありがとうございます。 気に入っていただいたなら、スキを押していただいたり、 共有していただけるとうれしいです。 コメントや感想大歓迎です!